diff --git a/.gitignore b/.gitignore
index 111576e2..76331ad1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -73,6 +73,13 @@ js/twemoji/16x16/
# JUNK
GET/
+.bash_history
+.cache/
+777/
+R9K/
+WRK/
+a/
+alt/
anime/
b/
b_anime/
@@ -93,11 +100,17 @@ games/
gulag/
hardcopy.1
hobby/
-instance-config.php
+i/
leftypol/
+leftypol_archive/
meta/
overboard/
phpinfo.php
-ref/
+posad/
+restore_b_ass/
+save_ass_thread/
+sfw/
tech/
-tqgit status
+ref/
+ga/
+Test/
diff --git a/auth-proxy.php b/auth-proxy.php
new file mode 100644
index 00000000..47f59318
--- /dev/null
+++ b/auth-proxy.php
@@ -0,0 +1,76 @@
+=5.3.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Lifo\\IP\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jason Morriss",
+ "email": "lifo2013@gmail.com"
+ }
+ ],
+ "description": "IP address helper PHP library for working with IPv4 and IPv6 addresses",
+ "keywords": [
+ "IP",
+ "ip address",
+ "ipv4",
+ "ipv6"
+ ],
+ "support": {
+ "issues": "https://github.com/lifo101/ip/issues",
+ "source": "https://github.com/lifo101/ip/tree/v1.1.1"
+ },
+ "time": "2022-07-12T15:45:54+00:00"
+ },
+ {
+ "name": "mrclay/jsmin-php",
+ "version": "2.4.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/mrclay/jsmin-php.git",
+ "reference": "49feaa85933458c15bb62ae65644bf22d60b7610"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/mrclay/jsmin-php/zipball/49feaa85933458c15bb62ae65644bf22d60b7610",
+ "reference": "49feaa85933458c15bb62ae65644bf22d60b7610",
+ "shasum": ""
+ },
+ "require": {
+ "ext-pcre": "*",
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.36|^9.5.26"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "JSMin\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Stephen Clay",
+ "email": "steve@mrclay.org",
+ "role": "Developer"
+ },
+ {
+ "name": "Ryan Grove",
+ "email": "ryan@wonko.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "Provides a modified port of Douglas Crockford's jsmin.c, which removes unnecessary whitespace from JavaScript files.",
+ "homepage": "https://github.com/mrclay/jsmin-php/",
+ "keywords": [
+ "compress",
+ "jsmin",
+ "minify"
+ ],
+ "support": {
+ "email": "minify@googlegroups.com",
+ "issues": "https://github.com/mrclay/jsmin-php/issues",
+ "source": "https://github.com/mrclay/jsmin-php/tree/2.4.3"
+ },
+ "time": "2022-12-13T20:15:15+00:00"
+ },
+ {
+ "name": "myclabs/deep-copy",
+ "version": "1.11.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/myclabs/DeepCopy.git",
+ "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
+ "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0"
},
- "replace": {
- "myclabs/deep-copy": "self.version"
+ "conflict": {
+ "doctrine/collections": "<1.6.8",
+ "doctrine/common": "<2.13.3 || >=3,<3.2.2"
},
"require-dev": {
- "doctrine/collections": "^1.0",
- "doctrine/common": "^2.6",
- "phpunit/phpunit": "^7.1"
+ "doctrine/collections": "^1.6.8",
+ "doctrine/common": "^2.13.3 || ^3.2.2",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
},
"type": "library",
"autoload": {
- "psr-4": {
- "DeepCopy\\": "src/DeepCopy/"
- },
"files": [
"src/DeepCopy/deep_copy.php"
- ]
+ ],
+ "psr-4": {
+ "DeepCopy\\": "src/DeepCopy/"
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -123,7 +539,7 @@
],
"support": {
"issues": "https://github.com/myclabs/DeepCopy/issues",
- "source": "https://github.com/myclabs/DeepCopy/tree/1.10.2"
+ "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1"
},
"funding": [
{
@@ -131,269 +547,315 @@
"type": "tidelift"
}
],
- "time": "2020-11-13T09:40:50+00:00"
+ "time": "2023-03-08T13:26:56+00:00"
},
{
- "name": "phpdocumentor/reflection-common",
- "version": "2.2.0",
+ "name": "nikic/php-parser",
+ "version": "v4.16.0",
"source": {
"type": "git",
- "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
- "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b"
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "19526a33fb561ef417e822e85f08a00db4059c17"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b",
- "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/19526a33fb561ef417e822e85f08a00db4059c17",
+ "reference": "19526a33fb561ef417e822e85f08a00db4059c17",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": ">=7.0"
+ },
+ "require-dev": {
+ "ircmaxell/php-yacc": "^0.0.7",
+ "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0"
+ },
+ "bin": [
+ "bin/php-parse"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.9-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpParser\\": "lib/PhpParser"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Nikita Popov"
+ }
+ ],
+ "description": "A PHP parser written in PHP",
+ "keywords": [
+ "parser",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/nikic/PHP-Parser/issues",
+ "source": "https://github.com/nikic/PHP-Parser/tree/v4.16.0"
+ },
+ "time": "2023-06-25T14:52:30+00:00"
+ },
+ {
+ "name": "phar-io/manifest",
+ "version": "2.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/manifest.git",
+ "reference": "97803eca37d319dfa7826cc2437fc020857acb53"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53",
+ "reference": "97803eca37d319dfa7826cc2437fc020857acb53",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-phar": "*",
+ "ext-xmlwriter": "*",
+ "phar-io/version": "^3.0.1",
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
+ "support": {
+ "issues": "https://github.com/phar-io/manifest/issues",
+ "source": "https://github.com/phar-io/manifest/tree/2.0.3"
+ },
+ "time": "2021-07-20T11:28:43+00:00"
+ },
+ {
+ "name": "phar-io/version",
+ "version": "3.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/version.git",
+ "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
+ "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
"shasum": ""
},
"require": {
"php": "^7.2 || ^8.0"
},
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-2.x": "2.x-dev"
- }
- },
"autoload": {
- "psr-4": {
- "phpDocumentor\\Reflection\\": "src/"
- }
+ "classmap": [
+ "src/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Jaap van Otterdijk",
- "email": "opensource@ijaap.nl"
- }
- ],
- "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
- "homepage": "http://www.phpdoc.org",
- "keywords": [
- "FQSEN",
- "phpDocumentor",
- "phpdoc",
- "reflection",
- "static analysis"
- ],
- "support": {
- "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues",
- "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x"
- },
- "time": "2020-06-27T09:03:43+00:00"
- },
- {
- "name": "phpdocumentor/reflection-docblock",
- "version": "5.2.2",
- "source": {
- "type": "git",
- "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
- "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/069a785b2141f5bcf49f3e353548dc1cce6df556",
- "reference": "069a785b2141f5bcf49f3e353548dc1cce6df556",
- "shasum": ""
- },
- "require": {
- "ext-filter": "*",
- "php": "^7.2 || ^8.0",
- "phpdocumentor/reflection-common": "^2.2",
- "phpdocumentor/type-resolver": "^1.3",
- "webmozart/assert": "^1.9.1"
- },
- "require-dev": {
- "mockery/mockery": "~1.3.2"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "5.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "phpDocumentor\\Reflection\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Mike van Riel",
- "email": "me@mikevanriel.com"
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
},
{
- "name": "Jaap van Otterdijk",
- "email": "account@ijaap.nl"
- }
- ],
- "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
- "support": {
- "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
- "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/master"
- },
- "time": "2020-09-03T19:13:55+00:00"
- },
- {
- "name": "phpdocumentor/type-resolver",
- "version": "1.4.0",
- "source": {
- "type": "git",
- "url": "https://github.com/phpDocumentor/TypeResolver.git",
- "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0",
- "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0",
- "shasum": ""
- },
- "require": {
- "php": "^7.2 || ^8.0",
- "phpdocumentor/reflection-common": "^2.0"
- },
- "require-dev": {
- "ext-tokenizer": "*"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-1.x": "1.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "phpDocumentor\\Reflection\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Mike van Riel",
- "email": "me@mikevanriel.com"
- }
- ],
- "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names",
- "support": {
- "issues": "https://github.com/phpDocumentor/TypeResolver/issues",
- "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.4.0"
- },
- "time": "2020-09-17T18:55:26+00:00"
- },
- {
- "name": "phpspec/prophecy",
- "version": "v1.10.3",
- "source": {
- "type": "git",
- "url": "https://github.com/phpspec/prophecy.git",
- "reference": "451c3cd1418cf640de218914901e51b064abb093"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/phpspec/prophecy/zipball/451c3cd1418cf640de218914901e51b064abb093",
- "reference": "451c3cd1418cf640de218914901e51b064abb093",
- "shasum": ""
- },
- "require": {
- "doctrine/instantiator": "^1.0.2",
- "php": "^5.3|^7.0",
- "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0",
- "sebastian/comparator": "^1.2.3|^2.0|^3.0|^4.0",
- "sebastian/recursion-context": "^1.0|^2.0|^3.0|^4.0"
- },
- "require-dev": {
- "phpspec/phpspec": "^2.5 || ^3.2",
- "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.10.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Prophecy\\": "src/Prophecy"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Konstantin Kudryashov",
- "email": "ever.zet@gmail.com",
- "homepage": "http://everzet.com"
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
},
{
- "name": "Marcello Duarte",
- "email": "marcello.duarte@gmail.com"
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
}
],
- "description": "Highly opinionated mocking framework for PHP 5.3+",
- "homepage": "https://github.com/phpspec/prophecy",
+ "description": "Library for handling version information and constraints",
+ "support": {
+ "issues": "https://github.com/phar-io/version/issues",
+ "source": "https://github.com/phar-io/version/tree/3.2.1"
+ },
+ "time": "2022-02-21T01:04:05+00:00"
+ },
+ {
+ "name": "php81_bc/strftime",
+ "version": "0.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/alphp/strftime.git",
+ "reference": "4c1b56eaae4bb3f02f994ba47c2e5a225378e62f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/alphp/strftime/zipball/4c1b56eaae4bb3f02f994ba47c2e5a225378e62f",
+ "reference": "4c1b56eaae4bb3f02f994ba47c2e5a225378e62f",
+ "shasum": ""
+ },
+ "require": {
+ "ext-intl": "*",
+ "php": ">=7.1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "@stable"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/php-8.1-strftime.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fernando Herrero",
+ "homepage": "https://github.com/alphp/strftime/graphs/contributors"
+ }
+ ],
+ "description": "Locale-formatted strftime using IntlDateFormatter (PHP 8.1 compatible)",
+ "support": {
+ "issues": "https://github.com/alphp/strftime/issues",
+ "source": "https://github.com/alphp/strftime"
+ },
+ "time": "2022-04-10T22:31:16+00:00"
+ },
+ {
+ "name": "phpmyadmin/twig-i18n-extension",
+ "version": "v4.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpmyadmin/twig-i18n-extension.git",
+ "reference": "c0d0dd171cd1c7733bf152fd44b61055843df052"
+ },
+ "dist": {
+ "type": "zip",
+ "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": [
- "Double",
- "Dummy",
- "fake",
- "mock",
- "spy",
- "stub"
+ "gettext",
+ "i18n"
],
"support": {
- "issues": "https://github.com/phpspec/prophecy/issues",
- "source": "https://github.com/phpspec/prophecy/tree/v1.10.3"
+ "issues": "https://github.com/phpmyadmin/twig-i18n-extension/issues",
+ "source": "https://github.com/phpmyadmin/twig-i18n-extension"
},
- "time": "2020-03-05T15:02:03+00:00"
+ "time": "2021-06-10T15:53:38+00:00"
},
{
"name": "phpunit/php-code-coverage",
- "version": "4.0.8",
+ "version": "10.1.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
- "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d"
+ "reference": "be1fe461fdc917de2a29a452ccf2657d325b443d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ef7b2f56815df854e66ceaee8ebe9393ae36a40d",
- "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/be1fe461fdc917de2a29a452ccf2657d325b443d",
+ "reference": "be1fe461fdc917de2a29a452ccf2657d325b443d",
"shasum": ""
},
"require": {
"ext-dom": "*",
+ "ext-libxml": "*",
"ext-xmlwriter": "*",
- "php": "^5.6 || ^7.0",
- "phpunit/php-file-iterator": "^1.3",
- "phpunit/php-text-template": "^1.2",
- "phpunit/php-token-stream": "^1.4.2 || ^2.0",
- "sebastian/code-unit-reverse-lookup": "^1.0",
- "sebastian/environment": "^1.3.2 || ^2.0",
- "sebastian/version": "^1.0 || ^2.0"
+ "nikic/php-parser": "^4.15",
+ "php": ">=8.1",
+ "phpunit/php-file-iterator": "^4.0",
+ "phpunit/php-text-template": "^3.0",
+ "sebastian/code-unit-reverse-lookup": "^3.0",
+ "sebastian/complexity": "^3.0",
+ "sebastian/environment": "^6.0",
+ "sebastian/lines-of-code": "^2.0",
+ "sebastian/version": "^4.0",
+ "theseer/tokenizer": "^1.2.0"
},
"require-dev": {
- "ext-xdebug": "^2.1.4",
- "phpunit/phpunit": "^5.7"
+ "phpunit/phpunit": "^10.1"
},
"suggest": {
- "ext-xdebug": "^2.5.1"
+ "ext-pcov": "PHP extension that provides line coverage",
+ "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "4.0.x-dev"
+ "dev-main": "10.1-dev"
}
},
"autoload": {
@@ -408,7 +870,7 @@
"authors": [
{
"name": "Sebastian Bergmann",
- "email": "sb@sebastian-bergmann.de",
+ "email": "sebastian@phpunit.de",
"role": "lead"
}
],
@@ -420,33 +882,42 @@
"xunit"
],
"support": {
- "irc": "irc://irc.freenode.net/phpunit",
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
- "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/4.0"
+ "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.3"
},
- "time": "2017-04-02T07:44:40+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-07-26T13:45:28+00:00"
},
{
"name": "phpunit/php-file-iterator",
- "version": "1.4.5",
+ "version": "4.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-file-iterator.git",
- "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4"
+ "reference": "5647d65443818959172645e7ed999217360654b6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4",
- "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/5647d65443818959172645e7ed999217360654b6",
+ "reference": "5647d65443818959172645e7ed999217360654b6",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.4.x-dev"
+ "dev-main": "4.0-dev"
}
},
"autoload": {
@@ -461,7 +932,7 @@
"authors": [
{
"name": "Sebastian Bergmann",
- "email": "sb@sebastian-bergmann.de",
+ "email": "sebastian@phpunit.de",
"role": "lead"
}
],
@@ -472,30 +943,107 @@
"iterator"
],
"support": {
- "irc": "irc://irc.freenode.net/phpunit",
"issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
- "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/1.4.5"
+ "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.0.2"
},
- "time": "2017-11-27T13:52:08+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-05-07T09:13:23+00:00"
},
{
- "name": "phpunit/php-text-template",
- "version": "1.2.1",
+ "name": "phpunit/php-invoker",
+ "version": "4.0.0",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/php-text-template.git",
- "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
+ "url": "https://github.com/sebastianbergmann/php-invoker.git",
+ "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
- "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7",
+ "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "ext-pcntl": "*",
+ "phpunit/phpunit": "^10.0"
+ },
+ "suggest": {
+ "ext-pcntl": "*"
},
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Invoke callables with a timeout",
+ "homepage": "https://github.com/sebastianbergmann/php-invoker/",
+ "keywords": [
+ "process"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-invoker/issues",
+ "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:56:09+00:00"
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "9f3d3709577a527025f55bcf0f7ab8052c8bb37d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/9f3d3709577a527025f55bcf0f7ab8052c8bb37d",
+ "reference": "9f3d3709577a527025f55bcf0f7ab8052c8bb37d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.0-dev"
+ }
+ },
"autoload": {
"classmap": [
"src/"
@@ -519,34 +1067,40 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-text-template/issues",
- "source": "https://github.com/sebastianbergmann/php-text-template/tree/1.2.1"
+ "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.0"
},
- "time": "2015-06-21T13:50:34+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:56:46+00:00"
},
{
"name": "phpunit/php-timer",
- "version": "1.0.9",
+ "version": "6.0.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-timer.git",
- "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f"
+ "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
- "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d",
+ "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d",
"shasum": ""
},
"require": {
- "php": "^5.3.3 || ^7.0"
+ "php": ">=8.1"
},
"require-dev": {
- "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
+ "phpunit/phpunit": "^10.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0-dev"
+ "dev-main": "6.0-dev"
}
},
"autoload": {
@@ -561,7 +1115,7 @@
"authors": [
{
"name": "Sebastian Bergmann",
- "email": "sb@sebastian-bergmann.de",
+ "email": "sebastian@phpunit.de",
"role": "lead"
}
],
@@ -572,76 +1126,28 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-timer/issues",
- "source": "https://github.com/sebastianbergmann/php-timer/tree/master"
+ "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0"
},
- "time": "2017-02-26T11:10:40+00:00"
- },
- {
- "name": "phpunit/php-token-stream",
- "version": "2.0.2",
- "source": {
- "type": "git",
- "url": "https://github.com/sebastianbergmann/php-token-stream.git",
- "reference": "791198a2c6254db10131eecfe8c06670700904db"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/791198a2c6254db10131eecfe8c06670700904db",
- "reference": "791198a2c6254db10131eecfe8c06670700904db",
- "shasum": ""
- },
- "require": {
- "ext-tokenizer": "*",
- "php": "^7.0"
- },
- "require-dev": {
- "phpunit/phpunit": "^6.2.4"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "2.0-dev"
- }
- },
- "autoload": {
- "classmap": [
- "src/"
- ]
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-3-Clause"
- ],
- "authors": [
+ "funding": [
{
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
}
],
- "description": "Wrapper around PHP's tokenizer extension.",
- "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
- "keywords": [
- "tokenizer"
- ],
- "support": {
- "issues": "https://github.com/sebastianbergmann/php-token-stream/issues",
- "source": "https://github.com/sebastianbergmann/php-token-stream/tree/master"
- },
- "abandoned": true,
- "time": "2017-11-27T05:48:46+00:00"
+ "time": "2023-02-03T06:57:52+00:00"
},
{
"name": "phpunit/phpunit",
- "version": "5.7.27",
+ "version": "10.2.7",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c"
+ "reference": "a215d9ee8bac1733796e4ddff3306811f14414e5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c",
- "reference": "b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/a215d9ee8bac1733796e4ddff3306811f14414e5",
+ "reference": "a215d9ee8bac1733796e4ddff3306811f14414e5",
"shasum": ""
},
"require": {
@@ -650,33 +1156,30 @@
"ext-libxml": "*",
"ext-mbstring": "*",
"ext-xml": "*",
- "myclabs/deep-copy": "~1.3",
- "php": "^5.6 || ^7.0",
- "phpspec/prophecy": "^1.6.2",
- "phpunit/php-code-coverage": "^4.0.4",
- "phpunit/php-file-iterator": "~1.4",
- "phpunit/php-text-template": "~1.2",
- "phpunit/php-timer": "^1.0.6",
- "phpunit/phpunit-mock-objects": "^3.2",
- "sebastian/comparator": "^1.2.4",
- "sebastian/diff": "^1.4.3",
- "sebastian/environment": "^1.3.4 || ^2.0",
- "sebastian/exporter": "~2.0",
- "sebastian/global-state": "^1.1",
- "sebastian/object-enumerator": "~2.0",
- "sebastian/resource-operations": "~1.0",
- "sebastian/version": "^1.0.6|^2.0.1",
- "symfony/yaml": "~2.1|~3.0|~4.0"
- },
- "conflict": {
- "phpdocumentor/reflection-docblock": "3.0.2"
- },
- "require-dev": {
- "ext-pdo": "*"
+ "ext-xmlwriter": "*",
+ "myclabs/deep-copy": "^1.10.1",
+ "phar-io/manifest": "^2.0.3",
+ "phar-io/version": "^3.0.2",
+ "php": ">=8.1",
+ "phpunit/php-code-coverage": "^10.1.1",
+ "phpunit/php-file-iterator": "^4.0",
+ "phpunit/php-invoker": "^4.0",
+ "phpunit/php-text-template": "^3.0",
+ "phpunit/php-timer": "^6.0",
+ "sebastian/cli-parser": "^2.0",
+ "sebastian/code-unit": "^2.0",
+ "sebastian/comparator": "^5.0",
+ "sebastian/diff": "^5.0",
+ "sebastian/environment": "^6.0",
+ "sebastian/exporter": "^5.0",
+ "sebastian/global-state": "^6.0.1",
+ "sebastian/object-enumerator": "^5.0",
+ "sebastian/recursion-context": "^5.0",
+ "sebastian/type": "^4.0",
+ "sebastian/version": "^4.0"
},
"suggest": {
- "ext-xdebug": "*",
- "phpunit/php-invoker": "~1.1"
+ "ext-soap": "To be able to generate mocks based on WSDL files"
},
"bin": [
"phpunit"
@@ -684,10 +1187,13 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "5.7.x-dev"
+ "dev-main": "10.2-dev"
}
},
"autoload": {
+ "files": [
+ "src/Framework/Assert/Functions.php"
+ ],
"classmap": [
"src/"
]
@@ -712,43 +1218,434 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues",
- "source": "https://github.com/sebastianbergmann/phpunit/tree/5.7.27"
+ "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/10.2.7"
},
- "time": "2018-02-01T05:50:59+00:00"
+ "funding": [
+ {
+ "url": "https://phpunit.de/sponsors.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-08-02T06:46:08+00:00"
},
{
- "name": "phpunit/phpunit-mock-objects",
- "version": "3.4.4",
+ "name": "psr/http-client",
+ "version": "1.0.2",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
- "reference": "a23b761686d50a560cc56233b9ecf49597cc9118"
+ "url": "https://github.com/php-fig/http-client.git",
+ "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/a23b761686d50a560cc56233b9ecf49597cc9118",
- "reference": "a23b761686d50a560cc56233b9ecf49597cc9118",
+ "url": "https://api.github.com/repos/php-fig/http-client/zipball/0955afe48220520692d2d09f7ab7e0f93ffd6a31",
+ "reference": "0955afe48220520692d2d09f7ab7e0f93ffd6a31",
"shasum": ""
},
"require": {
- "doctrine/instantiator": "^1.0.2",
- "php": "^5.6 || ^7.0",
- "phpunit/php-text-template": "^1.2",
- "sebastian/exporter": "^1.2 || ^2.0"
- },
- "conflict": {
- "phpunit/phpunit": "<5.4.0"
- },
- "require-dev": {
- "phpunit/phpunit": "^5.4"
- },
- "suggest": {
- "ext-soap": "*"
+ "php": "^7.0 || ^8.0",
+ "psr/http-message": "^1.0 || ^2.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.2.x-dev"
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Client\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP clients",
+ "homepage": "https://github.com/php-fig/http-client",
+ "keywords": [
+ "http",
+ "http-client",
+ "psr",
+ "psr-18"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-client/tree/1.0.2"
+ },
+ "time": "2023-04-10T20:12:12+00:00"
+ },
+ {
+ "name": "psr/http-factory",
+ "version": "1.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-factory.git",
+ "reference": "e616d01114759c4c489f93b099585439f795fe35"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-factory/zipball/e616d01114759c4c489f93b099585439f795fe35",
+ "reference": "e616d01114759c4c489f93b099585439f795fe35",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.0.0",
+ "psr/http-message": "^1.0 || ^2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interfaces for PSR-7 HTTP message factories",
+ "keywords": [
+ "factory",
+ "http",
+ "message",
+ "psr",
+ "psr-17",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-factory/tree/1.0.2"
+ },
+ "time": "2023-04-10T20:10:41+00:00"
+ },
+ {
+ "name": "psr/http-message",
+ "version": "2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-message.git",
+ "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71",
+ "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "https://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP messages",
+ "homepage": "https://github.com/php-fig/http-message",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "support": {
+ "source": "https://github.com/php-fig/http-message/tree/2.0"
+ },
+ "time": "2023-04-04T09:54:51+00:00"
+ },
+ {
+ "name": "ralouphie/getallheaders",
+ "version": "3.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ralouphie/getallheaders.git",
+ "reference": "120b605dfeb996808c31b6477290a714d356e822"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
+ "reference": "120b605dfeb996808c31b6477290a714d356e822",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.6"
+ },
+ "require-dev": {
+ "php-coveralls/php-coveralls": "^2.1",
+ "phpunit/phpunit": "^5 || ^6.5"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/getallheaders.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ralph Khattar",
+ "email": "ralph.khattar@gmail.com"
+ }
+ ],
+ "description": "A polyfill for getallheaders.",
+ "support": {
+ "issues": "https://github.com/ralouphie/getallheaders/issues",
+ "source": "https://github.com/ralouphie/getallheaders/tree/develop"
+ },
+ "time": "2019-03-08T08:55:37+00:00"
+ },
+ {
+ "name": "ramsey/collection",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ramsey/collection.git",
+ "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5",
+ "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.1"
+ },
+ "require-dev": {
+ "captainhook/plugin-composer": "^5.3",
+ "ergebnis/composer-normalize": "^2.28.3",
+ "fakerphp/faker": "^1.21",
+ "hamcrest/hamcrest-php": "^2.0",
+ "jangregor/phpstan-prophecy": "^1.0",
+ "mockery/mockery": "^1.5",
+ "php-parallel-lint/php-console-highlighter": "^1.0",
+ "php-parallel-lint/php-parallel-lint": "^1.3",
+ "phpcsstandards/phpcsutils": "^1.0.0-rc1",
+ "phpspec/prophecy-phpunit": "^2.0",
+ "phpstan/extension-installer": "^1.2",
+ "phpstan/phpstan": "^1.9",
+ "phpstan/phpstan-mockery": "^1.1",
+ "phpstan/phpstan-phpunit": "^1.3",
+ "phpunit/phpunit": "^9.5",
+ "psalm/plugin-mockery": "^1.1",
+ "psalm/plugin-phpunit": "^0.18.4",
+ "ramsey/coding-standard": "^2.0.3",
+ "ramsey/conventional-commits": "^1.3",
+ "vimeo/psalm": "^5.4"
+ },
+ "type": "library",
+ "extra": {
+ "captainhook": {
+ "force-install": true
+ },
+ "ramsey/conventional-commits": {
+ "configFile": "conventional-commits.json"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Ramsey\\Collection\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ben Ramsey",
+ "email": "ben@benramsey.com",
+ "homepage": "https://benramsey.com"
+ }
+ ],
+ "description": "A PHP library for representing and manipulating collections.",
+ "keywords": [
+ "array",
+ "collection",
+ "hash",
+ "map",
+ "queue",
+ "set"
+ ],
+ "support": {
+ "issues": "https://github.com/ramsey/collection/issues",
+ "source": "https://github.com/ramsey/collection/tree/2.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/ramsey",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/ramsey/collection",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2022-12-31T21:50:55+00:00"
+ },
+ {
+ "name": "ramsey/uuid",
+ "version": "4.7.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ramsey/uuid.git",
+ "reference": "60a4c63ab724854332900504274f6150ff26d286"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/ramsey/uuid/zipball/60a4c63ab724854332900504274f6150ff26d286",
+ "reference": "60a4c63ab724854332900504274f6150ff26d286",
+ "shasum": ""
+ },
+ "require": {
+ "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11",
+ "ext-json": "*",
+ "php": "^8.0",
+ "ramsey/collection": "^1.2 || ^2.0"
+ },
+ "replace": {
+ "rhumsaa/uuid": "self.version"
+ },
+ "require-dev": {
+ "captainhook/captainhook": "^5.10",
+ "captainhook/plugin-composer": "^5.3",
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
+ "doctrine/annotations": "^1.8",
+ "ergebnis/composer-normalize": "^2.15",
+ "mockery/mockery": "^1.3",
+ "paragonie/random-lib": "^2",
+ "php-mock/php-mock": "^2.2",
+ "php-mock/php-mock-mockery": "^1.3",
+ "php-parallel-lint/php-parallel-lint": "^1.1",
+ "phpbench/phpbench": "^1.0",
+ "phpstan/extension-installer": "^1.1",
+ "phpstan/phpstan": "^1.8",
+ "phpstan/phpstan-mockery": "^1.1",
+ "phpstan/phpstan-phpunit": "^1.1",
+ "phpunit/phpunit": "^8.5 || ^9",
+ "ramsey/composer-repl": "^1.4",
+ "slevomat/coding-standard": "^8.4",
+ "squizlabs/php_codesniffer": "^3.5",
+ "vimeo/psalm": "^4.9"
+ },
+ "suggest": {
+ "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.",
+ "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.",
+ "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.",
+ "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter",
+ "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type."
+ },
+ "type": "library",
+ "extra": {
+ "captainhook": {
+ "force-install": true
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/functions.php"
+ ],
+ "psr-4": {
+ "Ramsey\\Uuid\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).",
+ "keywords": [
+ "guid",
+ "identifier",
+ "uuid"
+ ],
+ "support": {
+ "issues": "https://github.com/ramsey/uuid/issues",
+ "source": "https://github.com/ramsey/uuid/tree/4.7.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/ramsey",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-04-15T23:01:58+00:00"
+ },
+ {
+ "name": "sebastian/cli-parser",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/cli-parser.git",
+ "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/efdc130dbbbb8ef0b545a994fd811725c5282cae",
+ "reference": "efdc130dbbbb8ef0b545a994fd811725c5282cae",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "2.0-dev"
}
},
"autoload": {
@@ -763,48 +1660,104 @@
"authors": [
{
"name": "Sebastian Bergmann",
- "email": "sb@sebastian-bergmann.de",
+ "email": "sebastian@phpunit.de",
"role": "lead"
}
],
- "description": "Mock Object library for PHPUnit",
- "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
- "keywords": [
- "mock",
- "xunit"
- ],
+ "description": "Library for parsing CLI options",
+ "homepage": "https://github.com/sebastianbergmann/cli-parser",
"support": {
- "irc": "irc://irc.freenode.net/phpunit",
- "issues": "https://github.com/sebastianbergmann/phpunit-mock-objects/issues",
- "source": "https://github.com/sebastianbergmann/phpunit-mock-objects/tree/3.4"
+ "issues": "https://github.com/sebastianbergmann/cli-parser/issues",
+ "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.0"
},
- "abandoned": true,
- "time": "2017-06-30T09:13:00+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:58:15+00:00"
},
{
- "name": "sebastian/code-unit-reverse-lookup",
- "version": "1.0.2",
+ "name": "sebastian/code-unit",
+ "version": "2.0.0",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
- "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619"
+ "url": "https://github.com/sebastianbergmann/code-unit.git",
+ "reference": "a81fee9eef0b7a76af11d121767abc44c104e503"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/1de8cd5c010cb153fcd68b8d0f64606f523f7619",
- "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503",
+ "reference": "a81fee9eef0b7a76af11d121767abc44c104e503",
"shasum": ""
},
"require": {
- "php": ">=5.6"
+ "php": ">=8.1"
},
"require-dev": {
- "phpunit/phpunit": "^8.5"
+ "phpunit/phpunit": "^10.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0.x-dev"
+ "dev-main": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Collection of value objects that represent the PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/code-unit",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/code-unit/issues",
+ "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:58:43+00:00"
+ },
+ {
+ "name": "sebastian/code-unit-reverse-lookup",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+ "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d",
+ "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.0-dev"
}
},
"autoload": {
@@ -826,7 +1779,7 @@
"homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
"support": {
"issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
- "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/1.0.2"
+ "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0"
},
"funding": [
{
@@ -834,34 +1787,36 @@
"type": "github"
}
],
- "time": "2020-11-30T08:15:22+00:00"
+ "time": "2023-02-03T06:59:15+00:00"
},
{
"name": "sebastian/comparator",
- "version": "1.2.4",
+ "version": "5.0.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/comparator.git",
- "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be"
+ "reference": "72f01e6586e0caf6af81297897bd112eb7e9627c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
- "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/72f01e6586e0caf6af81297897bd112eb7e9627c",
+ "reference": "72f01e6586e0caf6af81297897bd112eb7e9627c",
"shasum": ""
},
"require": {
- "php": ">=5.3.3",
- "sebastian/diff": "~1.2",
- "sebastian/exporter": "~1.2 || ~2.0"
+ "ext-dom": "*",
+ "ext-mbstring": "*",
+ "php": ">=8.1",
+ "sebastian/diff": "^5.0",
+ "sebastian/exporter": "^5.0"
},
"require-dev": {
- "phpunit/phpunit": "~4.4"
+ "phpunit/phpunit": "^10.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.2.x-dev"
+ "dev-main": "5.0-dev"
}
},
"autoload": {
@@ -874,6 +1829,10 @@
"BSD-3-Clause"
],
"authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
{
"name": "Jeff Welch",
"email": "whatthejeff@gmail.com"
@@ -885,14 +1844,10 @@
{
"name": "Bernhard Schussek",
"email": "bschussek@2bepublished.at"
- },
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
}
],
"description": "Provides the functionality to compare PHP values for equality",
- "homepage": "http://www.github.com/sebastianbergmann/comparator",
+ "homepage": "https://github.com/sebastianbergmann/comparator",
"keywords": [
"comparator",
"compare",
@@ -900,34 +1855,41 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/comparator/issues",
- "source": "https://github.com/sebastianbergmann/comparator/tree/1.2"
+ "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.0"
},
- "time": "2017-01-29T09:50:25+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T07:07:16+00:00"
},
{
- "name": "sebastian/diff",
- "version": "1.4.3",
+ "name": "sebastian/complexity",
+ "version": "3.0.0",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/diff.git",
- "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4"
+ "url": "https://github.com/sebastianbergmann/complexity.git",
+ "reference": "e67d240970c9dc7ea7b2123a6d520e334dd61dc6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4",
- "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4",
+ "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/e67d240970c9dc7ea7b2123a6d520e334dd61dc6",
+ "reference": "e67d240970c9dc7ea7b2123a6d520e334dd61dc6",
"shasum": ""
},
"require": {
- "php": "^5.3.3 || ^7.0"
+ "nikic/php-parser": "^4.10",
+ "php": ">=8.1"
},
"require-dev": {
- "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
+ "phpunit/phpunit": "^10.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.4-dev"
+ "dev-main": "3.0-dev"
}
},
"autoload": {
@@ -941,49 +1903,119 @@
],
"authors": [
{
- "name": "Kore Nordmann",
- "email": "mail@kore-nordmann.de"
- },
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for calculating the complexity of PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/complexity",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/complexity/issues",
+ "source": "https://github.com/sebastianbergmann/complexity/tree/3.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T06:59:47+00:00"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "5.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/912dc2fbe3e3c1e7873313cc801b100b6c68c87b",
+ "reference": "912dc2fbe3e3c1e7873313cc801b100b6c68c87b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0",
+ "symfony/process": "^4.2 || ^5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
}
],
"description": "Diff implementation",
"homepage": "https://github.com/sebastianbergmann/diff",
"keywords": [
- "diff"
+ "diff",
+ "udiff",
+ "unidiff",
+ "unified diff"
],
"support": {
"issues": "https://github.com/sebastianbergmann/diff/issues",
- "source": "https://github.com/sebastianbergmann/diff/tree/1.4"
+ "security": "https://github.com/sebastianbergmann/diff/security/policy",
+ "source": "https://github.com/sebastianbergmann/diff/tree/5.0.3"
},
- "time": "2017-05-22T07:24:03+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-05-01T07:48:21+00:00"
},
{
"name": "sebastian/environment",
- "version": "2.0.0",
+ "version": "6.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/environment.git",
- "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac"
+ "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac",
- "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/43c751b41d74f96cbbd4e07b7aec9675651e2951",
+ "reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951",
"shasum": ""
},
"require": {
- "php": "^5.6 || ^7.0"
+ "php": ">=8.1"
},
"require-dev": {
- "phpunit/phpunit": "^5.0"
+ "phpunit/phpunit": "^10.0"
+ },
+ "suggest": {
+ "ext-posix": "*"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.0.x-dev"
+ "dev-main": "6.0-dev"
}
},
"autoload": {
@@ -1002,7 +2034,7 @@
}
],
"description": "Provides functionality to handle HHVM/PHP environments",
- "homepage": "http://www.github.com/sebastianbergmann/environment",
+ "homepage": "https://github.com/sebastianbergmann/environment",
"keywords": [
"Xdebug",
"environment",
@@ -1010,36 +2042,43 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/environment/issues",
- "source": "https://github.com/sebastianbergmann/environment/tree/master"
+ "security": "https://github.com/sebastianbergmann/environment/security/policy",
+ "source": "https://github.com/sebastianbergmann/environment/tree/6.0.1"
},
- "time": "2016-11-26T07:53:53+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-04-11T05:39:26+00:00"
},
{
"name": "sebastian/exporter",
- "version": "2.0.0",
+ "version": "5.0.0",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/exporter.git",
- "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4"
+ "reference": "f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4",
- "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0",
+ "reference": "f3ec4bf931c0b31e5b413f5b4fc970a7d03338c0",
"shasum": ""
},
"require": {
- "php": ">=5.3.3",
- "sebastian/recursion-context": "~2.0"
+ "ext-mbstring": "*",
+ "php": ">=8.1",
+ "sebastian/recursion-context": "^5.0"
},
"require-dev": {
- "ext-mbstring": "*",
- "phpunit/phpunit": "~4.4"
+ "phpunit/phpunit": "^10.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.0.x-dev"
+ "dev-main": "5.0-dev"
}
},
"autoload": {
@@ -1052,6 +2091,10 @@
"BSD-3-Clause"
],
"authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
{
"name": "Jeff Welch",
"email": "whatthejeff@gmail.com"
@@ -1060,58 +2103,60 @@
"name": "Volker Dusch",
"email": "github@wallbash.com"
},
- {
- "name": "Bernhard Schussek",
- "email": "bschussek@2bepublished.at"
- },
- {
- "name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
- },
{
"name": "Adam Harvey",
"email": "aharvey@php.net"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
}
],
"description": "Provides the functionality to export PHP variables for visualization",
- "homepage": "http://www.github.com/sebastianbergmann/exporter",
+ "homepage": "https://www.github.com/sebastianbergmann/exporter",
"keywords": [
"export",
"exporter"
],
"support": {
"issues": "https://github.com/sebastianbergmann/exporter/issues",
- "source": "https://github.com/sebastianbergmann/exporter/tree/master"
+ "source": "https://github.com/sebastianbergmann/exporter/tree/5.0.0"
},
- "time": "2016-11-19T08:54:04+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T07:06:49+00:00"
},
{
"name": "sebastian/global-state",
- "version": "1.1.1",
+ "version": "6.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/global-state.git",
- "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4"
+ "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4",
- "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/7ea9ead78f6d380d2a667864c132c2f7b83055e4",
+ "reference": "7ea9ead78f6d380d2a667864c132c2f7b83055e4",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "php": ">=8.1",
+ "sebastian/object-reflector": "^3.0",
+ "sebastian/recursion-context": "^5.0"
},
"require-dev": {
- "phpunit/phpunit": "~4.2"
- },
- "suggest": {
- "ext-uopz": "*"
+ "ext-dom": "*",
+ "phpunit/phpunit": "^10.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0-dev"
+ "dev-main": "6.0-dev"
}
},
"autoload": {
@@ -1136,35 +2181,100 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/global-state/issues",
- "source": "https://github.com/sebastianbergmann/global-state/tree/1.1.1"
+ "security": "https://github.com/sebastianbergmann/global-state/security/policy",
+ "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.1"
},
- "time": "2015-10-12T03:26:01+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-07-19T07:19:23+00:00"
},
{
- "name": "sebastian/object-enumerator",
- "version": "2.0.1",
+ "name": "sebastian/lines-of-code",
+ "version": "2.0.0",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/object-enumerator.git",
- "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7"
+ "url": "https://github.com/sebastianbergmann/lines-of-code.git",
+ "reference": "17c4d940ecafb3d15d2cf916f4108f664e28b130"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1311872ac850040a79c3c058bea3e22d0f09cbb7",
- "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7",
+ "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/17c4d940ecafb3d15d2cf916f4108f664e28b130",
+ "reference": "17c4d940ecafb3d15d2cf916f4108f664e28b130",
"shasum": ""
},
"require": {
- "php": ">=5.6",
- "sebastian/recursion-context": "~2.0"
+ "nikic/php-parser": "^4.10",
+ "php": ">=8.1"
},
"require-dev": {
- "phpunit/phpunit": "~5"
+ "phpunit/phpunit": "^10.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.0.x-dev"
+ "dev-main": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for counting the lines of code in PHP source code",
+ "homepage": "https://github.com/sebastianbergmann/lines-of-code",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
+ "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T07:08:02+00:00"
+ },
+ {
+ "name": "sebastian/object-enumerator",
+ "version": "5.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+ "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906",
+ "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1",
+ "sebastian/object-reflector": "^3.0",
+ "sebastian/recursion-context": "^5.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "5.0-dev"
}
},
"autoload": {
@@ -1186,34 +2296,40 @@
"homepage": "https://github.com/sebastianbergmann/object-enumerator/",
"support": {
"issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
- "source": "https://github.com/sebastianbergmann/object-enumerator/tree/master"
+ "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0"
},
- "time": "2017-02-18T15:18:39+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T07:08:32+00:00"
},
{
- "name": "sebastian/recursion-context",
- "version": "2.0.0",
+ "name": "sebastian/object-reflector",
+ "version": "3.0.0",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/recursion-context.git",
- "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a"
+ "url": "https://github.com/sebastianbergmann/object-reflector.git",
+ "reference": "24ed13d98130f0e7122df55d06c5c4942a577957"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/2c3ba150cbec723aa057506e73a8d33bdb286c9a",
- "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957",
+ "reference": "24ed13d98130f0e7122df55d06c5c4942a577957",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "php": ">=8.1"
},
"require-dev": {
- "phpunit/phpunit": "~4.4"
+ "phpunit/phpunit": "^10.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.0.x-dev"
+ "dev-main": "3.0-dev"
}
},
"autoload": {
@@ -1227,47 +2343,111 @@
],
"authors": [
{
- "name": "Jeff Welch",
- "email": "whatthejeff@gmail.com"
- },
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Allows reflection of object attributes, including inherited and non-public ones",
+ "homepage": "https://github.com/sebastianbergmann/object-reflector/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/object-reflector/issues",
+ "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T07:06:18+00:00"
+ },
+ {
+ "name": "sebastian/recursion-context",
+ "version": "5.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "05909fb5bc7df4c52992396d0116aed689f93712"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712",
+ "reference": "05909fb5bc7df4c52992396d0116aed689f93712",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
{
"name": "Sebastian Bergmann",
"email": "sebastian@phpunit.de"
},
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
{
"name": "Adam Harvey",
"email": "aharvey@php.net"
}
],
"description": "Provides functionality to recursively process PHP variables",
- "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
+ "homepage": "https://github.com/sebastianbergmann/recursion-context",
"support": {
"issues": "https://github.com/sebastianbergmann/recursion-context/issues",
- "source": "https://github.com/sebastianbergmann/recursion-context/tree/master"
+ "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0"
},
- "time": "2016-11-19T07:33:16+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T07:05:40+00:00"
},
{
- "name": "sebastian/resource-operations",
- "version": "1.0.0",
+ "name": "sebastian/type",
+ "version": "4.0.0",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/resource-operations.git",
- "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52"
+ "url": "https://github.com/sebastianbergmann/type.git",
+ "reference": "462699a16464c3944eefc02ebdd77882bd3925bf"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
- "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
+ "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf",
+ "reference": "462699a16464c3944eefc02ebdd77882bd3925bf",
"shasum": ""
},
"require": {
- "php": ">=5.6.0"
+ "php": ">=8.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^10.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0.x-dev"
+ "dev-main": "4.0-dev"
}
},
"autoload": {
@@ -1282,38 +2462,45 @@
"authors": [
{
"name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
}
],
- "description": "Provides a list of PHP built-in functions that operate on resources",
- "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
+ "description": "Collection of value objects that represent the types of the PHP type system",
+ "homepage": "https://github.com/sebastianbergmann/type",
"support": {
- "issues": "https://github.com/sebastianbergmann/resource-operations/issues",
- "source": "https://github.com/sebastianbergmann/resource-operations/tree/master"
+ "issues": "https://github.com/sebastianbergmann/type/issues",
+ "source": "https://github.com/sebastianbergmann/type/tree/4.0.0"
},
- "time": "2015-07-28T20:34:47+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-03T07:10:45+00:00"
},
{
"name": "sebastian/version",
- "version": "2.0.1",
+ "version": "4.0.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/version.git",
- "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019"
+ "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019",
- "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17",
+ "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17",
"shasum": ""
},
"require": {
- "php": ">=5.6"
+ "php": ">=8.1"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.0.x-dev"
+ "dev-main": "4.0-dev"
}
},
"autoload": {
@@ -1336,34 +2523,110 @@
"homepage": "https://github.com/sebastianbergmann/version",
"support": {
"issues": "https://github.com/sebastianbergmann/version/issues",
- "source": "https://github.com/sebastianbergmann/version/tree/master"
+ "source": "https://github.com/sebastianbergmann/version/tree/4.0.1"
},
- "time": "2016-10-03T07:35:21+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-02-07T11:34:05+00:00"
},
{
- "name": "symfony/polyfill-ctype",
- "version": "v1.20.0",
+ "name": "symfony/deprecation-contracts",
+ "version": "v3.3.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/polyfill-ctype.git",
- "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41"
+ "url": "https://github.com/symfony/deprecation-contracts.git",
+ "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/f4ba089a5b6366e453971d3aad5fe8e897b37f41",
- "reference": "f4ba089a5b6366e453971d3aad5fe8e897b37f41",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/7c3aff79d10325257a001fcf92d991f24fc967cf",
+ "reference": "7c3aff79d10325257a001fcf92d991f24fc967cf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "3.4-dev"
+ },
+ "thanks": {
+ "name": "symfony/contracts",
+ "url": "https://github.com/symfony/contracts"
+ }
+ },
+ "autoload": {
+ "files": [
+ "function.php"
+ ]
+ },
+ "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": "A generic function and convention to trigger deprecation notices",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v3.3.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": "2023-05-23T14:45:45+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.20-dev"
+ "dev-main": "1.27-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -1371,12 +2634,12 @@
}
},
"autoload": {
- "psr-4": {
- "Symfony\\Polyfill\\Ctype\\": ""
- },
"files": [
"bootstrap.php"
- ]
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Ctype\\": ""
+ }
},
"notification-url": "https://packagist.org/downloads/",
"license": [
@@ -1401,7 +2664,7 @@
"portable"
],
"support": {
- "source": "https://github.com/symfony/polyfill-ctype/tree/v1.20.0"
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.27.0"
},
"funding": [
{
@@ -1417,43 +2680,48 @@
"type": "tidelift"
}
],
- "time": "2020-10-23T14:02:19+00:00"
+ "time": "2022-11-03T14:55:06+00:00"
},
{
- "name": "symfony/yaml",
- "version": "v4.4.18",
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.27.0",
"source": {
"type": "git",
- "url": "https://github.com/symfony/yaml.git",
- "reference": "bbce94f14d73732340740366fcbe63363663a403"
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/yaml/zipball/bbce94f14d73732340740366fcbe63363663a403",
- "reference": "bbce94f14d73732340740366fcbe63363663a403",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
+ "reference": "8ad114f6b39e2c98a8b0e3bd907732c207c2b534",
"shasum": ""
},
"require": {
- "php": ">=7.1.3",
- "symfony/polyfill-ctype": "~1.8"
+ "php": ">=7.1"
},
- "conflict": {
- "symfony/console": "<3.4"
- },
- "require-dev": {
- "symfony/console": "^3.4|^4.0|^5.0"
+ "provide": {
+ "ext-mbstring": "*"
},
"suggest": {
- "symfony/console": "For validating YAML files using the lint command"
+ "ext-mbstring": "For best performance"
},
"type": "library",
- "autoload": {
- "psr-4": {
- "Symfony\\Component\\Yaml\\": ""
+ "extra": {
+ "branch-alias": {
+ "dev-main": "1.27-dev"
},
- "exclude-from-classmap": [
- "/Tests/"
- ]
+ "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": [
@@ -1461,18 +2729,25 @@
],
"authors": [
{
- "name": "Fabien Potencier",
- "email": "fabien@symfony.com"
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
- "description": "Symfony Yaml Component",
+ "description": "Symfony polyfill for the Mbstring extension",
"homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
"support": {
- "source": "https://github.com/symfony/yaml/tree/v4.4.18"
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.27.0"
},
"funding": [
{
@@ -1488,60 +2763,128 @@
"type": "tidelift"
}
],
- "time": "2020-12-08T16:59:59+00:00"
+ "time": "2022-11-03T14:55:06+00:00"
},
{
- "name": "webmozart/assert",
- "version": "1.9.1",
+ "name": "theseer/tokenizer",
+ "version": "1.2.1",
"source": {
"type": "git",
- "url": "https://github.com/webmozart/assert.git",
- "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389"
+ "url": "https://github.com/theseer/tokenizer.git",
+ "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/webmozart/assert/zipball/bafc69caeb4d49c39fd0779086c03a3738cbb389",
- "reference": "bafc69caeb4d49c39fd0779086c03a3738cbb389",
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e",
+ "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e",
"shasum": ""
},
"require": {
- "php": "^5.3.3 || ^7.0 || ^8.0",
- "symfony/polyfill-ctype": "^1.8"
+ "ext-dom": "*",
+ "ext-tokenizer": "*",
+ "ext-xmlwriter": "*",
+ "php": "^7.2 || ^8.0"
},
- "conflict": {
- "phpstan/phpstan": "<0.12.20",
- "vimeo/psalm": "<3.9.1"
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
+ "support": {
+ "issues": "https://github.com/theseer/tokenizer/issues",
+ "source": "https://github.com/theseer/tokenizer/tree/1.2.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/theseer",
+ "type": "github"
+ }
+ ],
+ "time": "2021-07-28T10:34:58+00:00"
+ },
+ {
+ "name": "twig/twig",
+ "version": "v3.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/twigphp/Twig.git",
+ "reference": "5cf942bbab3df42afa918caeba947f1b690af64b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/twigphp/Twig/zipball/5cf942bbab3df42afa918caeba947f1b690af64b",
+ "reference": "5cf942bbab3df42afa918caeba947f1b690af64b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2.5",
+ "symfony/polyfill-ctype": "^1.8",
+ "symfony/polyfill-mbstring": "^1.3"
},
"require-dev": {
- "phpunit/phpunit": "^4.8.36 || ^7.5.13"
+ "psr/container": "^1.0|^2.0",
+ "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0"
},
"type": "library",
"autoload": {
"psr-4": {
- "Webmozart\\Assert\\": "src/"
+ "Twig\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
- "MIT"
+ "BSD-3-Clause"
],
"authors": [
{
- "name": "Bernhard Schussek",
- "email": "bschussek@gmail.com"
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com",
+ "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"
}
],
- "description": "Assertions to validate method input/output with nice error messages.",
+ "description": "Twig, the flexible, fast, and secure template language for PHP",
+ "homepage": "https://twig.symfony.com",
"keywords": [
- "assert",
- "check",
- "validate"
+ "templating"
],
"support": {
- "issues": "https://github.com/webmozart/assert/issues",
- "source": "https://github.com/webmozart/assert/tree/master"
+ "issues": "https://github.com/twigphp/Twig/issues",
+ "source": "https://github.com/twigphp/Twig/tree/v3.7.0"
},
- "time": "2020-07-08T17:02:28+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/twig/twig",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2023-07-26T07:16:09+00:00"
}
],
"packages-dev": [],
@@ -1552,5 +2895,5 @@
"prefer-lowest": false,
"platform": [],
"platform-dev": [],
- "plugin-api-version": "2.0.0"
+ "plugin-api-version": "2.3.0"
}
diff --git a/inc/anti-bot.php b/inc/anti-bot.php
index b6be5e60..7625c4cc 100644
--- a/inc/anti-bot.php
+++ b/inc/anti-bot.php
@@ -11,12 +11,28 @@ $hidden_inputs_twig = array();
$logfile = "/tmp/lainchan_err.out";
function print_err($s) {
- // global $logfile;
- // file_put_contents($logfile, $s . "\n", FILE_APPEND);
+ global $logfile;
+ file_put_contents($logfile, $s . "\n", FILE_APPEND);
}
-function print_err2($s) {
- print_err($s);
+function getStackTraceAsString() {
+ $stackTrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
+
+ $traceString = '';
+ foreach ($stackTrace as $index => $entry) {
+ if ($index > 0) {
+ $traceString .= sprintf(
+ "#%d %s(%d): %s%s",
+ $index - 1,
+ isset($entry['file']) ? $entry['file'] : 'unknown',
+ isset($entry['line']) ? $entry['line'] : 0,
+ isset($entry['class']) ? $entry['class'] . $entry['type'] . $entry['function'] : $entry['function'],
+ PHP_EOL
+ );
+ }
+ }
+
+ return $traceString;
}
print_err("\n\nSTART\n\n");
@@ -136,7 +152,7 @@ class AntiBot {
$html = '';
if ($count === false) {
- $count = mt_rand(1, abs(count($this->inputs) / 15) + 1);
+ $count = mt_rand(1, round(abs(count($this->inputs) / 15)) + 1);
}
if ($count === true) {
@@ -265,7 +281,6 @@ function checkSpam(array $extra_salt = array()) {
// Iterate through each input
foreach ($inputs as $name => $value) {
- print_err("-> " . $name . ' : ' . $value);
$_hash .= $name . '=' . $value;
}
@@ -276,7 +291,6 @@ function checkSpam(array $extra_salt = array()) {
$_hash = sha1($_hash . $extra_salt);
if ($hash != $_hash) {
- print_err("Hash mismatch");
return true;
}
diff --git a/inc/bans.php b/inc/bans.php
index 81e38006..eb450210 100644
--- a/inc/bans.php
+++ b/inc/bans.php
@@ -1,320 +1,321 @@
getRange();
-
- return array(inet_pton($range[0]), inet_pton($range[1]));
- }
-
- public static function parse_time($str) {
- if (empty($str))
- return false;
-
- if (($time = @strtotime($str)) !== false)
- return $time;
-
- if (!preg_match('/^((\d+)\s?ye?a?r?s?)?\s?+((\d+)\s?mon?t?h?s?)?\s?+((\d+)\s?we?e?k?s?)?\s?+((\d+)\s?da?y?s?)?((\d+)\s?ho?u?r?s?)?\s?+((\d+)\s?mi?n?u?t?e?s?)?\s?+((\d+)\s?se?c?o?n?d?s?)?$/', $str, $matches))
- return false;
-
- $expire = 0;
-
- if (isset($matches[2])) {
- // Years
- $expire += (int)$matches[2]*60*60*24*365;
- }
- if (isset($matches[4])) {
- // Months
- $expire += (int)$matches[4]*60*60*24*30;
- }
- if (isset($matches[6])) {
- // Weeks
- $expire += (int)$matches[6]*60*60*24*7;
- }
- if (isset($matches[8])) {
- // Days
- $expire += (int)$matches[8]*60*60*24;
- }
- if (isset($matches[10])) {
- // Hours
- $expire += (int)$matches[10]*60*60;
- }
- if (isset($matches[12])) {
- // Minutes
- $expire += (int)$matches[12]*60;
- }
- if (isset($matches[14])) {
- // Seconds
- $expire += (int)$matches[14];
- }
-
- return time() + $expire;
- }
-
- static public function parse_range($mask) {
- $ipstart = false;
- $ipend = false;
-
- if (preg_match('@^(\d{1,3}\.){1,3}([\d*]{1,3})?$@', $mask) && substr_count($mask, '*') == 1) {
- // IPv4 wildcard mask
- $parts = explode('.', $mask);
- $ipv4 = '';
- foreach ($parts as $part) {
- if ($part == '*') {
- $ipstart = inet_pton($ipv4 . '0' . str_repeat('.0', 3 - substr_count($ipv4, '.')));
- $ipend = inet_pton($ipv4 . '255' . str_repeat('.255', 3 - substr_count($ipv4, '.')));
- break;
- } elseif(($wc = strpos($part, '*')) !== false) {
- $ipstart = inet_pton($ipv4 . substr($part, 0, $wc) . '0' . str_repeat('.0', 3 - substr_count($ipv4, '.')));
- $ipend = inet_pton($ipv4 . substr($part, 0, $wc) . '9' . str_repeat('.255', 3 - substr_count($ipv4, '.')));
- break;
- }
- $ipv4 .= "$part.";
- }
- } elseif (preg_match('@^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/\d+$@', $mask)) {
- list($ipv4, $bits) = explode('/', $mask);
- if ($bits > 32)
- return false;
-
- list($ipstart, $ipend) = self::calc_cidr($mask);
- } elseif (preg_match('@^[:a-z\d]+/\d+$@i', $mask)) {
- list($ipv6, $bits) = explode('/', $mask);
- if ($bits > 128)
- return false;
-
- list($ipstart, $ipend) = self::calc_cidr($mask);
- } else {
- if (($ipstart = @inet_pton($mask)) === false)
- return false;
- }
-
- return array($ipstart, $ipend);
- }
-
- static public function find($ip, $board = false, $get_mod_info = false) {
- global $config;
-
- $query = prepare('SELECT ``bans``.*' . ($get_mod_info ? ', `username`' : '') . ' FROM ``bans``
- ' . ($get_mod_info ? 'LEFT JOIN ``mods`` ON ``mods``.`id` = `creator`' : '') . '
- WHERE
- (' . ($board !== false ? '(`board` IS NULL OR `board` = :board) AND' : '') . '
- (`ipstart` = :ip OR (:ip >= `ipstart` AND :ip <= `ipend`)))
- ORDER BY `expires` IS NULL, `expires` DESC');
-
- if ($board !== false)
- $query->bindValue(':board', $board, PDO::PARAM_STR);
-
- $query->bindValue(':ip', inet_pton($ip));
- $query->execute() or error(db_error($query));
-
- $ban_list = array();
-
- while ($ban = $query->fetch(PDO::FETCH_ASSOC)) {
- if ($ban['expires'] && ($ban['seen'] || !$config['require_ban_view']) && $ban['expires'] < time()) {
- self::delete($ban['id']);
- } else {
- if ($ban['post'])
- $ban['post'] = json_decode($ban['post'], true);
- $ban['mask'] = self::range_to_string(array($ban['ipstart'], $ban['ipend']));
- $ban_list[] = $ban;
- }
- }
-
- return $ban_list;
- }
+ static public function range_to_string($mask) {
+ list($ipstart, $ipend) = $mask;
+
+ if (!isset($ipend) || $ipend === false) {
+ // Not a range. Single IP address.
+ $ipstr = inet_ntop($ipstart);
+ return $ipstr;
+ }
+
+ if (strlen($ipstart) != strlen($ipend))
+ return '???'; // What the fuck are you doing, son?
+
+ $range = CIDR::range_to_cidr(inet_ntop($ipstart), inet_ntop($ipend));
+ if ($range !== false)
+ return $range;
+
+ return '???';
+ }
+
+ private static function calc_cidr($mask) {
+ $cidr = new CIDR($mask);
+ $range = $cidr->getRange();
+
+ return array(inet_pton($range[0]), inet_pton($range[1]));
+ }
+
+ public static function parse_time($str) {
+ if (empty($str))
+ return false;
+
+ if (($time = @strtotime($str)) !== false)
+ return $time;
+
+ if (!preg_match('/^((\d+)\s?ye?a?r?s?)?\s?+((\d+)\s?mon?t?h?s?)?\s?+((\d+)\s?we?e?k?s?)?\s?+((\d+)\s?da?y?s?)?((\d+)\s?ho?u?r?s?)?\s?+((\d+)\s?mi?n?u?t?e?s?)?\s?+((\d+)\s?se?c?o?n?d?s?)?$/', $str, $matches))
+ return false;
+
+ $expire = 0;
+
+ if (isset($matches[2])) {
+ // Years
+ $expire += (int)$matches[2]*60*60*24*365;
+ }
+ if (isset($matches[4])) {
+ // Months
+ $expire += (int)$matches[4]*60*60*24*30;
+ }
+ if (isset($matches[6])) {
+ // Weeks
+ $expire += (int)$matches[6]*60*60*24*7;
+ }
+ if (isset($matches[8])) {
+ // Days
+ $expire += (int)$matches[8]*60*60*24;
+ }
+ if (isset($matches[10])) {
+ // Hours
+ $expire += (int)$matches[10]*60*60;
+ }
+ if (isset($matches[12])) {
+ // Minutes
+ $expire += (int)$matches[12]*60;
+ }
+ if (isset($matches[14])) {
+ // Seconds
+ $expire += (int)$matches[14];
+ }
+
+ return time() + $expire;
+ }
+
+ static public function parse_range($mask) {
+ $ipstart = false;
+ $ipend = false;
+
+ if (preg_match('@^(\d{1,3}\.){1,3}([\d*]{1,3})?$@', $mask) && substr_count($mask, '*') == 1) {
+ // IPv4 wildcard mask
+ $parts = explode('.', $mask);
+ $ipv4 = '';
+ foreach ($parts as $part) {
+ if ($part == '*') {
+ $ipstart = inet_pton($ipv4 . '0' . str_repeat('.0', 3 - substr_count($ipv4, '.')));
+ $ipend = inet_pton($ipv4 . '255' . str_repeat('.255', 3 - substr_count($ipv4, '.')));
+ break;
+ } elseif(($wc = strpos($part, '*')) !== false) {
+ $ipstart = inet_pton($ipv4 . substr($part, 0, $wc) . '0' . str_repeat('.0', 3 - substr_count($ipv4, '.')));
+ $ipend = inet_pton($ipv4 . substr($part, 0, $wc) . '9' . str_repeat('.255', 3 - substr_count($ipv4, '.')));
+ break;
+ }
+ $ipv4 .= "$part.";
+ }
+ } elseif (preg_match('@^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/\d+$@', $mask)) {
+ list($ipv4, $bits) = explode('/', $mask);
+ if ($bits > 32)
+ return false;
+
+ list($ipstart, $ipend) = self::calc_cidr($mask);
+ } elseif (preg_match('@^[:a-z\d]+/\d+$@i', $mask)) {
+ list($ipv6, $bits) = explode('/', $mask);
+ if ($bits > 128)
+ return false;
+
+ list($ipstart, $ipend) = self::calc_cidr($mask);
+ } else {
+ if (($ipstart = @inet_pton($mask)) === false)
+ return false;
+ }
+
+ return array($ipstart, $ipend);
+ }
+
+ static public function find($ip, $board = false, $get_mod_info = false) {
+ global $config;
+
+ $query = prepare('SELECT ``bans``.*' . ($get_mod_info ? ', `username`' : '') . ' FROM ``bans``
+ ' . ($get_mod_info ? 'LEFT JOIN ``mods`` ON ``mods``.`id` = `creator`' : '') . '
+ WHERE
+ (' . ($board !== false ? '(`board` IS NULL OR `board` = :board) AND' : '') . '
+ (`ipstart` = :ip OR (:ip >= `ipstart` AND :ip <= `ipend`)))
+ ORDER BY `expires` IS NULL, `expires` DESC');
+
+ if ($board !== false)
+ $query->bindValue(':board', $board, PDO::PARAM_STR);
+
+ $query->bindValue(':ip', inet_pton($ip));
+ $query->execute() or error(db_error($query));
+
+ $ban_list = array();
+
+ while ($ban = $query->fetch(PDO::FETCH_ASSOC)) {
+ if ($ban['expires'] && ($ban['seen'] || !$config['require_ban_view']) && $ban['expires'] < time()) {
+ self::delete($ban['id']);
+ } else {
+ if ($ban['post'])
+ $ban['post'] = json_decode($ban['post'], true);
+ $ban['mask'] = self::range_to_string(array($ban['ipstart'], $ban['ipend']));
+ $ban_list[] = $ban;
+ }
+ }
+
+ return $ban_list;
+ }
- static public function stream_json($out = false, $filter_ips = false, $filter_staff = false, $board_access = false, $hide_regexes = []) {
- $query = query("SELECT ``bans``.*, `username` FROM ``bans``
- LEFT JOIN ``mods`` ON ``mods``.`id` = `creator`
- ORDER BY `created` DESC") or error(db_error());
- $bans = $query->fetchAll(PDO::FETCH_ASSOC);
+ static public function stream_json($out = false, $filter_ips = false, $filter_staff = false, $board_access = false, $hide_regexes = []) {
+ $query_str = "SELECT ``bans``.*, `username` FROM ``bans``
+ LEFT JOIN ``mods`` ON ``mods``.`id` = `creator`
+ ORDER BY `created` DESC";
- if ($board_access && $board_access[0] == '*') $board_access = false;
+ $query = query($query_str) or error(db_error());
+ $bans = $query->fetchAll(PDO::FETCH_ASSOC);
- $out ? fputs($out, "[") : print("[");
+ if ($board_access && $board_access[0] == '*')
+ $board_access = false;
- $end = end($bans);
+ $out ? fputs($out, "[") : print("[");
- foreach ($bans as &$ban) {
- $ban['mask'] = self::range_to_string(array($ban['ipstart'], $ban['ipend']));
+ $end = end($bans);
- $hide_message = false;
- foreach ($hide_regexes as $regex) {
- if(preg_match($regex, $ban['reason'])) {
- $hide_message = true;
- break;
- }
- }
+ foreach ($bans as &$ban) {
+ $ban['mask'] = self::range_to_string(array($ban['ipstart'], $ban['ipend']));
- if ($ban['post'] && !$hide_message) {
- $post = json_decode($ban['post']);
- $ban['message'] = isset($post->body) ? $post->body : 0;
- }
- unset($ban['ipstart'], $ban['ipend'], $ban['post'], $ban['creator']);
+ $hide_message = false;
+ foreach ($hide_regexes as $regex) {
+ if(preg_match($regex, $ban['reason'] || '')) {
+ $hide_message = true;
+ break;
+ }
+ }
- if ($board_access === false || in_array ($ban['board'], $board_access)) {
- $ban['access'] = true;
- }
+ if ($ban['post'] && !$hide_message) {
+ $post = json_decode($ban['post']);
+ $ban['message'] = isset($post->body) ? $post->body : 0;
+ }
+ unset($ban['ipstart'], $ban['ipend'], $ban['post'], $ban['creator']);
- if (filter_var($ban['mask'], FILTER_VALIDATE_IP) !== false) {
- $ban['single_addr'] = true;
- }
- if ($filter_staff || ($board_access !== false && !in_array($ban['board'], $board_access))) {
- $ban['username'] = '?';
- }
- if ($filter_ips || ($board_access !== false && !in_array($ban['board'], $board_access))) {
- @list($ban['mask'], $subnet) = explode("/", $ban['mask']);
- $ban['mask'] = preg_split("/[\.:]/", $ban['mask']);
- $ban['mask'] = array_slice($ban['mask'], 0, 2);
- $ban['mask'] = implode(".", $ban['mask']);
- $ban['mask'] .= ".x.x";
- if (isset ($subnet)) {
- $ban['mask'] .= "/$subnet";
- }
- $ban['masked'] = true;
- }
+ if ($board_access === false || in_array ($ban['board'], $board_access)) {
+ $ban['access'] = true;
+ }
- $json = json_encode($ban);
- $out ? fputs($out, $json) : print($json);
+ if (filter_var($ban['mask'], FILTER_VALIDATE_IP) !== false) {
+ $ban['single_addr'] = true;
+ }
+ if ($filter_staff || ($board_access !== false && !in_array($ban['board'], $board_access))) {
+ $ban['username'] = '?';
+ }
+ if ($filter_ips || ($board_access !== false && !in_array($ban['board'], $board_access))) {
+ @list($ban['mask'], $subnet) = explode("/", $ban['mask']);
+ $ban['mask'] = preg_split("/[\.:]/", $ban['mask']);
+ $ban['mask'] = array_slice($ban['mask'], 0, 2);
+ $ban['mask'] = implode(".", $ban['mask']);
+ $ban['mask'] .= ".x.x";
+ if (isset ($subnet)) {
+ $ban['mask'] .= "/$subnet";
+ }
+ $ban['masked'] = true;
+ }
- if ($ban['id'] != $end['id']) {
- $out ? fputs($out, ",") : print(",");
- }
- }
+ $json = json_encode($ban);
+ $out ? fputs($out, $json) : print($json);
+
+ if ($ban['id'] != $end['id']) {
+ $out ? fputs($out, ",") : print(",");
+ }
+ }
$out ? fputs($out, "]") : print("]");
- }
-
- static public function seen($ban_id) {
- $query = query("UPDATE ``bans`` SET `seen` = 1 WHERE `id` = " . (int)$ban_id) or error(db_error());
+ }
+
+ static public function seen($ban_id) {
+ $query = query("UPDATE ``bans`` SET `seen` = 1 WHERE `id` = " . (int)$ban_id) or error(db_error());
rebuildThemes('bans');
- }
-
- static public function purge() {
- $query = query("DELETE FROM ``bans`` WHERE `expires` IS NOT NULL AND `expires` < " . time() . " AND `seen` = 1") or error(db_error());
- rebuildThemes('bans');
- }
-
- static public function delete($ban_id, $modlog = false, $boards = false, $dont_rebuild = false) {
- global $config;
+ }
+
+ static public function purge() {
+ $query = query("DELETE FROM ``bans`` WHERE `expires` IS NOT NULL AND `expires` < " . time() . " AND `seen` = 1") or error(db_error());
+ rebuildThemes('bans');
+ }
+
+ static public function delete($ban_id, $modlog = false, $boards = false, $dont_rebuild = false) {
+ global $config;
- if ($boards && $boards[0] == '*') $boards = false;
+ if ($boards && $boards[0] == '*') $boards = false;
- if ($modlog) {
- $query = query("SELECT `ipstart`, `ipend`, `board` FROM ``bans`` WHERE `id` = " . (int)$ban_id) or error(db_error());
- if (!$ban = $query->fetch(PDO::FETCH_ASSOC)) {
- // Ban doesn't exist
- return false;
- }
+ if ($modlog) {
+ $query = query("SELECT `ipstart`, `ipend`, `board` FROM ``bans`` WHERE `id` = " . (int)$ban_id) or error(db_error());
+ if (!$ban = $query->fetch(PDO::FETCH_ASSOC)) {
+ // Ban doesn't exist
+ return false;
+ }
- if ($boards !== false && !in_array($ban['board'], $boards))
- error($config['error']['noaccess']);
-
- $mask = self::range_to_string(array($ban['ipstart'], $ban['ipend']));
-
- modLog("Removed ban #{$ban_id} for " .
- (filter_var($mask, FILTER_VALIDATE_IP) !== false ? "$mask " : $mask));
- }
-
- query("DELETE FROM ``bans`` WHERE `id` = " . (int)$ban_id) or error(db_error());
+ if ($boards !== false && !in_array($ban['board'], $boards))
+ error($config['error']['noaccess']);
+
+ $mask = self::range_to_string(array($ban['ipstart'], $ban['ipend']));
+
+ modLog("Removed ban #{$ban_id} for " .
+ (filter_var($mask, FILTER_VALIDATE_IP) !== false ? "$mask " : $mask));
+ }
+
+ query("DELETE FROM ``bans`` WHERE `id` = " . (int)$ban_id) or error(db_error());
- if (!$dont_rebuild) rebuildThemes('bans');
-
- return true;
- }
-
- static public function new_ban($mask, $reason, $length = false, $ban_board = false, $mod_id = false, $post = false) {
- global $mod, $pdo, $board;
-
- if ($mod_id === false) {
- $mod_id = isset($mod['id']) ? $mod['id'] : -1;
- }
-
- $range = self::parse_range($mask);
- $mask = self::range_to_string($range);
-
- $query = prepare("INSERT INTO ``bans`` VALUES (NULL, :ipstart, :ipend, :time, :expires, :board, :mod, :reason, 0, :post)");
-
- $query->bindValue(':ipstart', $range[0]);
- if ($range[1] !== false && $range[1] != $range[0])
- $query->bindValue(':ipend', $range[1]);
- else
- $query->bindValue(':ipend', null, PDO::PARAM_NULL);
-
- $query->bindValue(':mod', $mod_id);
- $query->bindValue(':time', time());
-
- if ($reason !== '') {
- $reason = escape_markup_modifiers($reason);
- markup($reason);
- $query->bindValue(':reason', $reason);
- } else
- $query->bindValue(':reason', null, PDO::PARAM_NULL);
-
- if ($length) {
- if (is_int($length) || ctype_digit($length)) {
- $length = time() + $length;
- } else {
- $length = self::parse_time($length);
- }
- $query->bindValue(':expires', $length);
- } else {
- $query->bindValue(':expires', null, PDO::PARAM_NULL);
- }
-
- if ($ban_board)
- $query->bindValue(':board', $ban_board);
- else
- $query->bindValue(':board', null, PDO::PARAM_NULL);
-
- if ($post) {
- $post['board'] = $board['uri'];
- $query->bindValue(':post', json_encode($post));
- } else
- $query->bindValue(':post', null, PDO::PARAM_NULL);
-
- $query->execute() or error(db_error($query));
-
- if (isset($mod['id']) && $mod['id'] == $mod_id) {
- modLog('Created a new ' .
- ($length > 0 ? preg_replace('/^(\d+) (\w+?)s?$/', '$1-$2', until($length)) : 'permanent') .
- ' ban on ' .
- ($ban_board ? '/' . $ban_board . '/' : 'all boards') .
- ' for ' .
- (filter_var($mask, FILTER_VALIDATE_IP) !== false ? "$mask " : $mask) .
- ' (#' . $pdo->lastInsertId() . ' )' .
- ' with ' . ($reason ? 'reason: ' . utf8tohtml($reason) . '' : 'no reason'));
- }
+ if (!$dont_rebuild) rebuildThemes('bans');
+
+ return true;
+ }
+
+ static public function new_ban($mask, $reason, $length = false, $ban_board = false, $mod_id = false, $post = false) {
+ global $mod, $pdo, $board;
+
+ if ($mod_id === false) {
+ $mod_id = isset($mod['id']) ? $mod['id'] : -1;
+ }
+
+ $range = self::parse_range($mask);
+ $mask = self::range_to_string($range);
+
+ $query = prepare("INSERT INTO ``bans`` VALUES (NULL, :ipstart, :ipend, :time, :expires, :board, :mod, :reason, 0, :post)");
+
+ $query->bindValue(':ipstart', $range[0]);
+ if ($range[1] !== false && $range[1] != $range[0])
+ $query->bindValue(':ipend', $range[1]);
+ else
+ $query->bindValue(':ipend', null, PDO::PARAM_NULL);
+
+ $query->bindValue(':mod', $mod_id);
+ $query->bindValue(':time', time());
+
+ if ($reason !== '') {
+ $reason = escape_markup_modifiers($reason);
+ markup($reason);
+ $query->bindValue(':reason', $reason);
+ } else
+ $query->bindValue(':reason', null, PDO::PARAM_NULL);
+
+ if ($length) {
+ if (is_int($length) || ctype_digit($length)) {
+ $length = time() + $length;
+ } else {
+ $length = self::parse_time($length);
+ }
+ $query->bindValue(':expires', $length);
+ } else {
+ $query->bindValue(':expires', null, PDO::PARAM_NULL);
+ }
+
+ if ($ban_board)
+ $query->bindValue(':board', $ban_board);
+ else
+ $query->bindValue(':board', null, PDO::PARAM_NULL);
+
+ if ($post) {
+ $post['board'] = $board['uri'];
+ $query->bindValue(':post', json_encode($post));
+ } else
+ $query->bindValue(':post', null, PDO::PARAM_NULL);
+
+ $query->execute() or error(db_error($query));
+
+ if (isset($mod['id']) && $mod['id'] == $mod_id) {
+ modLog('Created a new ' .
+ ($length > 0 ? preg_replace('/^(\d+) (\w+?)s?$/', '$1-$2', until($length)) : 'permanent') .
+ ' ban on ' .
+ ($ban_board ? '/' . $ban_board . '/' : 'all boards') .
+ ' for ' .
+ (filter_var($mask, FILTER_VALIDATE_IP) !== false ? "$mask " : $mask) .
+ ' (#' . $pdo->lastInsertId() . ' )' .
+ ' with ' . ($reason ? 'reason: ' . utf8tohtml($reason) . '' : 'no reason'));
+ }
- rebuildThemes('bans');
+ rebuildThemes('bans');
- return $pdo->lastInsertId();
- }
+ return $pdo->lastInsertId();
+ }
}
diff --git a/inc/config.php b/inc/config.php
index 14c5b309..1b4dba88 100644
--- a/inc/config.php
+++ b/inc/config.php
@@ -382,7 +382,7 @@
'!body' => '/^$/', // Post body is NOT empty
),
'action' => 'reject',
- 'message' => &$config['error']['flood']
+ 'message' => &$config['error']['flood1']
);
// Minimum time between posts with the same text. (Same content, but not always the same IP address.)
@@ -392,7 +392,7 @@
'flood-time' => &$config['flood_time_same']
),
'action' => 'reject',
- 'message' => &$config['error']['flood']
+ 'message' => &$config['error']['flood2']
);
// Example: Minimum time between posts with the same file hash.
@@ -517,6 +517,8 @@
// Allow users to delete their own posts?
$config['allow_delete'] = true;
+ // Allow users to delete their own threads?
+ $config['allow_thread_deletion'] = false;
// How long after posting should you have to wait before being able to delete that post? (In seconds.)
$config['delete_time'] = 10;
// Reply limit (stops bumping thread when this is reached).
@@ -1142,7 +1144,9 @@
$config['error']['reply_hard_limit'] = _('Thread has reached its maximum reply limit.');
$config['error']['image_hard_limit'] = _('Thread has reached its maximum image limit.');
$config['error']['nopost'] = _('You didn\'t make a post.');
- $config['error']['flood'] = _('Flood detected; Post discarded.');
+ $config['error']['flood'] = _('Flood detected; Post discarded.0');
+ $config['error']['flood1'] = _('Flood detected; Post discarded.1');
+ $config['error']['flood2'] = _('Flood detected; Post discarded.2');
$config['error']['spam'] = _('Your request looks automated; Post discarded.');
$config['error']['unoriginal'] = _('Unoriginal content!');
$config['error']['muted'] = _('Unoriginal content! You have been muted for %d seconds.');
@@ -1176,8 +1180,8 @@
// Moderator errors
$config['error']['toomanyunban'] = _('You are only allowed to unban %s users at a time. You tried to unban %u users.');
- $config['error']['invalid'] = _('Invalid username and/or password.');
- $config['error']['notamod'] = _('You are not a mod…');
+ $config['error']['invalid'] = _('Invalid username and/or password.');
+ $config['error']['notamod'] = _('You are not a mod…');
$config['error']['invalidafter'] = _('Invalid username and/or password. Your user may have been deleted or changed.');
$config['error']['malformed'] = _('Invalid/malformed cookies.');
$config['error']['missedafield'] = _('Your browser didn\'t submit an input when it should have.');
@@ -1186,11 +1190,12 @@
$config['error']['boardexists'] = _('There is already a %s board.');
$config['error']['noaccess'] = _('You don\'t have permission to do that.');
$config['error']['invalidpost'] = _('That post doesn\'t exist…');
- $config['error']['404'] = _('Page not found.');
+ $config['error']['404'] = _('Page not found.');
$config['error']['modexists'] = _('That mod already exists !');
$config['error']['invalidtheme'] = _('That theme doesn\'t exist!');
- $config['error']['csrf'] = _('Invalid security token! Please go back and try again.');
+ $config['error']['csrf'] = _('Invalid security token! Please go back and try again.');
$config['error']['badsyntax'] = _('Your code contained PHP syntax errors. Please go back and correct them. PHP says: ');
+ $config['error']['spam_noticer'] = _("Not going to post this because ");
/*
* =========================
@@ -1618,6 +1623,8 @@
// Allow searching posts (can be used with board configuration file to disallow searching through a
// certain board)
$config['mod']['search_posts'] = JANITOR;
+ // Access SpamNoticer UI
+ $config['mod']['spam_noticer'] = MOD;
// Read the moderator noticeboard
$config['mod']['noticeboard'] = JANITOR;
// Post to the moderator noticeboard
@@ -1942,3 +1949,9 @@
//Logo location for themes
$config['logo'] = 'static/logo.png';
+
+ // $config['spam_noticer'] = array();
+ $config['spam_noticer']['enabled'] = false;
+ $config['spam_noticer']['base_url'] = 'http://localhost:8888';
+ $config['spam_noticer']['imageboard_root'] = 'http://localhost:8080/';
+ $config['spam_noticer']['website_name'] = "";
diff --git a/inc/error.php b/inc/error.php
index 1f66b977..de69db35 100644
--- a/inc/error.php
+++ b/inc/error.php
@@ -1,23 +1,23 @@
getMessage());
+ error($e->getMessage());
}
set_exception_handler('exception_handler');
function fatal_error_handler(){
- if (($error = error_get_last()) && $error['type'] == E_ERROR) {
- error('Caught fatal error: ' . $error['message'] . ' in ' . $error['file'] . ' at line ' . $error['line']);
- }
+ if (($error = error_get_last()) && $error['type'] == E_ERROR) {
+ error('Caught fatal error: ' . $error['message'] . ' in ' . $error['file'] . ' at line ' . $error['line']);
+ }
}
register_shutdown_function('fatal_error_handler');
@@ -25,67 +25,71 @@ register_shutdown_function('fatal_error_handler');
$error_recursion=false;
function error($message, $priority = true, $debug_stuff = false) {
- global $board, $mod, $config, $db_error, $error_recursion;
-
- if($error_recursion!==false){
- die("Error recursion detected with " . $message . " Original error:".$error_recursion);
- }
-
- $error_recursion=$message;
-
- if (defined('STDIN')) {
- // Running from CLI
- echo('Error: ' . $message . "\n");
- debug_print_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
- die();
- }
-
- if(!empty($config)){
-
- if ($config['syslog'] && $priority !== false) {
- // Use LOG_NOTICE instead of LOG_ERR or LOG_WARNING because most error message are not significant.
- _syslog($priority !== true ? $priority : LOG_NOTICE, $message);
- }
+ global $board, $mod, $config, $db_error, $error_recursion;
- if ($config['debug']) {
- $debug_stuff=array();
- if(isset($db_error)){
- $debug_stuff = array_combine(array('SQLSTATE', 'Error code', 'Error message'), $db_error);
- }
- $debug_stuff['backtrace'] = debug_backtrace();
- $pw = $config['db']['password'];
- $debug_callback = function(&$item) use (&$debug_callback, $pw) {
- if (is_array($item)) {
- return array_map($debug_callback, $item);
- }
- return ($item == $pw ? 'hunter2' : $item);
- };
- $debug_stuff = array_map($debug_callback, $debug_stuff);
- }
- }
+ if($error_recursion!==false){
+ die("Error recursion detected with " . $message . " Original error:".$error_recursion);
+ }
- if (isset($_POST['json_response'])) {
- header('Content-Type: text/json; charset=utf-8');
- $data=array('error'=>$message);
- if(!empty($config) && $config['debug']){
- $data['debug']=$debug_stuff;
- }
- print json_encode($data);
- exit();
- }
+ $error_recursion=$message;
- header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error');
-
- die(Element('page.html', array(
- 'config' => $config,
- 'title' => _('Error'),
- 'subtitle' => _('An error has occured.'),
- 'body' => Element('error.html', array(
- 'config' => $config,
- 'message' => $message,
- 'mod' => $mod,
- 'board' => isset($board) ? $board : false,
- 'debug' => str_replace("\n", '
', utf8tohtml(print_r($debug_stuff, true)))
- ))
- )));
+ if (defined('STDIN')) {
+ // Running from CLI
+ echo('Error: ' . $message . "\n");
+ debug_print_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
+ die();
+ }
+
+ if(!empty($config)){
+
+ if ($config['syslog'] && $priority !== false) {
+ // Use LOG_NOTICE instead of LOG_ERR or LOG_WARNING because most error message are not significant.
+ _syslog($priority !== true ? $priority : LOG_NOTICE, $message);
+ }
+
+ if ($config['debug']) {
+ $debug_stuff=array();
+
+ if (isset($db_error)){
+ $debug_stuff = array_combine(array('SQLSTATE', 'Error code', 'Error message'), $db_error);
+ }
+
+ $debug_stuff['backtrace'] = debug_backtrace();
+ $pw = $config['db']['password'];
+
+ $debug_callback = function ($item) use (&$debug_callback, $pw) {
+ if (is_array($item)) {
+ return array_map($debug_callback, $item);
+ }
+ return ($item == $pw ? 'hunter2' : $item);
+ };
+
+ $debug_stuff = array_map($debug_callback, $debug_stuff);
+ }
+ }
+
+ if (isset($_POST['json_response'])) {
+ header('Content-Type: text/json; charset=utf-8');
+ $data=array('error'=>$message);
+ if(!empty($config) && $config['debug']){
+ $data['debug']=$debug_stuff;
+ }
+ print json_encode($data);
+ exit();
+ }
+
+ header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error');
+
+ die(Element('page.html', array(
+ 'config' => $config,
+ 'title' => _('Error'),
+ 'subtitle' => _('An error has occured.'),
+ 'body' => Element('error.html', array(
+ 'config' => $config,
+ 'message' => $message,
+ 'mod' => $mod,
+ 'board' => isset($board) ? $board : false,
+ 'debug' => str_replace("\n", '
', utf8tohtml(print_r($debug_stuff, true)))
+ ))
+ )));
}
diff --git a/inc/filters.php b/inc/filters.php
index bf0a8dcc..591b4f92 100644
--- a/inc/filters.php
+++ b/inc/filters.php
@@ -19,7 +19,6 @@ class Filter {
}
public function match($condition, $match) {
- print_err("Filter condition: " . $condition);
$condition = strtolower($condition);
$post = &$this->post;
@@ -76,14 +75,14 @@ class Filter {
case 'flood-time-any':
foreach ($this->flood_check as $flood_post) {
if (time() - $flood_post['time'] <= $match) {
- print_err("rejecting post with flood id: " . $flood_post['id']);
return true;
}
}
return false;
case 'flood-time':
foreach ($this->flood_check as $flood_post) {
- if (time() - $flood_post['time'] <= $match) {
+ $t = time();
+ if ($t - $flood_post['time'] <= $match) {
return true;
}
}
@@ -223,8 +222,6 @@ function purge_flood_table() {
function do_filters(array $post) {
global $config;
-
- print_err("do_filters begin");
if (!isset($config['filters']) || empty($config['filters']))
return;
@@ -237,14 +234,12 @@ function do_filters(array $post) {
$has_flood = true;
break;
} else if ($filter['noip'] == true) {
- print_err("filters noip is true");
$noip = true;
$find_time = time() - $filter['find-time'];
}
}
if ($noip) {
- print_err("SELECT * FROM flood WHERE time > " . strval($find_time));
$query = prepare("SELECT * FROM ``flood`` WHERE `time` > $find_time");
$query->execute() or error(db_error($query));
$flood_check = $query->fetchAll(PDO::FETCH_ASSOC);
@@ -266,7 +261,6 @@ function do_filters(array $post) {
}
foreach ($config['filters'] as $filter_array) {
- print_err("creating new filter, running check");
$filter = new Filter($filter_array);
$filter->flood_check = $flood_check;
if ($filter->check($post)) {
diff --git a/inc/functions.php b/inc/functions.php
index c82a4c93..298217fe 100644
--- a/inc/functions.php
+++ b/inc/functions.php
@@ -5,8 +5,8 @@
*/
if (realpath($_SERVER['SCRIPT_FILENAME']) == str_replace('\\', '/', __FILE__)) {
- // You cannot request this file directly.
- exit;
+ // You cannot request this file directly.
+ exit;
}
define('TINYBOARD', null);
@@ -23,12 +23,11 @@ require_once 'inc/mod/auth.php';
require_once 'inc/lock.php';
require_once 'inc/queue.php';
require_once 'inc/polyfill.php';
+require_once 'inc/spamnoticer.php';
@include_once 'inc/lib/parsedown/Parsedown.php'; // fail silently, this isn't a critical piece of code
-require_once 'inc/anti-bot.php'; // DELETE ME THIS IS FOR print_err function only!
-
if (!extension_loaded('gettext')) {
- require_once 'inc/lib/gettext/gettext.inc';
+ require_once 'inc/lib/gettext/gettext.inc';
}
// the user is not currently logged in as a moderator
@@ -38,1771 +37,1804 @@ mb_internal_encoding('UTF-8');
loadConfig();
function init_locale($locale) {
- if (extension_loaded('gettext')) {
- if (setlocale(LC_ALL, $locale) === false) {
- //$error('The specified locale (' . $locale . ') does not exist on your platform!');
- // Fall back to C.UTF-8 instead of normal C, so we support unicode instead of just ASCII
- setlocale(LC_ALL, "C.UTF-8");
- setlocale(LC_CTYPE, "C.UTF-8");
- }
- bindtextdomain('tinyboard', './inc/locale');
- bind_textdomain_codeset('tinyboard', 'UTF-8');
- textdomain('tinyboard');
- } else {
- if (_setlocale(LC_ALL, $locale) === false) {
- error('The specified locale (' . $locale . ') does not exist on your platform!');
- // Fall back to C.UTF-8 instead of normal C, so we support unicode instead of just ASCII
- _setlocale(LC_ALL, "C.UTF-8");
- _setlocale(LC_CTYPE, "C.UTF-8");
- }
- _bindtextdomain('tinyboard', './inc/locale');
- _bind_textdomain_codeset('tinyboard', 'UTF-8');
- _textdomain('tinyboard');
- }
+ if (extension_loaded('gettext')) {
+ if (setlocale(LC_ALL, $locale) === false) {
+ //$error('The specified locale (' . $locale . ') does not exist on your platform!');
+ // Fall back to C.UTF-8 instead of normal C, so we support unicode instead of just ASCII
+ setlocale(LC_ALL, "C.UTF-8");
+ setlocale(LC_CTYPE, "C.UTF-8");
+ }
+ bindtextdomain('tinyboard', './inc/locale');
+ bind_textdomain_codeset('tinyboard', 'UTF-8');
+ textdomain('tinyboard');
+ } else {
+ if (_setlocale(LC_ALL, $locale) === false) {
+ error('The specified locale (' . $locale . ') does not exist on your platform!');
+ // Fall back to C.UTF-8 instead of normal C, so we support unicode instead of just ASCII
+ _setlocale(LC_ALL, "C.UTF-8");
+ _setlocale(LC_CTYPE, "C.UTF-8");
+ }
+ _bindtextdomain('tinyboard', './inc/locale');
+ _bind_textdomain_codeset('tinyboard', 'UTF-8');
+ _textdomain('tinyboard');
+ }
}
$current_locale = 'en';
function loadConfig() {
- global $board, $config, $__ip, $debug, $__version, $microtime_start, $current_locale, $events;
+ global $board, $config, $__ip, $debug, $__version, $microtime_start, $current_locale, $events;
- $boardsuffix = isset($board['uri']) ? $board['uri'] : '';
+ $boardsuffix = isset($board['uri']) ? $board['uri'] : '';
- if (!isset($_SERVER['REMOTE_ADDR']))
- $_SERVER['REMOTE_ADDR'] = '0.0.0.0';
+ if (!isset($_SERVER['REMOTE_ADDR']))
+ $_SERVER['REMOTE_ADDR'] = '0.0.0.0';
- if (file_exists('tmp/cache/cache_config.php')) {
- require_once('tmp/cache/cache_config.php');
- }
+ if (file_exists('tmp/cache/cache_config.php')) {
+ require_once('tmp/cache/cache_config.php');
+ }
- if (isset($config['cache_config']) &&
- $config['cache_config'] &&
+ if (isset($config['cache_config']) &&
+ $config['cache_config'] &&
$config = Cache::get('config_' . $boardsuffix ) ) {
- $events = Cache::get('events_' . $boardsuffix );
+ $events = Cache::get('events_' . $boardsuffix );
- define_groups();
+ define_groups();
- if (file_exists('inc/instance-functions.php')) {
- require_once('inc/instance-functions.php');
- }
+ if (file_exists('inc/instance-functions.php')) {
+ require_once('inc/instance-functions.php');
+ }
- if ($config['locale'] != $current_locale) {
- $current_locale = $config['locale'];
- init_locale($config['locale']);
- }
- }
- else {
- $config = array();
+ if ($config['locale'] != $current_locale) {
+ $current_locale = $config['locale'];
+ init_locale($config['locale']);
+ }
+ }
+ else {
+ $config = array();
- reset_events();
+ reset_events();
- $arrays = array(
- 'db',
- 'api',
- 'cache',
- 'lock',
- 'queue',
- 'cookies',
- 'error',
- 'dir',
- 'mod',
- 'spam',
- 'filters',
- 'wordfilters',
- 'custom_capcode',
- 'custom_tripcode',
- 'dnsbl',
- 'dnsbl_exceptions',
- 'remote',
- 'allowed_ext',
- 'allowed_ext_files',
- 'file_icons',
- 'footer',
- 'stylesheets',
- 'code_stylesheets',
- 'additional_javascript',
- 'markup',
- 'custom_pages',
- 'dashboard_links'
- );
+ $arrays = array(
+ 'db',
+ 'api',
+ 'cache',
+ 'lock',
+ 'queue',
+ 'cookies',
+ 'error',
+ 'dir',
+ 'mod',
+ 'spam',
+ 'filters',
+ 'wordfilters',
+ 'custom_capcode',
+ 'custom_tripcode',
+ 'dnsbl',
+ 'dnsbl_exceptions',
+ 'remote',
+ 'allowed_ext',
+ 'allowed_ext_files',
+ 'file_icons',
+ 'footer',
+ 'stylesheets',
+ 'code_stylesheets',
+ 'additional_javascript',
+ 'markup',
+ 'custom_pages',
+ 'dashboard_links'
+ );
- foreach ($arrays as $key) {
- $config[$key] = array();
- }
+ foreach ($arrays as $key) {
+ $config[$key] = array();
+ }
- if (!file_exists('inc/instance-config.php'))
- error('Tinyboard is not configured! Create inc/instance-config.php.');
+ if (!file_exists('inc/instance-config.php'))
+ error('Tinyboard is not configured! Create inc/instance-config.php.');
- // Initialize locale as early as possible
+ // Initialize locale as early as possible
- // Those calls are expensive. Unfortunately, our cache system is not initialized at this point.
- // So, we may store the locale in a tmp/ filesystem.
+ // Those calls are expensive. Unfortunately, our cache system is not initialized at this point.
+ // So, we may store the locale in a tmp/ filesystem.
- if (file_exists($fn = 'tmp/cache/locale_' . $boardsuffix ) ) {
- $config['locale'] = @file_get_contents($fn);
- }
- else {
- $config['locale'] = 'en';
+ if (file_exists($fn = 'tmp/cache/locale_' . $boardsuffix ) ) {
+ $config['locale'] = @file_get_contents($fn);
+ }
+ else {
+ $config['locale'] = 'en';
- $configstr = file_get_contents('inc/instance-config.php');
+ $configstr = file_get_contents('inc/instance-config.php');
- if (isset($board['dir']) && file_exists($board['dir'] . '/config.php')) {
- $configstr .= file_get_contents($board['dir'] . '/config.php');
- }
- $matches = array();
- preg_match_all('/[^\/#*]\$config\s*\[\s*[\'"]locale[\'"]\s*\]\s*=\s*([\'"])(.*?)\1/', $configstr, $matches);
- if ($matches && isset ($matches[2]) && $matches[2]) {
- $matches = $matches[2];
- $config['locale'] = $matches[count($matches)-1];
- }
+ if (isset($board['dir']) && file_exists($board['dir'] . '/config.php')) {
+ $configstr .= file_get_contents($board['dir'] . '/config.php');
+ }
+ $matches = array();
+ preg_match_all('/[^\/#*]\$config\s*\[\s*[\'"]locale[\'"]\s*\]\s*=\s*([\'"])(.*?)\1/', $configstr, $matches);
+ if ($matches && isset ($matches[2]) && $matches[2]) {
+ $matches = $matches[2];
+ $config['locale'] = $matches[count($matches)-1];
+ }
- @file_put_contents($fn, $config['locale']);
- }
+ @file_put_contents($fn, $config['locale']);
+ }
- if ($config['locale'] != $current_locale) {
- $current_locale = $config['locale'];
- init_locale($config['locale']);
- }
+ if ($config['locale'] != $current_locale) {
+ $current_locale = $config['locale'];
+ init_locale($config['locale']);
+ }
- require 'inc/config.php';
+ require 'inc/config.php';
- require 'inc/instance-config.php';
+ require 'inc/instance-config.php';
- if (isset($board['dir']) && file_exists($board['dir'] . '/config.php')) {
- require $board['dir'] . '/config.php';
- }
+ if (isset($board['dir']) && file_exists($board['dir'] . '/config.php')) {
+ require $board['dir'] . '/config.php';
+ }
- if ($config['locale'] != $current_locale) {
- $current_locale = $config['locale'];
- init_locale($config['locale']);
- }
+ if ($config['locale'] != $current_locale) {
+ $current_locale = $config['locale'];
+ init_locale($config['locale']);
+ }
- if (!isset($config['global_message']))
- $config['global_message'] = false;
+ if (!isset($config['global_message']))
+ $config['global_message'] = false;
- if (!isset($config['post_url']))
- $config['post_url'] = $config['root'] . $config['file_post'];
+ if (!isset($config['post_url']))
+ $config['post_url'] = $config['root'] . $config['file_post'];
- if (!isset($config['referer_match']))
- if (isset($_SERVER['HTTP_HOST'])) {
- $config['referer_match'] = '/^' .
- (preg_match('@^https?://@', $config['root']) ? '' :
- 'https?:\/\/' . $_SERVER['HTTP_HOST']) .
- preg_quote($config['root'], '/') .
- '(' .
- str_replace('%s', $config['board_regex'], preg_quote($config['board_path'], '/')) .
- '(' .
- preg_quote($config['file_index'], '/') . '|' .
- str_replace('%d', '\d+', preg_quote($config['file_page'])) .
- ')?' .
- '|' .
- str_replace('%s', $config['board_regex'], preg_quote($config['board_path'], '/')) .
- preg_quote($config['dir']['res'], '/') .
- '(' .
- str_replace('%d', '\d+', preg_quote($config['file_page'], '/')) . '|' .
- str_replace('%d', '\d+', preg_quote($config['file_page50'], '/')) . '|' .
- str_replace(array('%d', '%s'), array('\d+', '[a-z0-9-]+'), preg_quote($config['file_page_slug'], '/')) . '|' .
- str_replace(array('%d', '%s'), array('\d+', '[a-z0-9-]+'), preg_quote($config['file_page50_slug'], '/')) .
- ')' .
- '|' .
- preg_quote($config['file_mod'], '/') . '\?\/.+' .
- ')([#?](.+)?)?$/ui';
- } else {
- // CLI mode
- $config['referer_match'] = '//';
- }
- if (!isset($config['cookies']['path']))
- $config['cookies']['path'] = &$config['root'];
+ if (!isset($config['referer_match']))
+ if (isset($_SERVER['HTTP_HOST'])) {
+ $config['referer_match'] = '/^' .
+ (preg_match('@^https?://@', $config['root']) ? '' :
+ 'https?:\/\/' . $_SERVER['HTTP_HOST']) .
+ preg_quote($config['root'], '/') .
+ '(' .
+ str_replace('%s', $config['board_regex'], preg_quote($config['board_path'], '/')) .
+ '(' .
+ preg_quote($config['file_index'], '/') . '|' .
+ str_replace('%d', '\d+', preg_quote($config['file_page'])) .
+ ')?' .
+ '|' .
+ str_replace('%s', $config['board_regex'], preg_quote($config['board_path'], '/')) .
+ preg_quote($config['dir']['res'], '/') .
+ '(' .
+ str_replace('%d', '\d+', preg_quote($config['file_page'], '/')) . '|' .
+ str_replace('%d', '\d+', preg_quote($config['file_page50'], '/')) . '|' .
+ str_replace(array('%d', '%s'), array('\d+', '[a-z0-9-]+'), preg_quote($config['file_page_slug'], '/')) . '|' .
+ str_replace(array('%d', '%s'), array('\d+', '[a-z0-9-]+'), preg_quote($config['file_page50_slug'], '/')) .
+ ')' .
+ '|' .
+ preg_quote($config['file_mod'], '/') . '\?\/.+' .
+ ')([#?](.+)?)?$/ui';
+ } else {
+ // CLI mode
+ $config['referer_match'] = '//';
+ }
+ if (!isset($config['cookies']['path']))
+ $config['cookies']['path'] = &$config['root'];
- if (!isset($config['dir']['static']))
- $config['dir']['static'] = $config['root'] . 'static/';
+ if (!isset($config['dir']['static']))
+ $config['dir']['static'] = $config['root'] . 'static/';
- if (!isset($config['image_blank']))
- $config['image_blank'] = $config['dir']['static'] . 'blank.gif';
+ if (!isset($config['image_blank']))
+ $config['image_blank'] = $config['dir']['static'] . 'blank.gif';
- if (!isset($config['image_sticky']))
- $config['image_sticky'] = $config['dir']['static'] . 'sticky.gif';
- if (!isset($config['image_locked']))
- $config['image_locked'] = $config['dir']['static'] . 'locked.gif';
- if (!isset($config['image_bumplocked']))
- $config['image_bumplocked'] = $config['dir']['static'] . 'sage.gif';
- if (!isset($config['image_deleted']))
- $config['image_deleted'] = $config['dir']['static'] . 'deleted.png';
+ if (!isset($config['image_sticky']))
+ $config['image_sticky'] = $config['dir']['static'] . 'sticky.gif';
+ if (!isset($config['image_locked']))
+ $config['image_locked'] = $config['dir']['static'] . 'locked.gif';
+ if (!isset($config['image_bumplocked']))
+ $config['image_bumplocked'] = $config['dir']['static'] . 'sage.gif';
+ if (!isset($config['image_deleted']))
+ $config['image_deleted'] = $config['dir']['static'] . 'deleted.png';
- if (!isset($config['uri_thumb']))
- $config['uri_thumb'] = $config['root'] . $board['dir'] . $config['dir']['thumb'];
- elseif (isset($board['dir']))
- $config['uri_thumb'] = sprintf($config['uri_thumb'], $board['dir']);
+ if (!isset($config['uri_thumb']) && isset($board)) {
+ $config['uri_thumb'] = $config['root'] . $board['dir'] . $config['dir']['thumb'];
+ } elseif (isset($board['dir']) && isset($board)) {
+ $config['uri_thumb'] = sprintf($config['uri_thumb'], $board['dir']);
+ }
- if (!isset($config['uri_img']))
- $config['uri_img'] = $config['root'] . $board['dir'] . $config['dir']['img'];
- elseif (isset($board['dir']))
- $config['uri_img'] = sprintf($config['uri_img'], $board['dir']);
+ if (!isset($config['uri_img']) && isset($board))
+ $config['uri_img'] = $config['root'] . $board['dir'] . $config['dir']['img'];
+ elseif (isset($board) && isset($board['dir'])) {
+ $config['uri_img'] = sprintf($config['uri_img'], $board['dir']);
+ }
- if (!isset($config['uri_stylesheets']))
- $config['uri_stylesheets'] = $config['root'] . 'stylesheets/';
+ if (!isset($config['uri_stylesheets']))
+ $config['uri_stylesheets'] = $config['root'] . 'stylesheets/';
- if (!isset($config['url_stylesheet']))
- $config['url_stylesheet'] = $config['uri_stylesheets'] . 'style.css';
- if (!isset($config['url_javascript']))
- $config['url_javascript'] = $config['root'] . $config['file_script'];
- if (!isset($config['additional_javascript_url']))
- $config['additional_javascript_url'] = $config['root'];
- if (!isset($config['uri_flags']))
- $config['uri_flags'] = $config['root'] . 'static/flags/%s.png';
- if (!isset($config['user_flag']))
- $config['user_flag'] = false;
- if (!isset($config['user_flags']))
- $config['user_flags'] = array();
+ if (!isset($config['url_stylesheet']))
+ $config['url_stylesheet'] = $config['uri_stylesheets'] . 'style.css';
+ if (!isset($config['url_javascript']))
+ $config['url_javascript'] = $config['root'] . $config['file_script'];
+ if (!isset($config['additional_javascript_url']))
+ $config['additional_javascript_url'] = $config['root'];
+ if (!isset($config['uri_flags']))
+ $config['uri_flags'] = $config['root'] . 'static/flags/%s.png';
+ if (!isset($config['user_flag']))
+ $config['user_flag'] = false;
+ if (!isset($config['user_flags']))
+ $config['user_flags'] = array();
- if (!isset($__version))
- $__version = file_exists('.installed') ? trim(file_get_contents('.installed')) : false;
- $config['version'] = $__version;
+ if (!isset($__version))
+ $__version = file_exists('.installed') ? trim(file_get_contents('.installed')) : false;
+ $config['version'] = $__version;
- if ($config['allow_roll'])
- event_handler('post', 'diceRoller');
+ if ($config['allow_roll'])
+ event_handler('post', 'diceRoller');
- if (in_array('webm', $config['allowed_ext_files']) ||
- in_array('mp4', $config['allowed_ext_files']))
- event_handler('post', 'postHandler');
- }
- // Effectful config processing below:
+ if (in_array('webm', $config['allowed_ext_files']) ||
+ in_array('mp4', $config['allowed_ext_files']))
+ event_handler('post', 'postHandler');
+ }
+ // Effectful config processing below:
- date_default_timezone_set($config['timezone']);
+ date_default_timezone_set($config['timezone']);
- if ($config['root_file']) {
- chdir($config['root_file']);
- }
+ if ($config['root_file']) {
+ chdir($config['root_file']);
+ }
- // Keep the original address to properly comply with other board configurations
- if (!isset($__ip))
- $__ip = $_SERVER['REMOTE_ADDR'];
+ // Keep the original address to properly comply with other board configurations
+ if (!isset($__ip))
+ $__ip = $_SERVER['REMOTE_ADDR'];
- // ::ffff:0.0.0.0
- if (preg_match('/^\:\:(ffff\:)?(\d+\.\d+\.\d+\.\d+)$/', $__ip, $m))
- $_SERVER['REMOTE_ADDR'] = $m[2];
+ // ::ffff:0.0.0.0
+ if (preg_match('/^\:\:(ffff\:)?(\d+\.\d+\.\d+\.\d+)$/', $__ip, $m))
+ $_SERVER['REMOTE_ADDR'] = $m[2];
- if ($config['verbose_errors']) {
- set_error_handler('error_handler');
- error_reporting(E_ALL);
- ini_set('display_errors', true);
- ini_set('html_errors', false);
- } else {
- ini_set('display_errors', false);
- }
+ if ($config['verbose_errors']) {
+ set_error_handler('error_handler');
+ error_reporting(E_ALL);
+ ini_set('display_errors', true);
+ ini_set('html_errors', false);
+ } else {
+ ini_set('display_errors', false);
+ }
- if ($config['syslog'])
- openlog('tinyboard', LOG_ODELAY, LOG_SYSLOG); // open a connection to sysem logger
+ if ($config['syslog'])
+ openlog('tinyboard', LOG_ODELAY, LOG_SYSLOG); // open a connection to sysem logger
- if ($config['cache']['enabled'])
- require_once 'inc/cache.php';
+ if ($config['cache']['enabled'])
+ require_once 'inc/cache.php';
- if (in_array('webm', $config['allowed_ext_files']) ||
+ if (in_array('webm', $config['allowed_ext_files']) ||
in_array('mp4', $config['allowed_ext_files']))
- require_once 'inc/lib/webm/posthandler.php';
+ require_once 'inc/lib/webm/posthandler.php';
- event('load-config');
+ event('load-config');
- if ($config['cache_config'] && !isset ($config['cache_config_loaded'])) {
- file_put_contents('tmp/cache/cache_config.php', ' array(),
- 'exec' => array(),
- 'purge' => array(),
- 'cached' => array(),
- 'write' => array(),
- 'time' => array(
- 'db_queries' => 0,
- 'exec' => 0,
- ),
- 'start' => $microtime_start,
- 'start_debug' => microtime(true)
- );
- $debug['start'] = $microtime_start;
- }
- }
+ if (is_array($config['anonymous'])) {
+ $config['anonymous'] = $config['anonymous'][array_rand($config['anonymous'])];
+ }
+ else if (is_callable($config['anonymous'])){
+ $config['anonymous'] = $config['anonymous']($boardsuffix);
+ }
+
+ if ($config['debug']) {
+ if (!isset($debug)) {
+ $debug = array(
+ 'sql' => array(),
+ 'exec' => array(),
+ 'purge' => array(),
+ 'cached' => array(),
+ 'write' => array(),
+ 'time' => array(
+ 'db_queries' => 0,
+ 'exec' => 0,
+ ),
+ 'start' => $microtime_start,
+ 'start_debug' => microtime(true)
+ );
+ $debug['start'] = $microtime_start;
+ }
+ }
}
function _syslog($priority, $message) {
- if (isset($_SERVER['REMOTE_ADDR'], $_SERVER['REQUEST_METHOD'], $_SERVER['REQUEST_URI'])) {
- // CGI
- syslog($priority, $message . ' - client: ' . $_SERVER['REMOTE_ADDR'] . ', request: "' . $_SERVER['REQUEST_METHOD'] . ' ' . $_SERVER['REQUEST_URI'] . '"');
- } else {
- syslog($priority, $message);
- }
+ if (isset($_SERVER['REMOTE_ADDR'], $_SERVER['REQUEST_METHOD'], $_SERVER['REQUEST_URI'])) {
+ // CGI
+ syslog($priority, $message . ' - client: ' . $_SERVER['REMOTE_ADDR'] . ', request: "' . $_SERVER['REQUEST_METHOD'] . ' ' . $_SERVER['REQUEST_URI'] . '"');
+ } else {
+ syslog($priority, $message);
+ }
}
function define_groups() {
- global $config;
+ global $config;
- foreach ($config['mod']['groups'] as $group_value => $group_name) {
- $group_name = strtoupper($group_name);
- if(!defined($group_name)) {
- define($group_name, $group_value, true);
- }
- }
-
- ksort($config['mod']['groups']);
+ foreach ($config['mod']['groups'] as $group_value => $group_name) {
+ $group_name = strtoupper($group_name);
+ if(!defined($group_name)) {
+ define($group_name, $group_value);
+ }
+ }
+
+ ksort($config['mod']['groups']);
}
function create_antibot($board, $thread = null) {
- require_once dirname(__FILE__) . '/anti-bot.php';
+ require_once dirname(__FILE__) . '/anti-bot.php';
- print_err("Create Antibot.");
- return _create_antibot($board, $thread);
+ return _create_antibot($board, $thread);
}
function rebuildThemes($action, $boardname = false) {
- global $config, $board, $current_locale;
+ global $config, $board, $current_locale;
- // Save the global variables
- $_config = $config;
- $_board = $board;
+ // Save the global variables
+ $_config = $config;
+ $_board = $board;
- // List themes
- if ($themes = Cache::get("themes")) {
- // OK, we already have themes loaded
- }
- else {
- $query = query("SELECT `theme` FROM ``theme_settings`` WHERE `name` IS NULL AND `value` IS NULL") or error(db_error());
+ // List themes
+ if ($themes = Cache::get("themes")) {
+ // OK, we already have themes loaded
+ }
+ else {
+ $query = query("SELECT `theme` FROM ``theme_settings`` WHERE `name` IS NULL AND `value` IS NULL") or error(db_error());
- $themes = array();
+ $themes = array();
- while ($theme = $query->fetch(PDO::FETCH_ASSOC)) {
- $themes[] = $theme;
- }
+ while ($theme = $query->fetch(PDO::FETCH_ASSOC)) {
+ $themes[] = $theme;
+ }
- Cache::set("themes", $themes);
- }
+ Cache::set("themes", $themes);
+ }
- foreach ($themes as $theme) {
- // Restore them
- $config = $_config;
- $board = $_board;
+ foreach ($themes as $theme) {
+ // Restore them
+ $config = $_config;
+ $board = $_board;
- // Reload the locale
- if ($config['locale'] != $current_locale) {
- $current_locale = $config['locale'];
- init_locale($config['locale']);
- }
+ // Reload the locale
+ if ($config['locale'] != $current_locale) {
+ $current_locale = $config['locale'];
+ init_locale($config['locale']);
+ }
- if (PHP_SAPI === 'cli') {
- echo "Rebuilding theme ".$theme['theme']."... ";
- }
+ if (PHP_SAPI === 'cli') {
+ echo "Rebuilding theme ".$theme['theme']."... ";
+ }
- rebuildTheme($theme['theme'], $action, $boardname);
+ rebuildTheme($theme['theme'], $action, $boardname);
- if (PHP_SAPI === 'cli') {
- echo "done\n";
- }
- }
+ if (PHP_SAPI === 'cli') {
+ echo "done\n";
+ }
+ }
- // Restore them again
- $config = $_config;
- $board = $_board;
+ // Restore them again
+ $config = $_config;
+ $board = $_board;
- // Reload the locale
- if ($config['locale'] != $current_locale) {
- $current_locale = $config['locale'];
- init_locale($config['locale']);
- }
+ // Reload the locale
+ if ($config['locale'] != $current_locale) {
+ $current_locale = $config['locale'];
+ init_locale($config['locale']);
+ }
}
function loadThemeConfig($_theme) {
- global $config;
+ global $config;
- if (!file_exists($config['dir']['themes'] . '/' . $_theme . '/info.php'))
- return false;
+ if (!file_exists($config['dir']['themes'] . '/' . $_theme . '/info.php'))
+ return false;
- // Load theme information into $theme
- include $config['dir']['themes'] . '/' . $_theme . '/info.php';
+ // Load theme information into $theme
+ include $config['dir']['themes'] . '/' . $_theme . '/info.php';
- return $theme;
+ return $theme;
}
-function rebuildTheme($theme, $action, $board = false) {
- global $config, $_theme;
- $_theme = $theme;
+function rebuildTheme($theme, $action, $boardname = false) {
+ global $config, $_theme;
+ $_theme = $theme;
- $theme = loadThemeConfig($_theme);
+ $theme = loadThemeConfig($_theme);
- if (file_exists($config['dir']['themes'] . '/' . $_theme . '/theme.php')) {
- require_once $config['dir']['themes'] . '/' . $_theme . '/theme.php';
+ if (file_exists($config['dir']['themes'] . '/' . $_theme . '/theme.php')) {
+ require_once $config['dir']['themes'] . '/' . $_theme . '/theme.php';
- $theme['build_function']($action, themeSettings($_theme), $board);
- }
+ $theme['build_function']($action, themeSettings($_theme), $boardname);
+ }
}
function themeSettings($theme) {
- if ($settings = Cache::get("theme_settings_".$theme)) {
- return $settings;
- }
+ if ($settings = Cache::get("theme_settings_".$theme)) {
+ return $settings;
+ }
- $query = prepare("SELECT `name`, `value` FROM ``theme_settings`` WHERE `theme` = :theme AND `name` IS NOT NULL");
- $query->bindValue(':theme', $theme);
- $query->execute() or error(db_error($query));
+ $query = prepare("SELECT `name`, `value` FROM ``theme_settings`` WHERE `theme` = :theme AND `name` IS NOT NULL");
+ $query->bindValue(':theme', $theme);
+ $query->execute() or error(db_error($query));
- $settings = array();
- while ($s = $query->fetch(PDO::FETCH_ASSOC)) {
- $settings[$s['name']] = $s['value'];
- }
+ $settings = array();
+ while ($s = $query->fetch(PDO::FETCH_ASSOC)) {
+ $settings[$s['name']] = $s['value'];
+ }
- Cache::set("theme_settings_".$theme, $settings);
+ Cache::set("theme_settings_".$theme, $settings);
- return $settings;
+ return $settings;
}
function sprintf3($str, $vars, $delim = '%') {
- $replaces = array();
- foreach ($vars as $k => $v) {
- $replaces[$delim . $k . $delim] = $v;
- }
- return str_replace(array_keys($replaces),
- array_values($replaces), $str);
+ $replaces = array();
+ foreach ($vars as $k => $v) {
+ $replaces[$delim . $k . $delim] = $v;
+ }
+ return str_replace(array_keys($replaces),
+ array_values($replaces), $str);
}
function mb_substr_replace($string, $replacement, $start, $length) {
- return mb_substr($string, 0, $start) . $replacement . mb_substr($string, $start + $length);
+ return mb_substr($string, 0, $start) . $replacement . mb_substr($string, $start + $length);
}
function setupBoard($array) {
- global $board, $config;
+ global $board, $config;
- $board = array(
- 'uri' => $array['uri'],
- 'title' => $array['title'],
- 'subtitle' => $array['subtitle'],
- #'indexed' => $array['indexed'],
- );
+ $board = array(
+ 'uri' => $array['uri'],
+ 'title' => $array['title'],
+ 'subtitle' => $array['subtitle'],
+ #'indexed' => $array['indexed'],
+ );
- // older versions
- $board['name'] = &$board['title'];
+ // older versions
+ $board['name'] = &$board['title'];
- $board['dir'] = sprintf($config['board_path'], $board['uri']);
- $board['url'] = sprintf($config['board_abbreviation'], $board['uri']);
+ $board['dir'] = sprintf($config['board_path'], $board['uri']);
+ $board['url'] = sprintf($config['board_abbreviation'], $board['uri']);
- loadConfig();
+ loadConfig();
- if (!file_exists($board['dir']))
- @mkdir($board['dir'], 0777) or error("Couldn't create " . $board['dir'] . ". Check permissions.", true);
- if (!file_exists($board['dir'] . $config['dir']['img']))
- @mkdir($board['dir'] . $config['dir']['img'], 0777)
- or error("Couldn't create " . $board['dir'] . $config['dir']['img'] . ". Check permissions.", true);
- if (!file_exists($board['dir'] . $config['dir']['thumb']))
- @mkdir($board['dir'] . $config['dir']['thumb'], 0777)
- or error("Couldn't create " . $board['dir'] . $config['dir']['img'] . ". Check permissions.", true);
- if (!file_exists($board['dir'] . $config['dir']['res']))
- @mkdir($board['dir'] . $config['dir']['res'], 0777)
- or error("Couldn't create " . $board['dir'] . $config['dir']['img'] . ". Check permissions.", true);
+ if (!file_exists($board['dir']))
+ @mkdir($board['dir'], 0777) or error("Couldn't create " . $board['dir'] . ". Check permissions.", true);
+ if (!file_exists($board['dir'] . $config['dir']['img']))
+ @mkdir($board['dir'] . $config['dir']['img'], 0777)
+ or error("Couldn't create " . $board['dir'] . $config['dir']['img'] . ". Check permissions.", true);
+ if (!file_exists($board['dir'] . $config['dir']['thumb']))
+ @mkdir($board['dir'] . $config['dir']['thumb'], 0777)
+ or error("Couldn't create " . $board['dir'] . $config['dir']['img'] . ". Check permissions.", true);
+ if (!file_exists($board['dir'] . $config['dir']['res']))
+ @mkdir($board['dir'] . $config['dir']['res'], 0777)
+ or error("Couldn't create " . $board['dir'] . $config['dir']['img'] . ". Check permissions.", true);
}
function openBoard($uri) {
- global $config, $build_pages, $board;
+ global $config, $build_pages, $board;
- if ($config['try_smarter'])
- $build_pages = array();
+ if ($config['try_smarter'])
+ $build_pages = array();
- // And what if we don't really need to change a board we have opened?
- if (isset ($board) && isset ($board['uri']) && $board['uri'] == $uri) {
- return true;
- }
+ // And what if we don't really need to change a board we have opened?
+ if (isset ($board) && isset ($board['uri']) && $board['uri'] == $uri) {
+ return true;
+ }
- $b = getBoardInfo($uri);
- if ($b) {
- setupBoard($b);
+ $b = getBoardInfo($uri);
+ if ($b) {
+ setupBoard($b);
- if (function_exists('after_open_board')) {
- after_open_board();
- }
+ if (function_exists('after_open_board')) {
+ after_open_board();
+ }
- return true;
- }
- return false;
+ return true;
+ }
+ return false;
}
function getBoardInfo($uri) {
- global $config;
+ global $config;
- if ($config['cache']['enabled'] && ($board = cache::get('board_' . $uri))) {
- return $board;
- }
+ if ($config['cache']['enabled'] && ($board = cache::get('board_' . $uri))) {
+ return $board;
+ }
- $query = prepare("SELECT * FROM ``boards`` WHERE `uri` = :uri LIMIT 1");
- $query->bindValue(':uri', $uri);
- $query->execute() or error(db_error($query));
+ $query = prepare("SELECT * FROM ``boards`` WHERE `uri` = :uri LIMIT 1");
+ $query->bindValue(':uri', $uri);
+ $query->execute() or error(db_error($query));
- if ($board = $query->fetch(PDO::FETCH_ASSOC)) {
- if ($config['cache']['enabled'])
- cache::set('board_' . $uri, $board);
- return $board;
- }
+ if ($board = $query->fetch(PDO::FETCH_ASSOC)) {
+ if ($config['cache']['enabled'])
+ cache::set('board_' . $uri, $board);
+ return $board;
+ }
- return false;
+ return false;
}
function boardTitle($uri) {
- $board = getBoardInfo($uri);
- if ($board)
- return $board['title'];
- return false;
+ $board = getBoardInfo($uri);
+ if ($board)
+ return $board['title'];
+ return false;
}
function purge($uri) {
- global $config, $debug;
+ global $config, $debug;
- // Fix for Unicode
- $uri = rawurlencode($uri);
+ // Fix for Unicode
+ $uri = rawurlencode($uri);
- $noescape = "/!~*()+:";
- $noescape = preg_split('//', $noescape);
- $noescape_url = array_map("rawurlencode", $noescape);
- $uri = str_replace($noescape_url, $noescape, $uri);
+ $noescape = "/!~*()+:";
+ $noescape = preg_split('//', $noescape);
+ $noescape_url = array_map("rawurlencode", $noescape);
+ $uri = str_replace($noescape_url, $noescape, $uri);
- if (preg_match($config['referer_match'], $config['root']) && isset($_SERVER['REQUEST_URI'])) {
- $uri = (str_replace('\\', '/', dirname($_SERVER['REQUEST_URI'])) == '/' ? '/' : str_replace('\\', '/', dirname($_SERVER['REQUEST_URI'])) . '/') . $uri;
- } else {
- $uri = $config['root'] . $uri;
- }
+ if (preg_match($config['referer_match'], $config['root']) && isset($_SERVER['REQUEST_URI'])) {
+ $uri = (str_replace('\\', '/', dirname($_SERVER['REQUEST_URI'])) == '/' ? '/' : str_replace('\\', '/', dirname($_SERVER['REQUEST_URI'])) . '/') . $uri;
+ } else {
+ $uri = $config['root'] . $uri;
+ }
- if ($config['debug']) {
- $debug['purge'][] = $uri;
- }
+ if ($config['debug']) {
+ $debug['purge'][] = $uri;
+ }
- foreach ($config['purge'] as &$purge) {
- $host = &$purge[0];
- $port = &$purge[1];
- $http_host = isset($purge[2]) ? $purge[2] : (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : 'localhost');
- $request = "PURGE {$uri} HTTP/1.1\r\nHost: {$http_host}\r\nUser-Agent: Tinyboard\r\nConnection: Close\r\n\r\n";
- if ($fp = fsockopen($host, $port, $errno, $errstr, $config['purge_timeout'])) {
- fwrite($fp, $request);
- fclose($fp);
- } else {
- // Cannot connect?
- error('Could not PURGE for ' . $host);
- }
- }
+ foreach ($config['purge'] as &$purge) {
+ $host = &$purge[0];
+ $port = &$purge[1];
+ $http_host = isset($purge[2]) ? $purge[2] : (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : 'localhost');
+ $request = "PURGE {$uri} HTTP/1.1\r\nHost: {$http_host}\r\nUser-Agent: Tinyboard\r\nConnection: Close\r\n\r\n";
+ if ($fp = fsockopen($host, $port, $errno, $errstr, $config['purge_timeout'])) {
+ fwrite($fp, $request);
+ fclose($fp);
+ } else {
+ // Cannot connect?
+ error('Could not PURGE for ' . $host);
+ }
+ }
}
function file_write($path, $data, $simple = false, $skip_purge = false) {
- global $config, $debug;
+ global $config, $debug;
- if (preg_match('/^remote:\/\/(.+)\:(.+)$/', $path, $m)) {
- if (isset($config['remote'][$m[1]])) {
- require_once 'inc/remote.php';
+ if (preg_match('/^remote:\/\/(.+)\:(.+)$/', $path, $m)) {
+ if (isset($config['remote'][$m[1]])) {
+ require_once 'inc/remote.php';
- $remote = new Remote($config['remote'][$m[1]]);
- $remote->write($data, $m[2]);
- return;
- } else {
- error('Invalid remote server: ' . $m[1]);
- }
- }
+ $remote = new Remote($config['remote'][$m[1]]);
+ $remote->write($data, $m[2]);
+ return;
+ } else {
+ error('Invalid remote server: ' . $m[1]);
+ }
+ }
- if (!$fp = fopen($path, $simple ? 'w' : 'c'))
- error('Unable to open file for writing: ' . $path);
+ if (!$fp = fopen($path, $simple ? 'w' : 'c'))
+ error('Unable to open file for writing: ' . $path);
- // File locking
- if (!$simple && !flock($fp, LOCK_EX)) {
- error('Unable to lock file: ' . $path);
- }
+ // File locking
+ if (!$simple && !flock($fp, LOCK_EX)) {
+ error('Unable to lock file: ' . $path);
+ }
- // Truncate file
- if (!$simple && !ftruncate($fp, 0))
- error('Unable to truncate file: ' . $path);
+ // Truncate file
+ if (!$simple && !ftruncate($fp, 0))
+ error('Unable to truncate file: ' . $path);
- // Write data
- if (($bytes = fwrite($fp, $data)) === false)
- error('Unable to write to file: ' . $path);
+ // Write data
+ if (($bytes = fwrite($fp, $data)) === false)
+ error('Unable to write to file: ' . $path);
- // Unlock
- if (!$simple)
- flock($fp, LOCK_UN);
+ // Unlock
+ if (!$simple)
+ flock($fp, LOCK_UN);
- // Close
- if (!fclose($fp))
- error('Unable to close file: ' . $path);
+ // Close
+ if (!fclose($fp))
+ error('Unable to close file: ' . $path);
- /**
- * Create gzipped file.
- *
- * When writing into a file foo.bar and the size is larger or equal to 1
- * KiB, this also produces the gzipped version foo.bar.gz
- *
- * This is useful with nginx with gzip_static on.
- */
- if ($config['gzip_static']) {
- $gzpath = "$path.gz";
+ /**
+ * Create gzipped file.
+ *
+ * When writing into a file foo.bar and the size is larger or equal to 1
+ * KiB, this also produces the gzipped version foo.bar.gz
+ *
+ * This is useful with nginx with gzip_static on.
+ */
+ if ($config['gzip_static']) {
+ $gzpath = "$path.gz";
- if ($bytes & ~0x3ff) { // if ($bytes >= 1024)
- if (file_put_contents($gzpath, gzencode($data), $simple ? 0 : LOCK_EX) === false)
- error("Unable to write to file: $gzpath");
- //if (!touch($gzpath, filemtime($path), fileatime($path)))
- // error("Unable to touch file: $gzpath");
- }
- else {
- @unlink($gzpath);
- }
- }
+ if ($bytes & ~0x3ff) { // if ($bytes >= 1024)
+ if (file_put_contents($gzpath, gzencode($data), $simple ? 0 : LOCK_EX) === false)
+ error("Unable to write to file: $gzpath");
+ //if (!touch($gzpath, filemtime($path), fileatime($path)))
+ // error("Unable to touch file: $gzpath");
+ }
+ else {
+ @unlink($gzpath);
+ }
+ }
- if (!$skip_purge && isset($config['purge'])) {
- // Purge cache
- if (basename($path) == $config['file_index']) {
- // Index file (/index.html); purge "/" as well
- $uri = dirname($path);
- // root
- if ($uri == '.')
- $uri = '';
- else
- $uri .= '/';
- purge($uri);
- }
- purge($path);
- }
+ if (!$skip_purge && isset($config['purge'])) {
+ // Purge cache
+ if (basename($path) == $config['file_index']) {
+ // Index file (/index.html); purge "/" as well
+ $uri = dirname($path);
+ // root
+ if ($uri == '.')
+ $uri = '';
+ else
+ $uri .= '/';
+ purge($uri);
+ }
+ purge($path);
+ }
- if ($config['debug']) {
- $debug['write'][] = $path . ': ' . $bytes . ' bytes';
- }
+ if ($config['debug']) {
+ $debug['write'][] = $path . ': ' . $bytes . ' bytes';
+ }
- event('write', $path);
+ event('write', $path);
}
function file_unlink($path) {
- global $config, $debug;
+ global $config, $debug;
- if ($config['debug']) {
- if (!isset($debug['unlink']))
- $debug['unlink'] = array();
- $debug['unlink'][] = $path;
- }
+ if ($config['debug']) {
+ if (!isset($debug['unlink']))
+ $debug['unlink'] = array();
+ $debug['unlink'][] = $path;
+ }
- $ret = @unlink($path);
+ $ret = @unlink($path);
if ($config['gzip_static']) {
$gzpath = "$path.gz";
- @unlink($gzpath);
- }
+ @unlink($gzpath);
+ }
- if (isset($config['purge']) && $path[0] != '/' && isset($_SERVER['HTTP_HOST'])) {
- // Purge cache
- if (basename($path) == $config['file_index']) {
- // Index file (/index.html); purge "/" as well
- $uri = dirname($path);
- // root
- if ($uri == '.')
- $uri = '';
- else
- $uri .= '/';
- purge($uri);
- }
- purge($path);
- }
+ if (isset($config['purge']) && $path[0] != '/' && isset($_SERVER['HTTP_HOST'])) {
+ // Purge cache
+ if (basename($path) == $config['file_index']) {
+ // Index file (/index.html); purge "/" as well
+ $uri = dirname($path);
+ // root
+ if ($uri == '.')
+ $uri = '';
+ else
+ $uri .= '/';
+ purge($uri);
+ }
+ purge($path);
+ }
- event('unlink', $path);
+ event('unlink', $path);
- return $ret;
+ return $ret;
}
function hasPermission($action = null, $board = null, $_mod = null) {
- global $config;
+ global $config;
- if (isset($_mod))
- $mod = &$_mod;
- else
- global $mod;
+ if (isset($_mod))
+ $mod = &$_mod;
+ else
+ global $mod;
- if (!is_array($mod))
- return false;
+ if (!is_array($mod))
+ return false;
- if (isset($action) && $mod['type'] < $action)
- return false;
+ if (isset($action) && $mod['type'] < $action)
+ return false;
- if (!isset($board) || $config['mod']['skip_per_board'])
- return true;
+ if (!isset($board) || $config['mod']['skip_per_board'])
+ return true;
- if (!isset($mod['boards']))
- return false;
+ if (!isset($mod['boards']))
+ return false;
- if (!in_array('*', $mod['boards']) && !in_array($board, $mod['boards']))
- return false;
+ if (!in_array('*', $mod['boards']) && !in_array($board, $mod['boards']))
+ return false;
- return true;
+ return true;
}
function listBoards($just_uri = false) {
- global $config;
+ global $config;
- $just_uri ? $cache_name = 'all_boards_uri' : $cache_name = 'all_boards';
+ $just_uri ? $cache_name = 'all_boards_uri' : $cache_name = 'all_boards';
- if ($config['cache']['enabled'] && ($boards = cache::get($cache_name)))
- return $boards;
+ if ($config['cache']['enabled'] && ($boards = cache::get($cache_name)))
+ return $boards;
- if (!$just_uri) {
- $query = query("SELECT * FROM ``boards`` ORDER BY `uri`") or error(db_error());
- $boards = $query->fetchAll();
- } else {
- $boards = array();
- $query = query("SELECT `uri` FROM ``boards``") or error(db_error());
- while ($board = $query->fetchColumn()) {
- $boards[] = $board;
- }
- }
+ if (!$just_uri) {
+ $query = query("SELECT * FROM ``boards`` ORDER BY `uri`") or error(db_error());
+ $boards = $query->fetchAll();
+ } else {
+ $boards = array();
+ $query = query("SELECT `uri` FROM ``boards``") or error(db_error());
+ while ($board = $query->fetchColumn()) {
+ $boards[] = $board;
+ }
+ }
- if ($config['cache']['enabled'])
- cache::set($cache_name, $boards);
+ if ($config['cache']['enabled'])
+ cache::set($cache_name, $boards);
- return $boards;
+ return $boards;
}
function until($timestamp) {
- $difference = $timestamp - time();
- switch(TRUE){
- case ($difference < 60):
- return $difference . ' ' . ngettext('second', 'seconds', $difference);
- case ($difference < 3600): //60*60 = 3600
- return ($num = round($difference/(60))) . ' ' . ngettext('minute', 'minutes', $num);
- case ($difference < 86400): //60*60*24 = 86400
- return ($num = round($difference/(3600))) . ' ' . ngettext('hour', 'hours', $num);
- case ($difference < 604800): //60*60*24*7 = 604800
- return ($num = round($difference/(86400))) . ' ' . ngettext('day', 'days', $num);
- case ($difference < 31536000): //60*60*24*365 = 31536000
- return ($num = round($difference/(604800))) . ' ' . ngettext('week', 'weeks', $num);
- default:
- return ($num = round($difference/(31536000))) . ' ' . ngettext('year', 'years', $num);
- }
+ $difference = $timestamp - time();
+ switch(TRUE){
+ case ($difference < 60):
+ return $difference . ' ' . ngettext('second', 'seconds', $difference);
+ case ($difference < 3600): //60*60 = 3600
+ return ($num = round($difference/(60))) . ' ' . ngettext('minute', 'minutes', $num);
+ case ($difference < 86400): //60*60*24 = 86400
+ return ($num = round($difference/(3600))) . ' ' . ngettext('hour', 'hours', $num);
+ case ($difference < 604800): //60*60*24*7 = 604800
+ return ($num = round($difference/(86400))) . ' ' . ngettext('day', 'days', $num);
+ case ($difference < 31536000): //60*60*24*365 = 31536000
+ return ($num = round($difference/(604800))) . ' ' . ngettext('week', 'weeks', $num);
+ default:
+ return ($num = round($difference/(31536000))) . ' ' . ngettext('year', 'years', $num);
+ }
}
function ago($timestamp) {
- $difference = time() - $timestamp;
- switch(TRUE){
- case ($difference < 60) :
- return $difference . ' ' . ngettext('second', 'seconds', $difference);
- case ($difference < 3600): //60*60 = 3600
- return ($num = round($difference/(60))) . ' ' . ngettext('minute', 'minutes', $num);
- case ($difference < 86400): //60*60*24 = 86400
- return ($num = round($difference/(3600))) . ' ' . ngettext('hour', 'hours', $num);
- case ($difference < 604800): //60*60*24*7 = 604800
- return ($num = round($difference/(86400))) . ' ' . ngettext('day', 'days', $num);
- case ($difference < 31536000): //60*60*24*365 = 31536000
- return ($num = round($difference/(604800))) . ' ' . ngettext('week', 'weeks', $num);
- default:
- return ($num = round($difference/(31536000))) . ' ' . ngettext('year', 'years', $num);
- }
+ $difference = time() - $timestamp;
+ switch(TRUE){
+ case ($difference < 60) :
+ return $difference . ' ' . ngettext('second', 'seconds', $difference);
+ case ($difference < 3600): //60*60 = 3600
+ return ($num = round($difference/(60))) . ' ' . ngettext('minute', 'minutes', $num);
+ case ($difference < 86400): //60*60*24 = 86400
+ return ($num = round($difference/(3600))) . ' ' . ngettext('hour', 'hours', $num);
+ case ($difference < 604800): //60*60*24*7 = 604800
+ return ($num = round($difference/(86400))) . ' ' . ngettext('day', 'days', $num);
+ case ($difference < 31536000): //60*60*24*365 = 31536000
+ return ($num = round($difference/(604800))) . ' ' . ngettext('week', 'weeks', $num);
+ default:
+ return ($num = round($difference/(31536000))) . ' ' . ngettext('year', 'years', $num);
+ }
}
function displayBan($ban) {
- global $config, $board;
+ global $config, $board;
- if (!$ban['seen']) {
- Bans::seen($ban['id']);
- }
+ if (!$ban['seen']) {
+ Bans::seen($ban['id']);
+ }
- $ban['ip'] = $_SERVER['REMOTE_ADDR'];
+ $ban['ip'] = $_SERVER['REMOTE_ADDR'];
- if ($ban['post'] && isset($ban['post']['board'], $ban['post']['id'])) {
- if (openBoard($ban['post']['board'])) {
- $query = query(sprintf("SELECT `files` FROM ``posts_%s`` WHERE `id` = " .
- (int)$ban['post']['id'], $board['uri']));
- if ($_post = $query->fetch(PDO::FETCH_ASSOC)) {
- $ban['post'] = array_merge($ban['post'], $_post);
- }
- }
- if ($ban['post']['thread']) {
- $post = new Post($ban['post']);
- } else {
- $post = new Thread($ban['post'], null, false, false);
- }
- }
-
- $denied_appeals = array();
- $pending_appeal = false;
-
- if ($config['ban_appeals']) {
- $query = query("SELECT `time`, `denied` FROM ``ban_appeals`` WHERE `ban_id` = " . (int)$ban['id']) or error(db_error());
- while ($ban_appeal = $query->fetch(PDO::FETCH_ASSOC)) {
- if ($ban_appeal['denied']) {
- $denied_appeals[] = $ban_appeal['time'];
- } else {
- $pending_appeal = $ban_appeal['time'];
- }
- }
- }
-
- // Show banned page and exit
- die(
- Element('page.html', array(
- 'title' => _('Banned!'),
- 'config' => $config,
- 'boardlist' => createBoardlist(isset($mod) ? $mod : false),
- 'body' => Element('banned.html', array(
- 'config' => $config,
- 'ban' => $ban,
- 'board' => $board,
- 'post' => isset($post) ? $post->build(true) : false,
- 'denied_appeals' => $denied_appeals,
- 'pending_appeal' => $pending_appeal
- )
- ))
- ));
+ if ($ban['post'] && isset($ban['post']['board'], $ban['post']['id'])) {
+ if (openBoard($ban['post']['board'])) {
+ $query = query(sprintf("SELECT `files` FROM ``posts_%s`` WHERE `id` = " .
+ (int)$ban['post']['id'], $board['uri']));
+ if ($_post = $query->fetch(PDO::FETCH_ASSOC)) {
+ $ban['post'] = array_merge($ban['post'], $_post);
+ }
+ }
+ if ($ban['post']['thread']) {
+ $post = new Post($ban['post']);
+ } else {
+ $post = new Thread($ban['post'], null, false, false);
+ }
+ }
+
+ $denied_appeals = array();
+ $pending_appeal = false;
+
+ if ($config['ban_appeals']) {
+ $query = query("SELECT `time`, `denied` FROM ``ban_appeals`` WHERE `ban_id` = " . (int)$ban['id']) or error(db_error());
+ while ($ban_appeal = $query->fetch(PDO::FETCH_ASSOC)) {
+ if ($ban_appeal['denied']) {
+ $denied_appeals[] = $ban_appeal['time'];
+ } else {
+ $pending_appeal = $ban_appeal['time'];
+ }
+ }
+ }
+
+ // Show banned page and exit
+ die(
+ Element('page.html', array(
+ 'title' => _('Banned!'),
+ 'config' => $config,
+ 'boardlist' => createBoardlist(isset($mod) ? $mod : false),
+ 'body' => Element('banned.html', array(
+ 'config' => $config,
+ 'ban' => $ban,
+ 'board' => $board,
+ 'post' => isset($post) ? $post->build(true) : false,
+ 'denied_appeals' => $denied_appeals,
+ 'pending_appeal' => $pending_appeal
+ )
+ ))
+ ));
}
function checkBan($board = false) {
- global $config;
+ global $config;
- if (!isset($_SERVER['REMOTE_ADDR'])) {
- // Server misconfiguration
- return;
- }
+ if (!isset($_SERVER['REMOTE_ADDR'])) {
+ // Server misconfiguration
+ return;
+ }
- if (event('check-ban', $board))
- return true;
+ if (event('check-ban', $board))
+ return true;
- $ips = array();
+ $ips = array();
- $ips[] = $_SERVER['REMOTE_ADDR'];
+ $ips[] = $_SERVER['REMOTE_ADDR'];
- if ($config['proxy_check'] && isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
- $ips = array_merge($ips, explode(", ", $_SERVER['HTTP_X_FORWARDED_FOR']));
- }
+ if ($config['proxy_check'] && isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
+ $ips = array_merge($ips, explode(", ", $_SERVER['HTTP_X_FORWARDED_FOR']));
+ }
- foreach ($ips as $ip) {
- $bans = Bans::find($_SERVER['REMOTE_ADDR'], $board, $config['show_modname']);
-
- foreach ($bans as &$ban) {
- if ($ban['expires'] && $ban['expires'] < time()) {
- Bans::delete($ban['id']);
- if ($config['require_ban_view'] && !$ban['seen']) {
- if (!isset($_POST['json_response'])) {
- displayBan($ban);
- } else {
- header('Content-Type: text/json');
- die(json_encode(array('error' => true, 'banned' => true)));
- }
- }
- } else {
- if (!isset($_POST['json_response'])) {
- displayBan($ban);
- } else {
- header('Content-Type: text/json');
- die(json_encode(array('error' => true, 'banned' => true)));
- }
- }
- }
- }
+ foreach ($ips as $ip) {
+ $bans = Bans::find($_SERVER['REMOTE_ADDR'], $board, $config['show_modname']);
+
+ foreach ($bans as &$ban) {
+ if ($ban['expires'] && $ban['expires'] < time()) {
+ Bans::delete($ban['id']);
+ if ($config['require_ban_view'] && !$ban['seen']) {
+ if (!isset($_POST['json_response'])) {
+ displayBan($ban);
+ } else {
+ header('Content-Type: text/json');
+ die(json_encode(array('error' => true, 'banned' => true)));
+ }
+ }
+ } else {
+ if (!isset($_POST['json_response'])) {
+ displayBan($ban);
+ } else {
+ header('Content-Type: text/json');
+ die(json_encode(array('error' => true, 'banned' => true)));
+ }
+ }
+ }
+ }
- // I'm not sure where else to put this. It doesn't really matter where; it just needs to be called every
- // now and then to keep the ban list tidy.
- if ($config['cache']['enabled'] && $last_time_purged = cache::get('purged_bans_last')) {
- if (time() - $last_time_purged < $config['purge_bans'] )
- return;
- }
-
- Bans::purge();
-
- if ($config['cache']['enabled'])
- cache::set('purged_bans_last', time());
+ // I'm not sure where else to put this. It doesn't really matter where; it just needs to be called every
+ // now and then to keep the ban list tidy.
+ if ($config['cache']['enabled'] && $last_time_purged = cache::get('purged_bans_last')) {
+ if (time() - $last_time_purged < $config['purge_bans'] )
+ return;
+ }
+
+ Bans::purge();
+
+ if ($config['cache']['enabled'])
+ cache::set('purged_bans_last', time());
}
function threadLocked($id) {
- global $board;
+ global $board;
- if (event('check-locked', $id))
- return true;
+ if (event('check-locked', $id))
+ return true;
- $query = prepare(sprintf("SELECT `locked` FROM ``posts_%s`` WHERE `id` = :id AND `thread` IS NULL LIMIT 1", $board['uri']));
- $query->bindValue(':id', $id, PDO::PARAM_INT);
- $query->execute() or error(db_error());
+ $query = prepare(sprintf("SELECT `locked` FROM ``posts_%s`` WHERE `id` = :id AND `thread` IS NULL LIMIT 1", $board['uri']));
+ $query->bindValue(':id', $id, PDO::PARAM_INT);
+ $query->execute() or error(db_error());
- if (($locked = $query->fetchColumn()) === false) {
- // Non-existant, so it can't be locked...
- return false;
- }
+ if (($locked = $query->fetchColumn()) === false) {
+ // Non-existant, so it can't be locked...
+ return false;
+ }
- return (bool)$locked;
+ return (bool)$locked;
}
function threadSageLocked($id) {
- global $board;
+ global $board;
- if (event('check-sage-locked', $id))
- return true;
+ if (event('check-sage-locked', $id))
+ return true;
- $query = prepare(sprintf("SELECT `sage` FROM ``posts_%s`` WHERE `id` = :id AND `thread` IS NULL LIMIT 1", $board['uri']));
- $query->bindValue(':id', $id, PDO::PARAM_INT);
- $query->execute() or error(db_error());
+ $query = prepare(sprintf("SELECT `sage` FROM ``posts_%s`` WHERE `id` = :id AND `thread` IS NULL LIMIT 1", $board['uri']));
+ $query->bindValue(':id', $id, PDO::PARAM_INT);
+ $query->execute() or error(db_error());
- if (($sagelocked = $query->fetchColumn()) === false) {
- // Non-existant, so it can't be locked...
- return false;
- }
+ if (($sagelocked = $query->fetchColumn()) === false) {
+ // Non-existant, so it can't be locked...
+ return false;
+ }
- return (bool)$sagelocked;
+ return (bool)$sagelocked;
}
function threadExists($id) {
- global $board;
+ global $board;
- $query = prepare(sprintf("SELECT 1 FROM ``posts_%s`` WHERE `id` = :id AND `thread` IS NULL LIMIT 1", $board['uri']));
- $query->bindValue(':id', $id, PDO::PARAM_INT);
- $query->execute() or error(db_error());
+ $query = prepare(sprintf("SELECT 1 FROM ``posts_%s`` WHERE `id` = :id AND `thread` IS NULL LIMIT 1", $board['uri']));
+ $query->bindValue(':id', $id, PDO::PARAM_INT);
+ $query->execute() or error(db_error());
- if ($query->rowCount()) {
- return true;
- }
+ if ($query->rowCount()) {
+ return true;
+ }
- return false;
+ return false;
}
function insertFloodPost(array $post) {
- global $board;
-
- $query = prepare("INSERT INTO ``flood`` VALUES (NULL, :ip, :board, :time, :posthash, :filehash, :isreply)");
- $query->bindValue(':ip', $_SERVER['REMOTE_ADDR']);
- $query->bindValue(':board', $board['uri']);
- $query->bindValue(':time', time());
- $query->bindValue(':posthash', make_comment_hex($post['body_nomarkup']));
- if ($post['has_file'])
- $query->bindValue(':filehash', $post['filehash']);
- else
- $query->bindValue(':filehash', null, PDO::PARAM_NULL);
- $query->bindValue(':isreply', !$post['op'], PDO::PARAM_INT);
- $query->execute() or error(db_error($query));
+ global $board;
+
+ $query = prepare("INSERT INTO ``flood`` VALUES (NULL, :ip, :board, :time, :posthash, :filehash, :isreply)");
+ $query->bindValue(':ip', $_SERVER['REMOTE_ADDR']);
+ $query->bindValue(':board', $board['uri']);
+ $query->bindValue(':time', time());
+ $query->bindValue(':posthash', make_comment_hex($post['body_nomarkup']));
+ if ($post['has_file'])
+ $query->bindValue(':filehash', $post['filehash']);
+ else
+ $query->bindValue(':filehash', null, PDO::PARAM_NULL);
+ $query->bindValue(':isreply', !$post['op'], PDO::PARAM_INT);
+ $query->execute() or error(db_error($query));
}
function post(array $post) {
- global $pdo, $board,$config;
- $query = prepare(sprintf("INSERT INTO ``posts_%s`` VALUES ( NULL, :thread, :subject, :email, :name, :trip, :capcode, :body, :body_nomarkup, :time, :time, :files, :num_files, :filehash, :password, :ip, :sticky, :locked, :cycle, 0, :embed, :slug)", $board['uri']));
+ global $pdo, $board,$config;
+ $query = prepare(sprintf("INSERT INTO ``posts_%s`` VALUES ( NULL, :thread, :subject, :email, :name, :trip, :capcode, :body, :body_nomarkup, :time, :time, :files, :num_files, :filehash, :password, :ip, :sticky, :locked, :cycle, 0, :embed, :slug, :delete_token)", $board['uri']));
- // Basic stuff
- if (!empty($post['subject'])) {
- $query->bindValue(':subject', $post['subject']);
- } else {
- $query->bindValue(':subject', null, PDO::PARAM_NULL);
- }
+ // Basic stuff
+ if (!empty($post['subject'])) {
+ $query->bindValue(':subject', $post['subject']);
+ } else {
+ $query->bindValue(':subject', null, PDO::PARAM_NULL);
+ }
- if (!empty($post['email'])) {
- $query->bindValue(':email', $post['email']);
- } else {
- $query->bindValue(':email', null, PDO::PARAM_NULL);
- }
+ if (!empty($post['email'])) {
+ $query->bindValue(':email', $post['email']);
+ } else {
+ $query->bindValue(':email', null, PDO::PARAM_NULL);
+ }
- if (!empty($post['trip'])) {
- $query->bindValue(':trip', $post['trip']);
- } else {
- $query->bindValue(':trip', null, PDO::PARAM_NULL);
- }
+ if (!empty($post['trip'])) {
+ $query->bindValue(':trip', $post['trip']);
+ } else {
+ $query->bindValue(':trip', null, PDO::PARAM_NULL);
+ }
- $query->bindValue(':name', $post['name']);
- $query->bindValue(':body', $post['body']);
- $query->bindValue(':body_nomarkup', $post['body_nomarkup']);
- $query->bindValue(':time', isset($post['time']) ? $post['time'] : time(), PDO::PARAM_INT);
- $query->bindValue(':password', $post['password']);
- $query->bindValue(':ip', isset($post['ip']) ? $post['ip'] : $_SERVER['REMOTE_ADDR']);
+ $query->bindValue(':name', $post['name']);
+ $query->bindValue(':body', $post['body']);
+ $query->bindValue(':body_nomarkup', $post['body_nomarkup']);
+ $query->bindValue(':time', isset($post['time']) ? $post['time'] : time(), PDO::PARAM_INT);
+ $query->bindValue(':password', $post['password']);
+ $query->bindValue(':ip', isset($post['ip']) ? $post['ip'] : $_SERVER['REMOTE_ADDR']);
- if ($post['op'] && $post['mod'] && isset($post['sticky']) && $post['sticky']) {
- $query->bindValue(':sticky', true, PDO::PARAM_INT);
- } else {
- $query->bindValue(':sticky', false, PDO::PARAM_INT);
- }
+ if ($post['op'] && $post['mod'] && isset($post['sticky']) && $post['sticky']) {
+ $query->bindValue(':sticky', true, PDO::PARAM_INT);
+ } else {
+ $query->bindValue(':sticky', false, PDO::PARAM_INT);
+ }
- if ($post['op'] && $post['mod'] && isset($post['locked']) && $post['locked']) {
- $query->bindValue(':locked', true, PDO::PARAM_INT);
- } else {
- $query->bindValue(':locked', false, PDO::PARAM_INT);
- }
+ if ($post['op'] && $post['mod'] && isset($post['locked']) && $post['locked']) {
+ $query->bindValue(':locked', true, PDO::PARAM_INT);
+ } else {
+ $query->bindValue(':locked', false, PDO::PARAM_INT);
+ }
- if ($post['op'] && $post['mod'] && isset($post['cycle']) && $post['cycle']) {
- $query->bindValue(':cycle', true, PDO::PARAM_INT);
- } else {
- $query->bindValue(':cycle', false, PDO::PARAM_INT);
- }
+ if ($post['op'] && $post['mod'] && isset($post['cycle']) && $post['cycle']) {
+ $query->bindValue(':cycle', true, PDO::PARAM_INT);
+ } else {
+ $query->bindValue(':cycle', false, PDO::PARAM_INT);
+ }
- if ($post['mod'] && isset($post['capcode']) && $post['capcode']) {
- $query->bindValue(':capcode', $post['capcode'], PDO::PARAM_STR);
- } else {
- if ($config['joke_capcode'] && isset($post['capcode']) && $post['capcode'] === 'joke') {
- $query->bindValue(':capcode', $post['capcode'], PDO::PARAM_STR);
- }
- else {
- $query->bindValue(':capcode', null, PDO::PARAM_NULL);
- }
- }
+ if ($post['mod'] && isset($post['capcode']) && $post['capcode']) {
+ $query->bindValue(':capcode', $post['capcode'], PDO::PARAM_STR);
+ } else {
+ if ($config['joke_capcode'] && isset($post['capcode']) && $post['capcode'] === 'joke') {
+ $query->bindValue(':capcode', $post['capcode'], PDO::PARAM_STR);
+ }
+ else {
+ $query->bindValue(':capcode', null, PDO::PARAM_NULL);
+ }
+ }
- if (!empty($post['embed'])) {
- $query->bindValue(':embed', $post['embed']);
- } else {
- $query->bindValue(':embed', null, PDO::PARAM_NULL);
- }
+ if (!empty($post['embed'])) {
+ $query->bindValue(':embed', $post['embed']);
+ } else {
+ $query->bindValue(':embed', null, PDO::PARAM_NULL);
+ }
- if ($post['op']) {
- // No parent thread, image
- $query->bindValue(':thread', null, PDO::PARAM_NULL);
- } else {
- $query->bindValue(':thread', $post['thread'], PDO::PARAM_INT);
- }
+ if ($post['op']) {
+ // No parent thread, image
+ $query->bindValue(':thread', null, PDO::PARAM_NULL);
+ } else {
+ $query->bindValue(':thread', $post['thread'], PDO::PARAM_INT);
+ }
- if ($post['has_file']) {
- $query->bindValue(':files', json_encode($post['files']));
- $query->bindValue(':num_files', $post['num_files']);
- $query->bindValue(':filehash', $post['filehash']);
- } else {
- $query->bindValue(':files', null, PDO::PARAM_NULL);
- $query->bindValue(':num_files', 0);
- $query->bindValue(':filehash', null, PDO::PARAM_NULL);
- }
+ if ($post['has_file']) {
+ $query->bindValue(':files', json_encode($post['files']));
+ $query->bindValue(':num_files', $post['num_files']);
+ $query->bindValue(':filehash', $post['filehash']);
+ } else {
+ $query->bindValue(':files', null, PDO::PARAM_NULL);
+ $query->bindValue(':num_files', 0);
+ $query->bindValue(':filehash', null, PDO::PARAM_NULL);
+ }
- if ($post['op']) {
- $query->bindValue(':slug', slugify($post));
- }
- else {
- $query->bindValue(':slug', NULL);
- }
+ if ($post['op']) {
+ $query->bindValue(':slug', slugify($post));
+ }
+ else {
+ $query->bindValue(':slug', NULL);
+ }
- if (!$query->execute()) {
- undoImage($post);
- error(db_error($query));
- }
+ if ($config['spam_noticer']['enabled']) {
+ $query->bindValue(':delete_token', $post['delete_token']);
+ } else {
+ $query->bindValue(':delete_token', NULL);
+ }
- return $pdo->lastInsertId();
+ if (!$query->execute()) {
+ undoImage($post);
+ error(db_error($query));
+ }
+
+ return $pdo->lastInsertId();
}
function bumpThread($id) {
- global $config, $board, $build_pages;
+ global $config, $board, $build_pages;
- if (event('bump', $id))
- return true;
+ if (event('bump', $id))
+ return true;
- if ($config['try_smarter']) {
- $build_pages = array_merge(range(1, thread_find_page($id)), $build_pages);
- }
+ if ($config['try_smarter']) {
+ $build_pages = array_merge(range(1, thread_find_page($id)), $build_pages);
+ }
- $query = prepare(sprintf("UPDATE ``posts_%s`` SET `bump` = :time WHERE `id` = :id AND `thread` IS NULL", $board['uri']));
- $query->bindValue(':time', time(), PDO::PARAM_INT);
- $query->bindValue(':id', $id, PDO::PARAM_INT);
- $query->execute() or error(db_error($query));
+ $query = prepare(sprintf("UPDATE ``posts_%s`` SET `bump` = :time WHERE `id` = :id AND `thread` IS NULL", $board['uri']));
+ $query->bindValue(':time', time(), PDO::PARAM_INT);
+ $query->bindValue(':id', $id, PDO::PARAM_INT);
+ $query->execute() or error(db_error($query));
}
// Remove file from post
-function deleteFile($id, $remove_entirely_if_already=true, $file=null) {
- global $board, $config;
+function deleteFile($id, $remove_entirely_if_already=true, $file=null, $alert_spamnoticer=false) {
+ global $board, $config;
- $query = prepare(sprintf("SELECT `thread`, `files`, `num_files` FROM ``posts_%s`` WHERE `id` = :id LIMIT 1", $board['uri']));
- $query->bindValue(':id', $id, PDO::PARAM_INT);
- $query->execute() or error(db_error($query));
- if (!$post = $query->fetch(PDO::FETCH_ASSOC))
- error($config['error']['invalidpost']);
- $files = json_decode($post['files']);
- $file_to_delete = $file !== false ? $files[(int)$file] : (object)array('file' => false);
+ $query = prepare(sprintf("SELECT `thread`, `files`, `num_files`, `delete_token` FROM ``posts_%s`` WHERE `id` = :id LIMIT 1", $board['uri']));
+ $query->bindValue(':id', $id, PDO::PARAM_INT);
+ $query->execute() or error(db_error($query));
+ if (!$post = $query->fetch(PDO::FETCH_ASSOC))
+ error($config['error']['invalidpost']);
+ $files = json_decode($post['files']);
+ $file_to_delete = $file !== false ? $files[(int)$file] : (object)array('file' => false);
- if (!$files[0]) error(_('That post has no files.'));
+ if (!$files[0]) error(_('That post has no files.'));
- if ($files[0]->file == 'deleted' && $post['num_files'] == 1 && !$post['thread'])
- return; // Can't delete OP's image completely.
+ if ($files[0]->file == 'deleted' && $post['num_files'] == 1 && !$post['thread'])
+ return; // Can't delete OP's image completely.
- $query = prepare(sprintf("UPDATE ``posts_%s`` SET `files` = :file WHERE `id` = :id", $board['uri']));
- if (($file && $file_to_delete->file == 'deleted') && $remove_entirely_if_already) {
- // Already deleted; remove file fully
- $files[$file] = null;
- } else {
- foreach ($files as $i => $f) {
- if (($file !== false && $i == $file) || $file === null) {
- // Delete thumbnail
- if (isset ($f->thumb) && $f->thumb) {
- file_unlink($board['dir'] . $config['dir']['thumb'] . $f->thumb);
- unset($files[$i]->thumb);
- }
+ $query = prepare(sprintf("UPDATE ``posts_%s`` SET `files` = :file WHERE `id` = :id", $board['uri']));
+ if (($file && $file_to_delete->file == 'deleted') && $remove_entirely_if_already) {
+ // Already deleted; remove file fully
+ $files[$file] = null;
+ } else {
+ foreach ($files as $i => $f) {
+ if (($file !== false && $i == $file) || $file === null) {
+ // Delete thumbnail
+ if (isset ($f->thumb) && $f->thumb) {
+ file_unlink($board['dir'] . $config['dir']['thumb'] . $f->thumb);
+ unset($files[$i]->thumb);
+ }
- // Delete file
- file_unlink($board['dir'] . $config['dir']['img'] . $f->file);
- $files[$i]->file = 'deleted';
- }
- }
- }
+ // Delete file
+ file_unlink($board['dir'] . $config['dir']['img'] . $f->file);
+ $files[$i]->file = 'deleted';
+ }
+ }
+ }
- $query->bindValue(':file', json_encode($files), PDO::PARAM_STR);
+ $query->bindValue(':file', json_encode($files), PDO::PARAM_STR);
- $query->bindValue(':id', $id, PDO::PARAM_INT);
- $query->execute() or error(db_error($query));
+ $query->bindValue(':id', $id, PDO::PARAM_INT);
+ $query->execute() or error(db_error($query));
- if ($post['thread'])
- buildThread($post['thread']);
- else
- buildThread($id);
+ if ($alert_spamnoticer) {
+ $delete_tokens = array();
+
+ if ($post['delete_token']) {
+ $delete_tokens[] = $post['delete_token'];
+ }
+
+ removeRecentPostFromSpamnoticer($config, $delete_tokens, true);
+ }
+
+ if ($post['thread'])
+ buildThread($post['thread']);
+ else
+ buildThread($id);
}
// rebuild post (markup)
function rebuildPost($id) {
- global $board, $mod;
+ global $board, $mod;
- $query = prepare(sprintf("SELECT * FROM ``posts_%s`` WHERE `id` = :id", $board['uri']));
- $query->bindValue(':id', $id, PDO::PARAM_INT);
- $query->execute() or error(db_error($query));
+ $query = prepare(sprintf("SELECT * FROM ``posts_%s`` WHERE `id` = :id", $board['uri']));
+ $query->bindValue(':id', $id, PDO::PARAM_INT);
+ $query->execute() or error(db_error($query));
- if ((!$post = $query->fetch(PDO::FETCH_ASSOC)) || !$post['body_nomarkup'])
- return false;
+ if ((!$post = $query->fetch(PDO::FETCH_ASSOC)) || !$post['body_nomarkup']) {
+ return false;
+ }
- markup($post['body'] = &$post['body_nomarkup']);
- $post = (object)$post;
- event('rebuildpost', $post);
- $post = (array)$post;
+ markup($post['body'] = &$post['body_nomarkup']);
+ $post = (object)$post;
+ event('rebuildpost', $post);
+ $post = (array)$post;
- $query = prepare(sprintf("UPDATE ``posts_%s`` SET `body` = :body WHERE `id` = :id", $board['uri']));
- $query->bindValue(':body', $post['body']);
- $query->bindValue(':id', $id, PDO::PARAM_INT);
- $query->execute() or error(db_error($query));
+ $query = prepare(sprintf("UPDATE ``posts_%s`` SET `body` = :body WHERE `id` = :id", $board['uri']));
+ $query->bindValue(':body', $post['body']);
+ $query->bindValue(':id', $id, PDO::PARAM_INT);
+ $query->execute() or error(db_error($query));
- buildThread($post['thread'] ? $post['thread'] : $id);
+ buildThread($post['thread'] ? $post['thread'] : $id);
- return true;
+ return true;
}
// Delete a post (reply or thread)
-function deletePost($id, $error_if_doesnt_exist=true, $rebuild_after=true) {
- global $board, $config;
+function deletePost($id, $error_if_doesnt_exist=true, $rebuild_after=true, $alert_spamnoticer=false) {
+ global $board, $config;
- // Select post and replies (if thread) in one query
- $query = prepare(sprintf("SELECT `id`,`thread`,`files`,`slug` FROM ``posts_%s`` WHERE `id` = :id OR `thread` = :id", $board['uri']));
- $query->bindValue(':id', $id, PDO::PARAM_INT);
- $query->execute() or error(db_error($query));
+ // Select post and replies (if thread) in one query
+ $query = prepare(sprintf("SELECT `id`,`thread`,`files`,`slug`, `delete_token` FROM ``posts_%s`` WHERE `id` = :id OR `thread` = :id", $board['uri']));
+ $query->bindValue(':id', $id, PDO::PARAM_INT);
+ $query->execute() or error(db_error($query));
- if ($query->rowCount() < 1) {
- if ($error_if_doesnt_exist)
- error($config['error']['invalidpost']);
- else return false;
- }
+ if ($query->rowCount() < 1) {
- $ids = array();
+ if ($error_if_doesnt_exist) {
+ error($config['error']['invalidpost']);
+ } else {
+ return false;
+ }
+ }
- // Delete posts and maybe replies
- while ($post = $query->fetch(PDO::FETCH_ASSOC)) {
- event('delete', $post);
-
- $thread_id = $post['thread'];
- if (!$post['thread']) {
- // Delete thread HTML page
- file_unlink($board['dir'] . $config['dir']['res'] . link_for($post) );
- file_unlink($board['dir'] . $config['dir']['res'] . link_for($post, true) ); // noko50
- file_unlink($board['dir'] . $config['dir']['res'] . sprintf('%d.json', $post['id']));
+ $ids = array();
+ $delete_tokens = array();
- $antispam_query = prepare('DELETE FROM ``antispam`` WHERE `board` = :board AND `thread` = :thread');
- $antispam_query->bindValue(':board', $board['uri']);
- $antispam_query->bindValue(':thread', $post['id']);
- $antispam_query->execute() or error(db_error($antispam_query));
- } elseif ($query->rowCount() == 1) {
- // Rebuild thread
- $rebuild = &$post['thread'];
- }
- if ($post['files']) {
- // Delete file
- foreach (json_decode($post['files']) as $i => $f) {
- if ($f->file !== 'deleted') {
- file_unlink($board['dir'] . $config['dir']['img'] . $f->file);
- file_unlink($board['dir'] . $config['dir']['thumb'] . $f->thumb);
- }
- }
- }
+ // Delete posts and maybe replies
+ while ($post = $query->fetch(PDO::FETCH_ASSOC)) {
- $ids[] = (int)$post['id'];
+ event('delete', $post);
+ $thread_id = $post['thread'];
- }
+ if (!$post['thread']) {
+ // Delete thread HTML page
+ file_unlink($board['dir'] . $config['dir']['res'] . link_for($post) );
+ file_unlink($board['dir'] . $config['dir']['res'] . link_for($post, true) ); // noko50
+ file_unlink($board['dir'] . $config['dir']['res'] . sprintf('%d.json', $post['id']));
- $query = prepare(sprintf("DELETE FROM ``posts_%s`` WHERE `id` = :id OR `thread` = :id", $board['uri']));
- $query->bindValue(':id', $id, PDO::PARAM_INT);
- $query->execute() or error(db_error($query));
+ $antispam_query = prepare('DELETE FROM ``antispam`` WHERE `board` = :board AND `thread` = :thread');
+ $antispam_query->bindValue(':board', $board['uri']);
+ $antispam_query->bindValue(':thread', $post['id']);
+ $antispam_query->execute() or error(db_error($antispam_query));
+ } elseif ($query->rowCount() == 1) {
+ // Rebuild thread
+ $rebuild = &$post['thread'];
+ }
- $query = prepare("SELECT `board`, `post` FROM ``cites`` WHERE `target_board` = :board AND (`target` = " . implode(' OR `target` = ', $ids) . ") ORDER BY `board`");
- $query->bindValue(':board', $board['uri']);
- $query->execute() or error(db_error($query));
- while ($cite = $query->fetch(PDO::FETCH_ASSOC)) {
- if ($board['uri'] != $cite['board']) {
- if (!isset($tmp_board))
- $tmp_board = $board['uri'];
- openBoard($cite['board']);
- }
- rebuildPost($cite['post']);
- }
+ if ($post['files']) {
+ // Delete file
+ foreach (json_decode($post['files']) as $i => $f) {
+ if ($f->file !== 'deleted') {
+ file_unlink($board['dir'] . $config['dir']['img'] . $f->file);
+ file_unlink($board['dir'] . $config['dir']['thumb'] . $f->thumb);
+ }
+ }
+ }
- if (isset($tmp_board))
- openBoard($tmp_board);
+ $ids[] = (int) $post['id'];
- $query = prepare("DELETE FROM ``cites`` WHERE (`target_board` = :board AND (`target` = " . implode(' OR `target` = ', $ids) . ")) OR (`board` = :board AND (`post` = " . implode(' OR `post` = ', $ids) . "))");
- $query->bindValue(':board', $board['uri']);
- $query->execute() or error(db_error($query));
-
- if ($config['anti_bump_flood']) {
- $query = prepare(sprintf("SELECT `time` FROM ``posts_%s`` WHERE (`thread` = :thread OR `id` = :thread) AND `sage` = 0 ORDER BY `time` DESC LIMIT 1", $board['uri']));
- $query->bindValue(':thread', $thread_id);
- $query->execute() or error(db_error($query));
- $bump = $query->fetchColumn();
- $query = prepare(sprintf("UPDATE ``posts_%s`` SET `bump` = :bump WHERE `id` = :thread", $board['uri']));
- $query->bindValue(':bump', $bump);
- $query->bindValue(':thread', $thread_id);
- $query->execute() or error(db_error($query));
- }
-
- if (isset($rebuild) && $rebuild_after) {
- buildThread($rebuild);
- buildIndex();
- }
+ if ($post['delete_token']) {
+ $delete_tokens[] = $post['delete_token'];
+ }
+ }
- return true;
+
+ $query = prepare(sprintf("DELETE FROM ``posts_%s`` WHERE `id` = :id OR `thread` = :id", $board['uri']));
+ $query->bindValue(':id', $id, PDO::PARAM_INT);
+ $query->execute() or error(db_error($query));
+
+ if ($alert_spamnoticer) {
+ removeRecentPostFromSpamnoticer($config, $delete_tokens);
+ }
+
+ $query = prepare("SELECT `board`, `post` FROM ``cites`` WHERE `target_board` = :board AND (`target` = " . implode(' OR `target` = ', $ids) . ") ORDER BY `board`");
+ $query->bindValue(':board', $board['uri']);
+ $query->execute() or error(db_error($query));
+
+ while ($cite = $query->fetch(PDO::FETCH_ASSOC)) {
+ if ($board['uri'] != $cite['board']) {
+ if (!isset($tmp_board))
+ $tmp_board = $board['uri'];
+ openBoard($cite['board']);
+ }
+ rebuildPost($cite['post']);
+ }
+
+ if (isset($tmp_board))
+ openBoard($tmp_board);
+
+ $query = prepare("DELETE FROM ``cites`` WHERE (`target_board` = :board AND (`target` = " . implode(' OR `target` = ', $ids) . ")) OR (`board` = :board AND (`post` = " . implode(' OR `post` = ', $ids) . "))");
+ $query->bindValue(':board', $board['uri']);
+ $query->execute() or error(db_error($query));
+
+ if ($config['anti_bump_flood']) {
+ $query = prepare(sprintf("SELECT `time` FROM ``posts_%s`` WHERE (`thread` = :thread OR `id` = :thread) AND `sage` = 0 ORDER BY `time` DESC LIMIT 1", $board['uri']));
+ $query->bindValue(':thread', $thread_id);
+ $query->execute() or error(db_error($query));
+ $bump = $query->fetchColumn();
+ $query = prepare(sprintf("UPDATE ``posts_%s`` SET `bump` = :bump WHERE `id` = :thread", $board['uri']));
+ $query->bindValue(':bump', $bump);
+ $query->bindValue(':thread', $thread_id);
+ $query->execute() or error(db_error($query));
+ }
+
+ if (isset($rebuild) && $rebuild_after) {
+ buildThread($rebuild);
+ buildIndex();
+ }
+
+ return true;
}
function clean($pid = false) {
- global $board, $config;
- $offset = round($config['max_pages']*$config['threads_per_page']);
+ global $board, $config;
+ $offset = round($config['max_pages']*$config['threads_per_page']);
- // I too wish there was an easier way of doing this...
- $query = prepare(sprintf("SELECT `id` FROM ``posts_%s`` WHERE `thread` IS NULL ORDER BY `sticky` DESC, `bump` DESC LIMIT :offset, 9001", $board['uri']));
- $query->bindValue(':offset', $offset, PDO::PARAM_INT);
+ // I too wish there was an easier way of doing this...
+ $query = prepare(sprintf("SELECT `id` FROM ``posts_%s`` WHERE `thread` IS NULL ORDER BY `sticky` DESC, `bump` DESC LIMIT :offset, 9001", $board['uri']));
+ $query->bindValue(':offset', $offset, PDO::PARAM_INT);
- $query->execute() or error(db_error($query));
- while ($post = $query->fetch(PDO::FETCH_ASSOC)) {
- deletePost($post['id'], false, false);
- if ($pid) modLog("Automatically deleting thread #{$post['id']} due to new thread #{$pid}");
- }
+ $query->execute() or error(db_error($query));
+ while ($post = $query->fetch(PDO::FETCH_ASSOC)) {
+ deletePost($post['id'], false, false);
+ if ($pid) modLog("Automatically deleting thread #{$post['id']} due to new thread #{$pid}");
+ }
- // Bump off threads with X replies earlier, spam prevention method
- if ($config['early_404']) {
- $offset = round($config['early_404_page']*$config['threads_per_page']);
- $query = prepare(sprintf("SELECT `id` AS `thread_id`, (SELECT COUNT(`id`) FROM ``posts_%s`` WHERE `thread` = `thread_id`) AS `reply_count` FROM ``posts_%s`` WHERE `thread` IS NULL ORDER BY `sticky` DESC, `bump` DESC LIMIT :offset, 9001", $board['uri'], $board['uri']));
- $query->bindValue(':offset', $offset, PDO::PARAM_INT);
- $query->execute() or error(db_error($query));
-
- while ($post = $query->fetch(PDO::FETCH_ASSOC)) {
- if ($post['reply_count'] < $config['early_404_replies']) {
- deletePost($post['thread_id'], false, false);
- if ($pid) modLog("Automatically deleting thread #{$post['thread_id']} due to new thread #{$pid} (early 404 is set, #{$post['thread_id']} had {$post['reply_count']} replies)");
- }
- }
- }
+ // Bump off threads with X replies earlier, spam prevention method
+ if ($config['early_404']) {
+ $offset = round($config['early_404_page']*$config['threads_per_page']);
+ $query = prepare(sprintf("SELECT `id` AS `thread_id`, (SELECT COUNT(`id`) FROM ``posts_%s`` WHERE `thread` = `thread_id`) AS `reply_count` FROM ``posts_%s`` WHERE `thread` IS NULL ORDER BY `sticky` DESC, `bump` DESC LIMIT :offset, 9001", $board['uri'], $board['uri']));
+ $query->bindValue(':offset', $offset, PDO::PARAM_INT);
+ $query->execute() or error(db_error($query));
+
+ while ($post = $query->fetch(PDO::FETCH_ASSOC)) {
+ if ($post['reply_count'] < $config['early_404_replies']) {
+ deletePost($post['thread_id'], false, false);
+ if ($pid) modLog("Automatically deleting thread #{$post['thread_id']} due to new thread #{$pid} (early 404 is set, #{$post['thread_id']} had {$post['reply_count']} replies)");
+ }
+ }
+ }
}
function thread_find_page($thread) {
- global $config, $board;
+ global $config, $board;
- $query = query(sprintf("SELECT `id` FROM ``posts_%s`` WHERE `thread` IS NULL ORDER BY `sticky` DESC, `bump` DESC", $board['uri'])) or error(db_error($query));
- $threads = $query->fetchAll(PDO::FETCH_COLUMN);
- if (($index = array_search($thread, $threads)) === false)
- return false;
- return floor(($config['threads_per_page'] + $index) / $config['threads_per_page']);
+ $query = query(sprintf("SELECT `id` FROM ``posts_%s`` WHERE `thread` IS NULL ORDER BY `sticky` DESC, `bump` DESC", $board['uri'])) or error(db_error($query));
+ $threads = $query->fetchAll(PDO::FETCH_COLUMN);
+ if (($index = array_search($thread, $threads)) === false)
+ return false;
+ return floor(($config['threads_per_page'] + $index) / $config['threads_per_page']);
}
// $brief means that we won't need to generate anything yet
function index($page, $mod=false, $brief = false) {
- global $board, $config, $debug;
+ global $board, $config, $debug;
- $body = '';
- $offset = round($page*$config['threads_per_page']-$config['threads_per_page']);
+ $body = '';
+ $offset = round($page*$config['threads_per_page']-$config['threads_per_page']);
- $query = prepare(sprintf("SELECT *,'%s' as board FROM ``posts_%s`` WHERE `thread` IS NULL ORDER BY `sticky` DESC, `bump` DESC LIMIT :offset,:threads_per_page", $board['uri'], $board['uri']));
- $query->bindValue(':offset', $offset, PDO::PARAM_INT);
- $query->bindValue(':threads_per_page', $config['threads_per_page'], PDO::PARAM_INT);
- $query->execute() or error(db_error($query));
+ $query = prepare(sprintf("SELECT *,'%s' as board FROM ``posts_%s`` WHERE `thread` IS NULL ORDER BY `sticky` DESC, `bump` DESC LIMIT :offset,:threads_per_page", $board['uri'], $board['uri']));
+ $query->bindValue(':offset', $offset, PDO::PARAM_INT);
+ $query->bindValue(':threads_per_page', $config['threads_per_page'], PDO::PARAM_INT);
+ $query->execute() or error(db_error($query));
- if ($page == 1 && $query->rowCount() < $config['threads_per_page'])
- $board['thread_count'] = $query->rowCount();
+ if ($page == 1 && $query->rowCount() < $config['threads_per_page'])
+ $board['thread_count'] = $query->rowCount();
- if ($query->rowCount() < 1 && $page > 1)
- return false;
+ if ($query->rowCount() < 1 && $page > 1)
+ return false;
- $threads = array();
-
- while ($th = $query->fetch(PDO::FETCH_ASSOC)) {
- $thread = new Thread($th, $mod ? '?/' : $config['root'], $mod);
+ $threads = array();
+
+ while ($th = $query->fetch(PDO::FETCH_ASSOC)) {
+ $thread = new Thread($th, $mod ? '?/' : $config['root'], $mod);
- if ($config['cache']['enabled']) {
- $cached = cache::get("thread_index_{$board['uri']}_{$th['id']}");
- if (isset($cached['replies'], $cached['omitted'])) {
- $replies = $cached['replies'];
- $omitted = $cached['omitted'];
- } else {
- unset($cached);
- }
- }
+ if ($config['cache']['enabled']) {
+ $cached = cache::get("thread_index_{$board['uri']}_{$th['id']}");
+ if (isset($cached['replies'], $cached['omitted'])) {
+ $replies = $cached['replies'];
+ $omitted = $cached['omitted'];
+ } else {
+ unset($cached);
+ }
+ }
- if (!isset($cached)) {
- $posts = prepare(sprintf("SELECT * FROM ``posts_%s`` WHERE `thread` = :id ORDER BY `id` DESC LIMIT :limit", $board['uri']));
- $posts->bindValue(':id', $th['id']);
- $posts->bindValue(':limit', ($th['sticky'] ? $config['threads_preview_sticky'] : $config['threads_preview']), PDO::PARAM_INT);
- $posts->execute() or error(db_error($posts));
+ if (!isset($cached)) {
+ $posts = prepare(sprintf("SELECT * FROM ``posts_%s`` WHERE `thread` = :id ORDER BY `id` DESC LIMIT :limit", $board['uri']));
+ $posts->bindValue(':id', $th['id']);
+ $posts->bindValue(':limit', ($th['sticky'] ? $config['threads_preview_sticky'] : $config['threads_preview']), PDO::PARAM_INT);
+ $posts->execute() or error(db_error($posts));
- $replies = array_reverse($posts->fetchAll(PDO::FETCH_ASSOC));
+ $replies = array_reverse($posts->fetchAll(PDO::FETCH_ASSOC));
- if (count($replies) == ($th['sticky'] ? $config['threads_preview_sticky'] : $config['threads_preview'])) {
- $count = numPosts($th['id']);
- $omitted = array('post_count' => $count['replies'], 'image_count' => $count['images']);
- } else {
- $omitted = false;
- }
+ if (count($replies) == ($th['sticky'] ? $config['threads_preview_sticky'] : $config['threads_preview'])) {
+ $count = numPosts($th['id']);
+ $omitted = array('post_count' => $count['replies'], 'image_count' => $count['images']);
+ } else {
+ $omitted = false;
+ }
- if ($config['cache']['enabled'])
- cache::set("thread_index_{$board['uri']}_{$th['id']}", array(
- 'replies' => $replies,
- 'omitted' => $omitted,
- ));
- }
+ if ($config['cache']['enabled'])
+ cache::set("thread_index_{$board['uri']}_{$th['id']}", array(
+ 'replies' => $replies,
+ 'omitted' => $omitted,
+ ));
+ }
- $num_images = 0;
- foreach ($replies as $po) {
- if ($po['num_files'])
- $num_images+=$po['num_files'];
+ $num_images = 0;
+ foreach ($replies as $po) {
+ if ($po['num_files'])
+ $num_images+=$po['num_files'];
- $thread->add(new Post($po, $mod ? '?/' : $config['root'], $mod));
- }
+ $thread->add(new Post($po, $mod ? '?/' : $config['root'], $mod));
+ }
- $thread->images = $num_images;
- $thread->replies = isset($omitted['post_count']) ? $omitted['post_count'] : count($replies);
+ $thread->images = $num_images;
+ $thread->replies = isset($omitted['post_count']) ? $omitted['post_count'] : count($replies);
- if ($omitted) {
- $thread->omitted = $omitted['post_count'] - ($th['sticky'] ? $config['threads_preview_sticky'] : $config['threads_preview']);
- $thread->omitted_images = $omitted['image_count'] - $num_images;
- }
-
- $threads[] = $thread;
+ if ($omitted) {
+ $thread->omitted = $omitted['post_count'] - ($th['sticky'] ? $config['threads_preview_sticky'] : $config['threads_preview']);
+ $thread->omitted_images = $omitted['image_count'] - $num_images;
+ }
+
+ $threads[] = $thread;
- if (!$brief) {
- $body .= $thread->build(true);
- }
- }
+ if (!$brief) {
+ $body .= $thread->build(true);
+ }
+ }
- if ($config['file_board']) {
- $body = Element('fileboard.html', array('body' => $body, 'mod' => $mod));
- }
+ if ($config['file_board']) {
+ $body = Element('fileboard.html', array('body' => $body, 'mod' => $mod));
+ }
- return array(
- 'board' => $board,
- 'body' => $body,
- 'post_url' => $config['post_url'],
- 'config' => $config,
- 'boardlist' => createBoardlist($mod),
- 'threads' => $threads,
- );
+ return array(
+ 'board' => $board,
+ 'body' => $body,
+ 'post_url' => $config['post_url'],
+ 'config' => $config,
+ 'boardlist' => createBoardlist($mod),
+ 'threads' => $threads,
+ );
}
function getPageButtons($pages, $mod=false) {
- global $config, $board;
+ global $config, $board;
- $btn = array();
- $root = ($mod ? '?/' : $config['root']) . $board['dir'];
+ $btn = array();
+ $root = ($mod ? '?/' : $config['root']) . $board['dir'];
- foreach ($pages as $num => $page) {
- if (isset($page['selected'])) {
- // Previous button
- if ($num == 0) {
- // There is no previous page.
- $btn['prev'] = _('Previous');
- } else {
- $loc = ($mod ? '?/' . $board['uri'] . '/' : '') .
- ($num == 1 ?
- $config['file_index']
- :
- sprintf($config['file_page'], $num)
- );
+ foreach ($pages as $num => $page) {
+ if (isset($page['selected'])) {
+ // Previous button
+ if ($num == 0) {
+ // There is no previous page.
+ $btn['prev'] = _('Previous');
+ } else {
+ $loc = ($mod ? '?/' . $board['uri'] . '/' : '') .
+ ($num == 1 ?
+ $config['file_index']
+ :
+ sprintf($config['file_page'], $num)
+ );
- $btn['prev'] = '
';
- }
+ $btn['prev'] = '';
+ }
- if ($num == count($pages) - 1) {
- // There is no next page.
- $btn['next'] = _('Next');
- } else {
- $loc = ($mod ? '?/' . $board['uri'] . '/' : '') . sprintf($config['file_page'], $num + 2);
+ if ($num == count($pages) - 1) {
+ // There is no next page.
+ $btn['next'] = _('Next');
+ } else {
+ $loc = ($mod ? '?/' . $board['uri'] . '/' : '') . sprintf($config['file_page'], $num + 2);
- $btn['next'] = '';
- }
- }
- }
+ $btn['next'] = '';
+ }
+ }
+ }
- return $btn;
+ return $btn;
}
function getPages($mod=false) {
- global $board, $config;
+ global $board, $config;
- if (isset($board['thread_count'])) {
- $count = $board['thread_count'];
- } else {
- // Count threads
- $query = query(sprintf("SELECT COUNT(*) FROM ``posts_%s`` WHERE `thread` IS NULL", $board['uri'])) or error(db_error());
- $count = $query->fetchColumn();
- }
- $count = floor(($config['threads_per_page'] + $count - 1) / $config['threads_per_page']);
+ if (isset($board['thread_count'])) {
+ $count = $board['thread_count'];
+ } else {
+ // Count threads
+ $query = query(sprintf("SELECT COUNT(*) FROM ``posts_%s`` WHERE `thread` IS NULL", $board['uri'])) or error(db_error());
+ $count = $query->fetchColumn();
+ }
+ $count = floor(($config['threads_per_page'] + $count - 1) / $config['threads_per_page']);
- if ($count < 1) $count = 1;
+ if ($count < 1) $count = 1;
- $pages = array();
- for ($x=0;$x<$count && $x<$config['max_pages'];$x++) {
- $pages[] = array(
- 'num' => $x+1,
- 'link' => $x==0 ? ($mod ? '?/' : $config['root']) . $board['dir'] . $config['file_index'] : ($mod ? '?/' : $config['root']) . $board['dir'] . sprintf($config['file_page'], $x+1)
- );
- }
+ $pages = array();
+ for ($x=0;$x<$count && $x<$config['max_pages'];$x++) {
+ $pages[] = array(
+ 'num' => $x+1,
+ 'link' => $x==0 ? ($mod ? '?/' : $config['root']) . $board['dir'] . $config['file_index'] : ($mod ? '?/' : $config['root']) . $board['dir'] . sprintf($config['file_page'], $x+1)
+ );
+ }
- return $pages;
+ return $pages;
}
// Stolen with permission from PlainIB (by Frank Usrs)
function make_comment_hex($str) {
- // remove cross-board citations
- // the numbers don't matter
- $str = preg_replace('!>>>/[A-Za-z0-9]+/!', '', $str);
+ // remove cross-board citations
+ // the numbers don't matter
+ $str = preg_replace('!>>>/[A-Za-z0-9]+/!', '', $str);
- if (function_exists('iconv')) {
- // remove diacritics and other noise
- // FIXME: this removes cyrillic entirely
- $oldstr = $str;
- $str = @iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $str);
- if (!$str) $str = $oldstr;
- }
+ if (function_exists('iconv')) {
+ // remove diacritics and other noise
+ // FIXME: this removes cyrillic entirely
+ $oldstr = $str;
+ $str = @iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $str);
+ if (!$str) $str = $oldstr;
+ }
- $str = strtolower($str);
+ $str = strtolower($str);
- // strip all non-alphabet characters
- $str = preg_replace('/[^a-z]/', '', $str);
+ // strip all non-alphabet characters
+ $str = preg_replace('/[^a-z]/', '', $str);
- return md5($str);
+ return md5($str);
}
function makerobot($body) {
- global $config;
- $body = strtolower($body);
+ global $config;
+ $body = strtolower($body);
- // Leave only letters
- $body = preg_replace('/[^a-z]/i', '', $body);
- // Remove repeating characters
- if ($config['robot_strip_repeating'])
- $body = preg_replace('/(.)\\1+/', '$1', $body);
+ // Leave only letters
+ $body = preg_replace('/[^a-z]/i', '', $body);
+ // Remove repeating characters
+ if ($config['robot_strip_repeating'])
+ $body = preg_replace('/(.)\\1+/', '$1', $body);
- return sha1($body);
+ return sha1($body);
}
function checkRobot($body) {
- if (empty($body) || event('check-robot', $body))
- return true;
+ if (empty($body) || event('check-robot', $body))
+ return true;
- $body = makerobot($body);
- $query = prepare("SELECT 1 FROM ``robot`` WHERE `hash` = :hash LIMIT 1");
- $query->bindValue(':hash', $body);
- $query->execute() or error(db_error($query));
+ $body = makerobot($body);
+ $query = prepare("SELECT 1 FROM ``robot`` WHERE `hash` = :hash LIMIT 1");
+ $query->bindValue(':hash', $body);
+ $query->execute() or error(db_error($query));
- if ($query->fetchColumn()) {
- return true;
- }
+ if ($query->fetchColumn()) {
+ return true;
+ }
- // Insert new hash
- $query = prepare("INSERT INTO ``robot`` VALUES (:hash)");
- $query->bindValue(':hash', $body);
- $query->execute() or error(db_error($query));
+ // Insert new hash
+ $query = prepare("INSERT INTO ``robot`` VALUES (:hash)");
+ $query->bindValue(':hash', $body);
+ $query->execute() or error(db_error($query));
- return false;
+ return false;
}
// Returns an associative array with 'replies' and 'images' keys
function numPosts($id) {
- global $board;
- $query = prepare(sprintf("SELECT COUNT(*) AS `replies`, SUM(`num_files`) AS `images` FROM ``posts_%s`` WHERE `thread` = :thread", $board['uri'], $board['uri']));
- $query->bindValue(':thread', $id, PDO::PARAM_INT);
- $query->execute() or error(db_error($query));
+ global $board;
+ $query = prepare(sprintf("SELECT COUNT(*) AS `replies`, SUM(`num_files`) AS `images` FROM ``posts_%s`` WHERE `thread` = :thread", $board['uri'], $board['uri']));
+ $query->bindValue(':thread', $id, PDO::PARAM_INT);
+ $query->execute() or error(db_error($query));
- return $query->fetch(PDO::FETCH_ASSOC);
+ return $query->fetch(PDO::FETCH_ASSOC);
}
function muteTime() {
- global $config;
+ global $config;
- if ($time = event('mute-time'))
- return $time;
+ if ($time = event('mute-time'))
+ return $time;
- // Find number of mutes in the past X hours
- $query = prepare("SELECT COUNT(*) FROM ``mutes`` WHERE `time` >= :time AND `ip` = :ip");
- $query->bindValue(':time', time()-($config['robot_mute_hour']*3600), PDO::PARAM_INT);
- $query->bindValue(':ip', $_SERVER['REMOTE_ADDR']);
- $query->execute() or error(db_error($query));
+ // Find number of mutes in the past X hours
+ $query = prepare("SELECT COUNT(*) FROM ``mutes`` WHERE `time` >= :time AND `ip` = :ip");
+ $query->bindValue(':time', time()-($config['robot_mute_hour']*3600), PDO::PARAM_INT);
+ $query->bindValue(':ip', $_SERVER['REMOTE_ADDR']);
+ $query->execute() or error(db_error($query));
- if (!$result = $query->fetchColumn())
- return 0;
- return pow($config['robot_mute_multiplier'], $result);
+ if (!$result = $query->fetchColumn())
+ return 0;
+ return pow($config['robot_mute_multiplier'], $result);
}
function mute() {
- // Insert mute
- $query = prepare("INSERT INTO ``mutes`` VALUES (:ip, :time)");
- $query->bindValue(':time', time(), PDO::PARAM_INT);
- $query->bindValue(':ip', $_SERVER['REMOTE_ADDR']);
- $query->execute() or error(db_error($query));
+ // Insert mute
+ $query = prepare("INSERT INTO ``mutes`` VALUES (:ip, :time)");
+ $query->bindValue(':time', time(), PDO::PARAM_INT);
+ $query->bindValue(':ip', $_SERVER['REMOTE_ADDR']);
+ $query->execute() or error(db_error($query));
- return muteTime();
+ return muteTime();
}
function checkMute() {
- global $config, $debug;
+ global $config, $debug;
- if ($config['cache']['enabled']) {
- // Cached mute?
- if (($mute = cache::get("mute_${_SERVER['REMOTE_ADDR']}")) && ($mutetime = cache::get("mutetime_${_SERVER['REMOTE_ADDR']}"))) {
- error(sprintf($config['error']['youaremuted'], $mute['time'] + $mutetime - time()));
- }
- }
+ if ($config['cache']['enabled']) {
+ // Cached mute?
+ if (($mute = cache::get("mute_${_SERVER['REMOTE_ADDR']}")) && ($mutetime = cache::get("mutetime_${_SERVER['REMOTE_ADDR']}"))) {
+ error(sprintf($config['error']['youaremuted'], $mute['time'] + $mutetime - time()));
+ }
+ }
- $mutetime = muteTime();
- if ($mutetime > 0) {
- // Find last mute time
- $query = prepare("SELECT `time` FROM ``mutes`` WHERE `ip` = :ip ORDER BY `time` DESC LIMIT 1");
- $query->bindValue(':ip', $_SERVER['REMOTE_ADDR']);
- $query->execute() or error(db_error($query));
+ $mutetime = muteTime();
+ if ($mutetime > 0) {
+ // Find last mute time
+ $query = prepare("SELECT `time` FROM ``mutes`` WHERE `ip` = :ip ORDER BY `time` DESC LIMIT 1");
+ $query->bindValue(':ip', $_SERVER['REMOTE_ADDR']);
+ $query->execute() or error(db_error($query));
- if (!$mute = $query->fetch(PDO::FETCH_ASSOC)) {
- // What!? He's muted but he's not muted...
- return;
- }
+ if (!$mute = $query->fetch(PDO::FETCH_ASSOC)) {
+ // What!? He's muted but he's not muted...
+ return;
+ }
- if ($mute['time'] + $mutetime > time()) {
- if ($config['cache']['enabled']) {
- cache::set("mute_${_SERVER['REMOTE_ADDR']}", $mute, $mute['time'] + $mutetime - time());
- cache::set("mutetime_${_SERVER['REMOTE_ADDR']}", $mutetime, $mute['time'] + $mutetime - time());
- }
- // Not expired yet
- error(sprintf($config['error']['youaremuted'], $mute['time'] + $mutetime - time()));
- } else {
- // Already expired
- return;
- }
- }
+ if ($mute['time'] + $mutetime > time()) {
+ if ($config['cache']['enabled']) {
+ cache::set("mute_${_SERVER['REMOTE_ADDR']}", $mute, $mute['time'] + $mutetime - time());
+ cache::set("mutetime_${_SERVER['REMOTE_ADDR']}", $mutetime, $mute['time'] + $mutetime - time());
+ }
+ // Not expired yet
+ error(sprintf($config['error']['youaremuted'], $mute['time'] + $mutetime - time()));
+ } else {
+ // Already expired
+ return;
+ }
+ }
}
function buildIndex($global_api = "yes") {
- global $board, $config, $build_pages;
+ global $board, $config, $build_pages;
- $catalog_api_action = generation_strategy('sb_api', array($board['uri']));
+ $catalog_api_action = generation_strategy('sb_api', array($board['uri']));
- $pages = null;
- $antibot = null;
+ $pages = null;
+ $antibot = null;
- if ($config['api']['enabled']) {
- $api = new Api();
- $catalog = array();
- }
+ if ($config['api']['enabled']) {
+ $api = new Api();
+ $catalog = array();
+ }
- for ($page = 1; $page <= $config['max_pages']; $page++) {
- $filename = $board['dir'] . ($page == 1 ? $config['file_index'] : sprintf($config['file_page'], $page));
- $jsonFilename = $board['dir'] . ($page - 1) . '.json'; // pages should start from 0
+ for ($page = 1; $page <= $config['max_pages']; $page++) {
+ $filename = $board['dir'] . ($page == 1 ? $config['file_index'] : sprintf($config['file_page'], $page));
+ $jsonFilename = $board['dir'] . ($page - 1) . '.json'; // pages should start from 0
- $wont_build_this_page = $config['try_smarter'] && isset($build_pages) && !empty($build_pages) && !in_array($page, $build_pages);
+ $wont_build_this_page = $config['try_smarter'] && isset($build_pages) && !empty($build_pages) && !in_array($page, $build_pages);
- if ((!$config['api']['enabled'] || $global_api == "skip") && $wont_build_this_page)
- continue;
+ if ((!$config['api']['enabled'] || $global_api == "skip") && $wont_build_this_page)
+ continue;
- $action = generation_strategy('sb_board', array($board['uri'], $page));
- if ($action == 'rebuild' || $catalog_api_action == 'rebuild') {
- $content = index($page, false, $wont_build_this_page);
- if (!$content)
- break;
+ $action = generation_strategy('sb_board', array($board['uri'], $page));
+ if ($action == 'rebuild' || $catalog_api_action == 'rebuild') {
+ $content = index($page, false, $wont_build_this_page);
+ if (!$content)
+ break;
- // json api
- if ($config['api']['enabled']) {
- $threads = $content['threads'];
- $json = json_encode($api->translatePage($threads));
- file_write($jsonFilename, $json);
+ // json api
+ if ($config['api']['enabled']) {
+ $threads = $content['threads'];
+ $json = json_encode($api->translatePage($threads));
+ file_write($jsonFilename, $json);
- $catalog[$page-1] = $threads;
+ $catalog[$page-1] = $threads;
- if ($wont_build_this_page) continue;
- }
+ if ($wont_build_this_page) continue;
+ }
- if ($config['try_smarter']) {
- $antibot = create_antibot($board['uri'], 0 - $page);
- $content['current_page'] = $page;
- }
- elseif (!$antibot) {
- $antibot = create_antibot($board['uri']);
- }
- $antibot->reset();
- if (!$pages) {
- $pages = getPages();
- }
- $content['pages'] = $pages;
- $content['pages'][$page-1]['selected'] = true;
- $content['btn'] = getPageButtons($content['pages']);
- $content['antibot'] = $antibot;
+ if ($config['try_smarter']) {
+ $antibot = create_antibot($board['uri'], 0 - $page);
+ $content['current_page'] = $page;
+ }
+ elseif (!$antibot) {
+ $antibot = create_antibot($board['uri']);
+ }
+ $antibot->reset();
+ if (!$pages) {
+ $pages = getPages();
+ }
+ $content['pages'] = $pages;
+ $content['pages'][$page-1]['selected'] = true;
+ $content['btn'] = getPageButtons($content['pages']);
+ $content['antibot'] = $antibot;
- file_write($filename, Element('index.html', $content));
- }
- elseif ($action == 'delete' || $catalog_api_action == 'delete') {
- file_unlink($filename);
- file_unlink($jsonFilename);
- }
- }
+ file_write($filename, Element('index.html', $content));
+ }
+ elseif ($action == 'delete' || $catalog_api_action == 'delete') {
+ file_unlink($filename);
+ file_unlink($jsonFilename);
+ }
+ }
- // $action is an action for our last page
- if (($catalog_api_action == 'rebuild' || $action == 'rebuild' || $action == 'delete') && $page < $config['max_pages']) {
- for (;$page<=$config['max_pages'];$page++) {
- $filename = $board['dir'] . ($page==1 ? $config['file_index'] : sprintf($config['file_page'], $page));
- file_unlink($filename);
+ // $action is an action for our last page
+ if (($catalog_api_action == 'rebuild' || $action == 'rebuild' || $action == 'delete') && $page < $config['max_pages']) {
+ for (;$page<=$config['max_pages'];$page++) {
+ $filename = $board['dir'] . ($page==1 ? $config['file_index'] : sprintf($config['file_page'], $page));
+ file_unlink($filename);
- if ($config['api']['enabled']) {
- $jsonFilename = $board['dir'] . ($page - 1) . '.json';
- file_unlink($jsonFilename);
- }
- }
- }
+ if ($config['api']['enabled']) {
+ $jsonFilename = $board['dir'] . ($page - 1) . '.json';
+ file_unlink($jsonFilename);
+ }
+ }
+ }
- // json api catalog
- if ($config['api']['enabled'] && $global_api != "skip") {
- if ($catalog_api_action == 'delete') {
- $jsonFilename = $board['dir'] . 'catalog.json';
- file_unlink($jsonFilename);
- $jsonFilename = $board['dir'] . 'threads.json';
- file_unlink($jsonFilename);
- }
- elseif ($catalog_api_action == 'rebuild') {
- $json = json_encode($api->translateCatalog($catalog));
- $jsonFilename = $board['dir'] . 'catalog.json';
- file_write($jsonFilename, $json);
+ // json api catalog
+ if ($config['api']['enabled'] && $global_api != "skip") {
+ if ($catalog_api_action == 'delete') {
+ $jsonFilename = $board['dir'] . 'catalog.json';
+ file_unlink($jsonFilename);
+ $jsonFilename = $board['dir'] . 'threads.json';
+ file_unlink($jsonFilename);
+ }
+ elseif ($catalog_api_action == 'rebuild') {
+ $json = json_encode($api->translateCatalog($catalog));
+ $jsonFilename = $board['dir'] . 'catalog.json';
+ file_write($jsonFilename, $json);
- $json = json_encode($api->translateCatalog($catalog, true));
- $jsonFilename = $board['dir'] . 'threads.json';
- file_write($jsonFilename, $json);
- }
- }
+ $json = json_encode($api->translateCatalog($catalog, true));
+ $jsonFilename = $board['dir'] . 'threads.json';
+ file_write($jsonFilename, $json);
+ }
+ }
- if ($config['try_smarter'])
- $build_pages = array();
+ if ($config['try_smarter'])
+ $build_pages = array();
}
function buildJavascript() {
- global $config;
+ global $config;
- $stylesheets = array();
- foreach ($config['stylesheets'] as $name => $uri) {
- $stylesheets[] = array(
- 'name' => addslashes($name),
- 'uri' => addslashes((!empty($uri) ? $config['uri_stylesheets'] : '') . $uri));
- }
+ $stylesheets = array();
+ foreach ($config['stylesheets'] as $name => $uri) {
+ $stylesheets[] = array(
+ 'name' => addslashes($name),
+ 'uri' => addslashes((!empty($uri) ? $config['uri_stylesheets'] : '') . $uri));
+ }
- $code_stylesheets = array();
- foreach ($config['code_stylesheets'] as $name => $uri) {
- $code_stylesheets[] = array(
- 'name' => addslashes($name),
- 'uri' => addslashes((!empty($uri) ? $config['uri_stylesheets'] : '') . $uri));
- }
+ $code_stylesheets = array();
+ foreach ($config['code_stylesheets'] as $name => $uri) {
+ $code_stylesheets[] = array(
+ 'name' => addslashes($name),
+ 'uri' => addslashes((!empty($uri) ? $config['uri_stylesheets'] : '') . $uri));
+ }
- $script = Element('main.js', array(
- 'config' => $config,
- 'stylesheets' => $stylesheets,
- 'code_stylesheets' => $code_stylesheets
- ));
+ $script = Element('main.js', array(
+ 'config' => $config,
+ 'stylesheets' => $stylesheets,
+ 'code_stylesheets' => $code_stylesheets
+ ));
- // Check if we have translation for the javascripts; if yes, we add it to additional javascripts
- list($pure_locale) = explode(".", $config['locale']);
- if (file_exists ($jsloc = "inc/locale/$pure_locale/LC_MESSAGES/javascript.js")) {
- $script = file_get_contents($jsloc) . "\n\n" . $script;
- }
+ // Check if we have translation for the javascripts; if yes, we add it to additional javascripts
+ list($pure_locale) = explode(".", $config['locale']);
+ if (file_exists ($jsloc = "inc/locale/$pure_locale/LC_MESSAGES/javascript.js")) {
+ $script = file_get_contents($jsloc) . "\n\n" . $script;
+ }
- if ($config['additional_javascript_compile']) {
- foreach (array_merge($config['additional_javascript'], $config['additional_javascript_defer']) as $file) {
- $script .= file_get_contents($file);
- }
- }
+ if ($config['additional_javascript_compile']) {
+ foreach (array_merge($config['additional_javascript'], $config['additional_javascript_defer']) as $file) {
+ $script .= file_get_contents($file);
+ }
+ }
- if ($config['minify_js']) {
- require_once 'inc/lib/minify/JSMin.php';
- $script = JSMin::minify($script);
- }
+ if ($config['minify_js']) {
+ require_once 'vendor/autoload.php';
+ $script = JSMin\JSMin::minify($script);
+ }
- file_write($config['file_script'], $script);
+ file_write($config['file_script'], $script);
}
function checkDNSBL() {
- global $config;
+ global $config;
- if (isIPv6())
- return; // No IPv6 support yet.
+ if (isIPv6())
+ return; // No IPv6 support yet.
- if (!isset($_SERVER['REMOTE_ADDR']))
- return; // Fix your web server configuration
+ if (!isset($_SERVER['REMOTE_ADDR']))
+ return; // Fix your web server configuration
- if (preg_match("/^(::(ffff:)?)?(127\.|192\.168\.|10\.|172\.(1[6-9]|2[0-9]|3[0-1])\.|0\.|255\.)/", $_SERVER['REMOTE_ADDR']))
- return; // It's pointless to check for local IP addresses in dnsbls, isn't it?
+ if (preg_match("/^(::(ffff:)?)?(127\.|192\.168\.|10\.|172\.(1[6-9]|2[0-9]|3[0-1])\.|0\.|255\.)/", $_SERVER['REMOTE_ADDR']))
+ return; // It's pointless to check for local IP addresses in dnsbls, isn't it?
- if (in_array($_SERVER['REMOTE_ADDR'], $config['dnsbl_exceptions']))
- return;
+ if (in_array($_SERVER['REMOTE_ADDR'], $config['dnsbl_exceptions']))
+ return;
- $ipaddr = ReverseIPOctets($_SERVER['REMOTE_ADDR']);
+ $ipaddr = ReverseIPOctets($_SERVER['REMOTE_ADDR']);
- foreach ($config['dnsbl'] as $blacklist) {
- if (!is_array($blacklist))
- $blacklist = array($blacklist);
+ foreach ($config['dnsbl'] as $blacklist) {
+ if (!is_array($blacklist))
+ $blacklist = array($blacklist);
- if (($lookup = str_replace('%', $ipaddr, $blacklist[0])) == $blacklist[0])
- $lookup = $ipaddr . '.' . $blacklist[0];
+ if (($lookup = str_replace('%', $ipaddr, $blacklist[0])) == $blacklist[0])
+ $lookup = $ipaddr . '.' . $blacklist[0];
- if (!$ip = DNS($lookup))
- continue; // not in list
+ if (!$ip = DNS($lookup))
+ continue; // not in list
- $blacklist_name = isset($blacklist[2]) ? $blacklist[2] : $blacklist[0];
+ $blacklist_name = isset($blacklist[2]) ? $blacklist[2] : $blacklist[0];
- if (!isset($blacklist[1])) {
- // If you're listed at all, you're blocked.
- error(sprintf($config['error']['dnsbl'], $blacklist_name));
- } elseif (is_array($blacklist[1])) {
- foreach ($blacklist[1] as $octet) {
- if ($ip == $octet || $ip == '127.0.0.' . $octet)
- error(sprintf($config['error']['dnsbl'], $blacklist_name));
- }
- } elseif (is_callable($blacklist[1])) {
- if ($blacklist[1]($ip))
- error(sprintf($config['error']['dnsbl'], $blacklist_name));
- } else {
- if ($ip == $blacklist[1] || $ip == '127.0.0.' . $blacklist[1])
- error(sprintf($config['error']['dnsbl'], $blacklist_name));
- }
- }
+ if (!isset($blacklist[1])) {
+ // If you're listed at all, you're blocked.
+ error(sprintf($config['error']['dnsbl'], $blacklist_name));
+ } elseif (is_array($blacklist[1])) {
+ foreach ($blacklist[1] as $octet) {
+ if ($ip == $octet || $ip == '127.0.0.' . $octet)
+ error(sprintf($config['error']['dnsbl'], $blacklist_name));
+ }
+ } elseif (is_callable($blacklist[1])) {
+ if ($blacklist[1]($ip))
+ error(sprintf($config['error']['dnsbl'], $blacklist_name));
+ } else {
+ if ($ip == $blacklist[1] || $ip == '127.0.0.' . $blacklist[1])
+ error(sprintf($config['error']['dnsbl'], $blacklist_name));
+ }
+ }
}
function isIPv6() {
- return strstr($_SERVER['REMOTE_ADDR'], ':') !== false;
+ return strstr($_SERVER['REMOTE_ADDR'], ':') !== false;
}
function ReverseIPOctets($ip) {
- return implode('.', array_reverse(explode('.', $ip)));
+ return implode('.', array_reverse(explode('.', $ip)));
}
function wordfilters(&$body) {
@@ -1855,783 +1887,787 @@ function wordfilters(&$body) {
function quote($body, $quote=true) {
- global $config;
+ global $config;
- $body = str_replace(' ', "\n", $body);
+ $body = str_replace(' ', "\n", $body);
- $body = strip_tags($body);
+ $body = strip_tags($body);
- $body = preg_replace("/(^|\n)/", '$1>', $body);
+ $body = preg_replace("/(^|\n)/", '$1>', $body);
- $body .= "\n";
+ $body .= "\n";
- if ($config['minify_html'])
- $body = str_replace("\n", '
', $body);
+ if ($config['minify_html'])
+ $body = str_replace("\n", '
', $body);
- return $body;
+ return $body;
}
function markup_url($matches) {
- global $config, $markup_urls;
+ global $config, $markup_urls;
- $url = $matches[1];
- $after = $matches[2];
+ $url = $matches[1];
+ $after = $matches[2];
- $markup_urls[] = $url;
+ $markup_urls[] = $url;
- $link = (object) array(
- 'href' => $config['link_prefix'] . $url,
- 'text' => $url,
- 'rel' => 'nofollow',
- 'target' => '_blank',
- );
-
- event('markup-url', $link);
- $link = (array)$link;
+ $link = (object) array(
+ 'href' => $config['link_prefix'] . $url,
+ 'text' => $url,
+ 'rel' => 'nofollow',
+ 'target' => '_blank',
+ );
+
+ event('markup-url', $link);
+ $link = (array)$link;
- $parts = array();
- foreach ($link as $attr => $value) {
- if ($attr == 'text' || $attr == 'after')
- continue;
- $parts[] = $attr . '="' . $value . '"';
- }
- if (isset($link['after']))
- $after = $link['after'] . $after;
- return '' . $link['text'] . ' ' . $after;
+ $parts = array();
+ foreach ($link as $attr => $value) {
+ if ($attr == 'text' || $attr == 'after')
+ continue;
+ $parts[] = $attr . '="' . $value . '"';
+ }
+ if (isset($link['after']))
+ $after = $link['after'] . $after;
+ return '' . $link['text'] . ' ' . $after;
}
function unicodify($body) {
- $body = str_replace('...', '…', $body);
- $body = str_replace('<--', '←', $body);
- $body = str_replace('-->', '→', $body);
+ $body = str_replace('...', '…', $body);
+ $body = str_replace('<--', '←', $body);
+ $body = str_replace('-->', '→', $body);
- // En and em- dashes are rendered exactly the same in
- // most monospace fonts (they look the same in code
- // editors).
- $body = str_replace('---', '—', $body); // em dash
- $body = str_replace('--', '–', $body); // en dash
+ // En and em- dashes are rendered exactly the same in
+ // most monospace fonts (they look the same in code
+ // editors).
+ $body = str_replace('---', '—', $body); // em dash
+ $body = str_replace('--', '–', $body); // en dash
- return $body;
+ return $body;
}
function extract_modifiers($body) {
- $modifiers = array();
-
- if (preg_match_all('@(.*?) @us', $body, $matches, PREG_SET_ORDER)) {
- foreach ($matches as $match) {
- if (preg_match('/^escape /', $match[1]))
- continue;
- $modifiers[$match[1]] = html_entity_decode($match[2]);
- }
- }
-
- return $modifiers;
+ $modifiers = array();
+
+ if (preg_match_all('@(.*?) @us', $body, $matches, PREG_SET_ORDER)) {
+ foreach ($matches as $match) {
+ if (preg_match('/^escape /', $match[1]))
+ continue;
+ $modifiers[$match[1]] = html_entity_decode($match[2]);
+ }
+ }
+
+ return $modifiers;
}
function remove_modifiers($body) {
- return preg_replace('@(.+?) @usm', '', $body);
+ return preg_replace('@(.+?) @usm', '', $body);
}
function markup(&$body, $track_cites = false, $op = false) {
- global $board, $config, $markup_urls;
+ global $board, $config, $markup_urls;
- $modifiers = extract_modifiers($body);
-
- $body = preg_replace('@(.+?) @us', '', $body);
- $body = preg_replace('@<(tinyboard) escape ([\w\s]+)>@i', '<$1 $2>', $body);
-
- if (isset($modifiers['raw html']) && $modifiers['raw html'] == '1') {
- return array();
- }
+ $modifiers = extract_modifiers($body);
+
+ $body = preg_replace('@(.+?) @us', '', $body);
+ $body = preg_replace('@<(tinyboard) escape ([\w\s]+)>@i', '<$1 $2>', $body);
+
+ if (isset($modifiers['raw html']) && $modifiers['raw html'] == '1') {
+ return array();
+ }
- $body = str_replace("\r", '', $body);
- $body = utf8tohtml($body);
+ $body = str_replace("\r", '', $body);
+ $body = utf8tohtml($body);
- if (mysql_version() < 50503)
- $body = mb_encode_numericentity($body, array(0x010000, 0xffffff, 0, 0xffffff), 'UTF-8');
+ if (mysql_version() < 50503)
+ $body = mb_encode_numericentity($body, array(0x010000, 0xffffff, 0, 0xffffff), 'UTF-8');
- if ($config['markup_code']) {
- $code_markup = array();
- $body = preg_replace_callback($config['markup_code'], function($matches) use (&$code_markup) {
- $d = count($code_markup);
- $code_markup[] = $matches;
- return "";
- }, $body);
- }
+ if ($config['markup_code']) {
+ $code_markup = array();
+ $body = preg_replace_callback($config['markup_code'], function($matches) use (&$code_markup) {
+ $d = count($code_markup);
+ $code_markup[] = $matches;
+ return "";
+ }, $body);
+ }
- foreach ($config['markup'] as $markup) {
- if (is_string($markup[1])) {
- $body = preg_replace($markup[0], $markup[1], $body);
- } elseif (is_callable($markup[1])) {
- $body = preg_replace_callback($markup[0], $markup[1], $body);
- }
- }
+ foreach ($config['markup'] as $markup) {
+ if (is_string($markup[1])) {
+ $body = preg_replace($markup[0], $markup[1], $body);
+ } elseif (is_callable($markup[1])) {
+ $body = preg_replace_callback($markup[0], $markup[1], $body);
+ }
+ }
- if ($config['markup_urls']) {
- $markup_urls = array();
+ if ($config['markup_urls']) {
+ $markup_urls = array();
- $body = preg_replace_callback(
- '/((?:https?:\/\/|ftp:\/\/|irc:\/\/|gopher:\/\/)[^\s<>()"]+?(?:\([^\s<>()"]*?\)[^\s<>()"]*?)*)((?:\s|<|>|"|\.||\]|!|\?|,|,|")*(?:[\s<>()"]|$))/',
- 'markup_url',
- $body,
- -1,
- $num_links);
+ $body = preg_replace_callback(
+ '/((?:https?:\/\/|ftp:\/\/|irc:\/\/|gopher:\/\/)[^\s<>()"]+?(?:\([^\s<>()"]*?\)[^\s<>()"]*?)*)((?:\s|<|>|"|\.||\]|!|\?|,|,|")*(?:[\s<>()"]|$))/',
+ 'markup_url',
+ $body,
+ -1,
+ $num_links);
- if ($num_links > $config['max_links']) {
- error($config['error']['toomanylinks']);
- }
- }
-
- if ($config['markup_repair_tidy'])
- $body = str_replace(' ', ' ', $body);
+ if ($num_links > $config['max_links']) {
+ error($config['error']['toomanylinks']);
+ }
+ }
+
+ if ($config['markup_repair_tidy'])
+ $body = str_replace(' ', ' ', $body);
- if ($config['auto_unicode']) {
- $body = unicodify($body);
+ if ($config['auto_unicode']) {
+ $body = unicodify($body);
- if ($config['markup_urls']) {
- foreach ($markup_urls as &$url) {
- $body = str_replace(unicodify($url), $url, $body);
- }
- }
- }
+ if ($config['markup_urls']) {
+ foreach ($markup_urls as &$url) {
+ $body = str_replace(unicodify($url), $url, $body);
+ }
+ }
+ }
- $tracked_cites = array();
+ $tracked_cites = array();
- // Cites
- if (isset($board) && preg_match_all('/(^|\s)>>(\d+?)((?=[\s,.:)?!&])|$)/m', $body, $cites, PREG_SET_ORDER | PREG_OFFSET_CAPTURE)) {
- if (count($cites[0]) > $config['max_cites']) {
- error($config['error']['toomanycites']);
- }
+ // Cites
+ if (isset($board) && preg_match_all('/(^|\s)>>(\d+?)((?=[\s,.)?!])|$)/m', $body, $cites, PREG_SET_ORDER | PREG_OFFSET_CAPTURE)) {
+ if (count($cites[0]) > $config['max_cites']) {
+ error($config['error']['toomanycites']);
+ }
- $skip_chars = 0;
- $body_tmp = $body;
-
- $search_cites = array();
- foreach ($cites as $matches) {
- $search_cites[] = '`id` = ' . $matches[2][0];
- }
- $search_cites = array_unique($search_cites);
-
- $query = query(sprintf('SELECT `thread`, `id` FROM ``posts_%s`` WHERE ' .
- implode(' OR ', $search_cites), $board['uri'])) or error(db_error());
-
- $cited_posts = array();
- while ($cited = $query->fetch(PDO::FETCH_ASSOC)) {
- $cited_posts[$cited['id']] = $cited['thread'] ? $cited['thread'] : false;
- }
-
- foreach ($cites as $matches) {
- $cite = $matches[2][0];
+ $skip_chars = 0;
+ $body_tmp = $body;
+
+ $search_cites = array();
+ foreach ($cites as $matches) {
+ $search_cites[] = '`id` = ' . $matches[2][0];
+ }
+ $search_cites = array_unique($search_cites);
+
+ $query = query(sprintf('SELECT `thread`, `id` FROM ``posts_%s`` WHERE ' .
+ implode(' OR ', $search_cites), $board['uri'])) or error(db_error());
+
+ $cited_posts = array();
+ while ($cited = $query->fetch(PDO::FETCH_ASSOC)) {
+ $cited_posts[$cited['id']] = $cited['thread'] ? $cited['thread'] : false;
+ }
+
+ foreach ($cites as $matches) {
+ $cite = $matches[2][0];
- // preg_match_all is not multibyte-safe
- foreach ($matches as &$match) {
- $match[1] = mb_strlen(substr($body_tmp, 0, $match[1]));
- }
+ // preg_match_all is not multibyte-safe
+ foreach ($matches as &$match) {
+ $match[1] = mb_strlen(substr($body_tmp, 0, $match[1]));
+ }
- if (isset($cited_posts[$cite])) {
- $replacement = '' .
- '>>' . $cite .
- ' ';
+ if (isset($cited_posts[$cite])) {
+ $replacement = '' .
+ '>>' . $cite .
+ ' ';
- $body = mb_substr_replace($body, $matches[1][0] . $replacement . $matches[3][0], $matches[0][1] + $skip_chars, mb_strlen($matches[0][0]));
- $skip_chars += mb_strlen($matches[1][0] . $replacement . $matches[3][0]) - mb_strlen($matches[0][0]);
+ $body = mb_substr_replace($body, $matches[1][0] . $replacement . $matches[3][0], $matches[0][1] + $skip_chars, mb_strlen($matches[0][0]));
+ $skip_chars += mb_strlen($matches[1][0] . $replacement . $matches[3][0]) - mb_strlen($matches[0][0]);
- if ($track_cites && $config['track_cites'])
- $tracked_cites[] = array($board['uri'], $cite);
- }
- }
- }
+ if ($track_cites && $config['track_cites'])
+ $tracked_cites[] = array($board['uri'], $cite);
+ }
+ }
+ }
- // Cross-board linking
- if (preg_match_all('/(^|\s)>>>\/(' . $config['board_regex'] . 'f?)\/(\d+)?((?=[\s,.:)?!&])|$)/um', $body, $cites, PREG_SET_ORDER | PREG_OFFSET_CAPTURE)) {
- if (count($cites[0]) > $config['max_cites']) {
- error($config['error']['toomanycross']);
- }
+ // Cross-board linking
+ if (preg_match_all('/(^|\s)>>>\/(' . $config['board_regex'] . 'f?)\/(\d+)?((?=[\s,.)?!])|$)/um', $body, $cites, PREG_SET_ORDER | PREG_OFFSET_CAPTURE)) {
+ if (count($cites[0]) > $config['max_cites']) {
+ error($config['error']['toomanycross']);
+ }
- $skip_chars = 0;
- $body_tmp = $body;
-
- if (isset($cited_posts)) {
- // Carry found posts from local board >>X links
- foreach ($cited_posts as $cite => $thread) {
- $cited_posts[$cite] = $config['root'] . $board['dir'] . $config['dir']['res'] .
- ($thread ? $thread : $cite) . '.html#' . $cite;
- }
-
- $cited_posts = array(
- $board['uri'] => $cited_posts
- );
- } else
- $cited_posts = array();
-
- $crossboard_indexes = array();
- $search_cites_boards = array();
-
- foreach ($cites as $matches) {
- $_board = $matches[2][0];
- $cite = @$matches[3][0];
-
- if (!isset($search_cites_boards[$_board]))
- $search_cites_boards[$_board] = array();
- $search_cites_boards[$_board][] = $cite;
- }
-
- $tmp_board = $board['uri'];
-
- foreach ($search_cites_boards as $_board => $search_cites) {
- $clauses = array();
- foreach ($search_cites as $cite) {
- if (!$cite || isset($cited_posts[$_board][$cite]))
- continue;
- $clauses[] = '`id` = ' . $cite;
- }
- $clauses = array_unique($clauses);
-
- if ($board['uri'] != $_board) {
- if (!openBoard($_board)){
- if (in_array($_board,array_keys($config['boards_alias']))){
+ $skip_chars = 0;
+ $body_tmp = $body;
+
+ if (isset($cited_posts)) {
+ // Carry found posts from local board >>X links
+ foreach ($cited_posts as $cite => $thread) {
+ $cited_posts[$cite] = $config['root'] . $board['dir'] . $config['dir']['res'] .
+ ($thread ? $thread : $cite) . '.html#' . $cite;
+ }
+
+ $cited_posts = array(
+ $board['uri'] => $cited_posts
+ );
+ } else
+ $cited_posts = array();
+
+ $crossboard_indexes = array();
+ $search_cites_boards = array();
+
+ foreach ($cites as $matches) {
+ $_board = $matches[2][0];
+ $cite = @$matches[3][0];
+
+ if (!isset($search_cites_boards[$_board]))
+ $search_cites_boards[$_board] = array();
+ $search_cites_boards[$_board][] = $cite;
+ }
+
+ $tmp_board = $board['uri'];
+
+ foreach ($search_cites_boards as $_board => $search_cites) {
+ $clauses = array();
+ foreach ($search_cites as $cite) {
+ if (!$cite || isset($cited_posts[$_board][$cite]))
+ continue;
+ $clauses[] = '`id` = ' . $cite;
+ }
+ $clauses = array_unique($clauses);
+
+ if ($board['uri'] != $_board) {
+ if (!openBoard($_board)){
+ if (in_array($_board,array_keys($config['boards_alias']))){
$_board = $config['boards_alias'][$_board];
if (openBoard($_board)){
- }
- else {
- continue; // Unknown board
- }
+ }
+ else {
+ continue; // Unknown board
+ }
}
- else {
- continue; // Unknown board
- }
-
- }
- }
-
- if (!empty($clauses)) {
- $cited_posts[$_board] = array();
-
- $query = query(sprintf('SELECT `thread`, `id`, `slug` FROM ``posts_%s`` WHERE ' .
- implode(' OR ', $clauses), $board['uri'])) or error(db_error());
-
- while ($cite = $query->fetch(PDO::FETCH_ASSOC)) {
- $cited_posts[$_board][$cite['id']] = $config['root'] . $board['dir'] . $config['dir']['res'] .
- link_for($cite) . '#' . $cite['id'];
- }
- }
-
- $crossboard_indexes[$_board] = $config['root'] . $board['dir'] . $config['file_index'];
- }
-
- // Restore old board
- if ($board['uri'] != $tmp_board)
- openBoard($tmp_board);
+ else {
+ continue; // Unknown board
+ }
+
+ }
+ }
+
+ if (!empty($clauses)) {
+ $cited_posts[$_board] = array();
+
+ $query = query(sprintf('SELECT `thread`, `id`, `slug` FROM ``posts_%s`` WHERE ' .
+ implode(' OR ', $clauses), $board['uri'])) or error(db_error());
+
+ while ($cite = $query->fetch(PDO::FETCH_ASSOC)) {
+ $cited_posts[$_board][$cite['id']] = $config['root'] . $board['dir'] . $config['dir']['res'] .
+ link_for($cite) . '#' . $cite['id'];
+ }
+ }
+
+ $crossboard_indexes[$_board] = $config['root'] . $board['dir'] . $config['file_index'];
+ }
+
+ // Restore old board
+ if ($board['uri'] != $tmp_board)
+ openBoard($tmp_board);
- foreach ($cites as $matches) {
- $original_board = NULL;
- $_board = $matches[2][0];
- if (in_array($_board,array_keys($config['boards_alias']))){
- $original_board = $_board;
- $_board = $config['boards_alias'][$_board];
+ foreach ($cites as $matches) {
+ $original_board = NULL;
+ $_board = $matches[2][0];
+ if (in_array($_board,array_keys($config['boards_alias']))){
+ $original_board = $_board;
+ $_board = $config['boards_alias'][$_board];
- }
- $cite = @$matches[3][0];
+ }
+ $cite = @$matches[3][0];
- // preg_match_all is not multibyte-safe
- foreach ($matches as &$match) {
- $match[1] = mb_strlen(substr($body_tmp, 0, $match[1]));
- }
+ // preg_match_all is not multibyte-safe
+ foreach ($matches as &$match) {
+ $match[1] = mb_strlen(substr($body_tmp, 0, $match[1]));
+ }
- if ($cite) {
- if (isset($cited_posts[$_board][$cite])) {
- $link = $cited_posts[$_board][$cite];
- if (isset($original_board)){
- $replacement = '' .
- '>>>/' . $original_board . '/' . $cite .
- ' ';
+ if ($cite) {
+ if (isset($cited_posts[$_board][$cite])) {
+ $link = $cited_posts[$_board][$cite];
+ if (isset($original_board)){
+ $replacement = '' .
+ '>>>/' . $original_board . '/' . $cite .
+ ' ';
- }
- else {
- $replacement = '' .
- '>>>/' . $_board . '/' . $cite .
- ' ';
+ }
+ else {
+ $replacement = '' .
+ '>>>/' . $_board . '/' . $cite .
+ ' ';
- }
+ }
- $body = mb_substr_replace($body, $matches[1][0] . $replacement . $matches[4][0], $matches[0][1] + $skip_chars, mb_strlen($matches[0][0]));
- $skip_chars += mb_strlen($matches[1][0] . $replacement . $matches[4][0]) - mb_strlen($matches[0][0]);
+ $body = mb_substr_replace($body, $matches[1][0] . $replacement . $matches[4][0], $matches[0][1] + $skip_chars, mb_strlen($matches[0][0]));
+ $skip_chars += mb_strlen($matches[1][0] . $replacement . $matches[4][0]) - mb_strlen($matches[0][0]);
- if ($track_cites && $config['track_cites'])
- $tracked_cites[] = array($_board, $cite);
- }
- } elseif(isset($crossboard_indexes[$_board])) {
- $replacement = '' .
- '>>>/' . $_board . '/' .
- ' ';
- $body = mb_substr_replace($body, $matches[1][0] . $replacement . $matches[4][0], $matches[0][1] + $skip_chars, mb_strlen($matches[0][0]));
- $skip_chars += mb_strlen($matches[1][0] . $replacement . $matches[4][0]) - mb_strlen($matches[0][0]);
- }
- }
- }
+ if ($track_cites && $config['track_cites'])
+ $tracked_cites[] = array($_board, $cite);
+ }
+ } elseif(isset($crossboard_indexes[$_board])) {
+ $replacement = '' .
+ '>>>/' . $_board . '/' .
+ ' ';
+ $body = mb_substr_replace($body, $matches[1][0] . $replacement . $matches[4][0], $matches[0][1] + $skip_chars, mb_strlen($matches[0][0]));
+ $skip_chars += mb_strlen($matches[1][0] . $replacement . $matches[4][0]) - mb_strlen($matches[0][0]);
+ }
+ }
+ }
- $tracked_cites = array_unique($tracked_cites, SORT_REGULAR);
+ $tracked_cites = array_unique($tracked_cites, SORT_REGULAR);
- $body = preg_replace("/^\s*>.*$/m", '$0 ', $body);
+ $body = preg_replace("/^\s*>.*$/m", '$0 ', $body);
- if ($config['strip_superfluous_returns'])
- $body = preg_replace('/\s+$/', '', $body);
+ if ($config['strip_superfluous_returns'])
+ $body = preg_replace('/\s+$/', '', $body);
- $body = preg_replace("/\n/", ' ', $body);
+ $body = preg_replace("/\n/", ' ', $body);
- // Fix code markup
- if ($config['markup_code']) {
- foreach ($code_markup as $id => $val) {
- $code = isset($val[2]) ? $val[2] : $val[1];
- $code_lang = isset($val[2]) ? $val[1] : "";
+ // Fix code markup
+ if ($config['markup_code']) {
+ foreach ($code_markup as $id => $val) {
+ $code = isset($val[2]) ? $val[2] : $val[1];
+ $code_lang = isset($val[2]) ? $val[1] : "";
- $code = rtrim(ltrim($code, "\r\n"));
+ $code = rtrim(ltrim($code, "\r\n"));
- $code = "".str_replace(array("\n","\t"), array("
"," "), htmlspecialchars($code, ENT_COMPAT, "UTF-8", false))." ";
-
- $body = str_replace("", $code, $body);
- }
- }
+ $code = "".str_replace(array("\n","\t"), array("
"," "), htmlspecialchars($code, ENT_COMPAT, "UTF-8", false))." ";
+
+ $body = str_replace("", $code, $body);
+ }
+ }
- if ($config['markup_repair_tidy']) {
- $tidy = new tidy();
- $body = str_replace("\t", ' ', $body);
- $body = $tidy->repairString($body, array(
- 'doctype' => 'omit',
- 'bare' => true,
- 'literal-attributes' => true,
- 'indent' => false,
- 'show-body-only' => true,
- 'wrap' => 0,
- 'output-bom' => false,
- 'output-html' => true,
- 'newline' => 'LF',
- 'quiet' => true,
- ), 'utf8');
- $body = str_replace("\n", '', $body);
- }
+ if ($config['markup_repair_tidy']) {
+ $tidy = new tidy();
+ $body = str_replace("\t", ' ', $body);
+ $body = $tidy->repairString($body, array(
+ 'doctype' => 'omit',
+ 'bare' => true,
+ 'literal-attributes' => true,
+ 'indent' => false,
+ 'show-body-only' => true,
+ 'wrap' => 0,
+ 'output-bom' => false,
+ 'output-html' => true,
+ 'newline' => 'LF',
+ 'quiet' => true,
+ ), 'utf8');
+ $body = str_replace("\n", '', $body);
+ }
- // replace tabs with 8 spaces
- $body = str_replace("\t", ' ', $body);
+ // replace tabs with 8 spaces
+ $body = str_replace("\t", ' ', $body);
- return $tracked_cites;
+ return $tracked_cites;
}
function escape_markup_modifiers($string) {
- return preg_replace('@<(tinyboard) ([\w\s]+)>@mi', '<$1 escape $2>', $string);
+ return preg_replace('@<(tinyboard) ([\w\s]+)>@mi', '<$1 escape $2>', $string);
}
function utf8tohtml($utf8) {
- return htmlspecialchars($utf8, ENT_NOQUOTES, 'UTF-8');
+ if ($utf8 == null) {
+ return '';
+ } else {
+ return htmlspecialchars($utf8, ENT_NOQUOTES, 'UTF-8');
+ }
}
function ordutf8($string, &$offset) {
- $code = ord(substr($string, $offset,1));
- if ($code >= 128) { // otherwise 0xxxxxxx
- if ($code < 224)
- $bytesnumber = 2; // 110xxxxx
- else if ($code < 240)
- $bytesnumber = 3; // 1110xxxx
- else if ($code < 248)
- $bytesnumber = 4; // 11110xxx
- $codetemp = $code - 192 - ($bytesnumber > 2 ? 32 : 0) - ($bytesnumber > 3 ? 16 : 0);
- for ($i = 2; $i <= $bytesnumber; $i++) {
- $offset ++;
- $code2 = ord(substr($string, $offset, 1)) - 128; //10xxxxxx
- $codetemp = $codetemp*64 + $code2;
- }
- $code = $codetemp;
- }
- $offset += 1;
- if ($offset >= strlen($string))
- $offset = -1;
- return $code;
+ $code = ord(substr($string, $offset,1));
+ if ($code >= 128) { // otherwise 0xxxxxxx
+ if ($code < 224)
+ $bytesnumber = 2; // 110xxxxx
+ else if ($code < 240)
+ $bytesnumber = 3; // 1110xxxx
+ else if ($code < 248)
+ $bytesnumber = 4; // 11110xxx
+ $codetemp = $code - 192 - ($bytesnumber > 2 ? 32 : 0) - ($bytesnumber > 3 ? 16 : 0);
+ for ($i = 2; $i <= $bytesnumber; $i++) {
+ $offset ++;
+ $code2 = ord(substr($string, $offset, 1)) - 128; //10xxxxxx
+ $codetemp = $codetemp*64 + $code2;
+ }
+ $code = $codetemp;
+ }
+ $offset += 1;
+ if ($offset >= strlen($string))
+ $offset = -1;
+ return $code;
}
// Limit Non_Spacing_Mark and Enclosing_Mark characters
function strip_combining_chars($str) {
- global $config;
- $limit = strval($config['max_combining_chars']+1);
- return preg_replace('/(\p{Me}|\p{Mn}){'.$limit.',}/u','', $str);
+ global $config;
+ $limit = strval($config['max_combining_chars']+1);
+ return preg_replace('/(\p{Me}|\p{Mn}){'.$limit.',}/u','', $str);
}
function buildThread($id, $return = false, $mod = false) {
- global $board, $config, $build_pages;
- $id = round($id);
+ global $board, $config, $build_pages;
+ $id = round($id);
if (event('build-thread', $id)) {
return;
}
- if ($config['cache']['enabled'] && !$mod) {
- // Clear cache
- cache::delete("thread_index_{$board['uri']}_{$id}");
- cache::delete("thread_{$board['uri']}_{$id}");
- }
+ if ($config['cache']['enabled'] && !$mod) {
+ // Clear cache
+ cache::delete("thread_index_{$board['uri']}_{$id}");
+ cache::delete("thread_{$board['uri']}_{$id}");
+ }
- if ($config['try_smarter'] && !$mod)
- $build_pages[] = thread_find_page($id);
+ if ($config['try_smarter'] && !$mod)
+ $build_pages[] = thread_find_page($id);
- $action = generation_strategy('sb_thread', array($board['uri'], $id));
+ $action = generation_strategy('sb_thread', array($board['uri'], $id));
- if ($action == 'rebuild' || $return || $mod) {
- $query = prepare(sprintf("SELECT *,'%s' as board FROM ``posts_%s`` WHERE (`thread` IS NULL AND `id` = :id) OR `thread` = :id ORDER BY `thread`,`id`", $board['uri'],$board['uri']));
- $query->bindValue(':id', $id, PDO::PARAM_INT);
- $query->execute() or error(db_error($query));
+ if ($action == 'rebuild' || $return || $mod) {
+ $query = prepare(sprintf("SELECT *,'%s' as board FROM ``posts_%s`` WHERE (`thread` IS NULL AND `id` = :id) OR `thread` = :id ORDER BY `thread`,`id`", $board['uri'],$board['uri']));
+ $query->bindValue(':id', $id, PDO::PARAM_INT);
+ $query->execute() or error(db_error($query));
- while ($post = $query->fetch(PDO::FETCH_ASSOC)) {
- if (!isset($thread)) {
- $thread = new Thread($post, $mod ? '?/' : $config['root'], $mod);
- } else {
- $thread->add(new Post($post, $mod ? '?/' : $config['root'], $mod));
- }
- }
+ while ($post = $query->fetch(PDO::FETCH_ASSOC)) {
+ if (!isset($thread)) {
+ $thread = new Thread($post, $mod ? '?/' : $config['root'], $mod);
+ } else {
+ $thread->add(new Post($post, $mod ? '?/' : $config['root'], $mod));
+ }
+ }
- // Check if any posts were found
- if (!isset($thread))
- error($config['error']['nonexistant']);
-
- $hasnoko50 = $thread->postCount() >= $config['noko50_min'];
- $antibot = $mod || $return ? false : create_antibot($board['uri'], $id);
+ // Check if any posts were found
+ if (!isset($thread))
+ error($config['error']['nonexistant']);
+
+ $hasnoko50 = $thread->postCount() >= $config['noko50_min'];
+ $antibot = $mod || $return ? false : create_antibot($board['uri'], $id);
- $body = Element('thread.html', array(
- 'board' => $board,
- 'thread' => $thread,
- 'body' => $thread->build(),
- 'config' => $config,
- 'id' => $id,
- 'mod' => $mod,
- 'hasnoko50' => $hasnoko50,
- 'isnoko50' => false,
- 'antibot' => $antibot,
- 'boardlist' => createBoardlist($mod),
- 'return' => ($mod ? '?' . $board['url'] . $config['file_index'] : $config['root'] . $board['dir'] . $config['file_index'])
- ));
+ $body = Element('thread.html', array(
+ 'board' => $board,
+ 'thread' => $thread,
+ 'body' => $thread->build(),
+ 'config' => $config,
+ 'id' => $id,
+ 'mod' => $mod,
+ 'hasnoko50' => $hasnoko50,
+ 'isnoko50' => false,
+ 'antibot' => $antibot,
+ 'boardlist' => createBoardlist($mod),
+ 'return' => ($mod ? '?' . $board['url'] . $config['file_index'] : $config['root'] . $board['dir'] . $config['file_index'])
+ ));
- // json api
- if ($config['api']['enabled'] && !$mod) {
- $api = new Api();
- $json = json_encode($api->translateThread($thread));
- $jsonFilename = $board['dir'] . $config['dir']['res'] . $id . '.json';
- file_write($jsonFilename, $json);
- }
- }
- elseif($action == 'delete') {
- $jsonFilename = $board['dir'] . $config['dir']['res'] . $id . '.json';
- file_unlink($jsonFilename);
- }
+ // json api
+ if ($config['api']['enabled'] && !$mod) {
+ $api = new Api();
+ $json = json_encode($api->translateThread($thread));
+ $jsonFilename = $board['dir'] . $config['dir']['res'] . $id . '.json';
+ file_write($jsonFilename, $json);
+ }
+ }
+ elseif($action == 'delete') {
+ $jsonFilename = $board['dir'] . $config['dir']['res'] . $id . '.json';
+ file_unlink($jsonFilename);
+ }
- if ($action == 'delete' && !$return && !$mod) {
- $noko50fn = $board['dir'] . $config['dir']['res'] . link_for(array('id' => $id), true);
- file_unlink($noko50fn);
+ if ($action == 'delete' && !$return && !$mod) {
+ $noko50fn = $board['dir'] . $config['dir']['res'] . link_for(array('id' => $id), true);
+ file_unlink($noko50fn);
- file_unlink($board['dir'] . $config['dir']['res'] . link_for(array('id' => $id)));
- } elseif ($return) {
- return $body;
- } elseif ($action == 'rebuild') {
- $noko50fn = $board['dir'] . $config['dir']['res'] . link_for($thread, true);
- if ($hasnoko50 || file_exists($noko50fn)) {
- buildThread50($id, $return, $mod, $thread, $antibot);
- }
+ file_unlink($board['dir'] . $config['dir']['res'] . link_for(array('id' => $id)));
+ } elseif ($return) {
+ return $body;
+ } elseif ($action == 'rebuild') {
+ $noko50fn = $board['dir'] . $config['dir']['res'] . link_for($thread, true);
+ if ($hasnoko50 || file_exists($noko50fn)) {
+ buildThread50($id, $return, $mod, $thread, $antibot);
+ }
- file_write($board['dir'] . $config['dir']['res'] . link_for($thread), $body);
- }
+ file_write($board['dir'] . $config['dir']['res'] . link_for($thread), $body);
+ }
}
function buildThread50($id, $return = false, $mod = false, $thread = null, $antibot = false) {
- global $board, $config, $build_pages;
- $id = round($id);
-
- if ($antibot)
- $antibot->reset();
-
- if (!$thread) {
- $query = prepare(sprintf("SELECT * FROM ``posts_%s`` WHERE (`thread` IS NULL AND `id` = :id) OR `thread` = :id ORDER BY `thread`,`id` DESC LIMIT :limit", $board['uri']));
- $query->bindValue(':id', $id, PDO::PARAM_INT);
- $query->bindValue(':limit', $config['noko50_count']+1, PDO::PARAM_INT);
- $query->execute() or error(db_error($query));
-
- $num_images = 0;
- while ($post = $query->fetch(PDO::FETCH_ASSOC)) {
- if (!isset($thread)) {
- $thread = new Thread($post, $mod ? '?/' : $config['root'], $mod);
- } else {
- if ($post['files'])
- $num_images += $post['num_files'];
-
- $thread->add(new Post($post, $mod ? '?/' : $config['root'], $mod));
- }
- }
+ global $board, $config, $build_pages;
+ $id = round($id);
+
+ if ($antibot)
+ $antibot->reset();
+
+ if (!$thread) {
+ $query = prepare(sprintf("SELECT * FROM ``posts_%s`` WHERE (`thread` IS NULL AND `id` = :id) OR `thread` = :id ORDER BY `thread`,`id` DESC LIMIT :limit", $board['uri']));
+ $query->bindValue(':id', $id, PDO::PARAM_INT);
+ $query->bindValue(':limit', $config['noko50_count']+1, PDO::PARAM_INT);
+ $query->execute() or error(db_error($query));
+
+ $num_images = 0;
+ while ($post = $query->fetch(PDO::FETCH_ASSOC)) {
+ if (!isset($thread)) {
+ $thread = new Thread($post, $mod ? '?/' : $config['root'], $mod);
+ } else {
+ if ($post['files'])
+ $num_images += $post['num_files'];
+
+ $thread->add(new Post($post, $mod ? '?/' : $config['root'], $mod));
+ }
+ }
- // Check if any posts were found
- if (!isset($thread))
- error($config['error']['nonexistant']);
+ // Check if any posts were found
+ if (!isset($thread))
+ error($config['error']['nonexistant']);
- if ($query->rowCount() == $config['noko50_count']+1) {
- $count = prepare(sprintf("SELECT COUNT(`id`) as `num` FROM ``posts_%s`` WHERE `thread` = :thread UNION ALL
- SELECT SUM(`num_files`) FROM ``posts_%s`` WHERE `files` IS NOT NULL AND `thread` = :thread", $board['uri'], $board['uri']));
- $count->bindValue(':thread', $id, PDO::PARAM_INT);
- $count->execute() or error(db_error($count));
-
- $c = $count->fetch();
- $thread->omitted = $c['num'] - $config['noko50_count'];
-
- $c = $count->fetch();
- $thread->omitted_images = $c['num'] - $num_images;
- }
+ if ($query->rowCount() == $config['noko50_count']+1) {
+ $count = prepare(sprintf("SELECT COUNT(`id`) as `num` FROM ``posts_%s`` WHERE `thread` = :thread UNION ALL
+ SELECT SUM(`num_files`) FROM ``posts_%s`` WHERE `files` IS NOT NULL AND `thread` = :thread", $board['uri'], $board['uri']));
+ $count->bindValue(':thread', $id, PDO::PARAM_INT);
+ $count->execute() or error(db_error($count));
+
+ $c = $count->fetch();
+ $thread->omitted = $c['num'] - $config['noko50_count'];
+
+ $c = $count->fetch();
+ $thread->omitted_images = $c['num'] - $num_images;
+ }
- $thread->posts = array_reverse($thread->posts);
- } else {
- $allPosts = $thread->posts;
+ $thread->posts = array_reverse($thread->posts);
+ } else {
+ $allPosts = $thread->posts;
- $thread->posts = array_slice($allPosts, -$config['noko50_count']);
- $thread->omitted += count($allPosts) - count($thread->posts);
- foreach ($allPosts as $index => $post) {
- if ($index == count($allPosts)-count($thread->posts))
- break;
- if ($post->files)
- $thread->omitted_images += $post->num_files;
- }
- }
+ $thread->posts = array_slice($allPosts, -$config['noko50_count']);
+ $thread->omitted += count($allPosts) - count($thread->posts);
+ foreach ($allPosts as $index => $post) {
+ if ($index == count($allPosts)-count($thread->posts))
+ break;
+ if ($post->files)
+ $thread->omitted_images += $post->num_files;
+ }
+ }
- $hasnoko50 = $thread->postCount() >= $config['noko50_min'];
+ $hasnoko50 = $thread->postCount() >= $config['noko50_min'];
- $body = Element('thread.html', array(
- 'board' => $board,
- 'thread' => $thread,
- 'body' => $thread->build(false, true),
- 'config' => $config,
- 'id' => $id,
- 'mod' => $mod,
- 'hasnoko50' => $hasnoko50,
- 'isnoko50' => true,
- 'antibot' => $mod ? false : ($antibot ? $antibot : create_antibot($board['uri'], $id)),
- 'boardlist' => createBoardlist($mod),
- 'return' => ($mod ? '?' . $board['url'] . $config['file_index'] : $config['root'] . $board['dir'] . $config['file_index'])
- ));
+ $body = Element('thread.html', array(
+ 'board' => $board,
+ 'thread' => $thread,
+ 'body' => $thread->build(false, true),
+ 'config' => $config,
+ 'id' => $id,
+ 'mod' => $mod,
+ 'hasnoko50' => $hasnoko50,
+ 'isnoko50' => true,
+ 'antibot' => $mod ? false : ($antibot ? $antibot : create_antibot($board['uri'], $id)),
+ 'boardlist' => createBoardlist($mod),
+ 'return' => ($mod ? '?' . $board['url'] . $config['file_index'] : $config['root'] . $board['dir'] . $config['file_index'])
+ ));
- if ($return) {
- return $body;
- } else {
- file_write($board['dir'] . $config['dir']['res'] . link_for($thread, true), $body);
- }
+ if ($return) {
+ return $body;
+ } else {
+ file_write($board['dir'] . $config['dir']['res'] . link_for($thread, true), $body);
+ }
}
function rrmdir($dir) {
- if (is_dir($dir)) {
- $objects = scandir($dir);
- foreach ($objects as $object) {
- if ($object != "." && $object != "..") {
- if (filetype($dir."/".$object) == "dir")
- rrmdir($dir."/".$object);
- else
- file_unlink($dir."/".$object);
- }
- }
- reset($objects);
- rmdir($dir);
- }
+ if (is_dir($dir)) {
+ $objects = scandir($dir);
+ foreach ($objects as $object) {
+ if ($object != "." && $object != "..") {
+ if (filetype($dir."/".$object) == "dir")
+ rrmdir($dir."/".$object);
+ else
+ file_unlink($dir."/".$object);
+ }
+ }
+ reset($objects);
+ rmdir($dir);
+ }
}
function poster_id($ip, $thread) {
- global $config;
+ global $config;
- if ($id = event('poster-id', $ip, $thread))
- return $id;
+ if ($id = event('poster-id', $ip, $thread))
+ return $id;
- // Confusing, hard to brute-force, but simple algorithm
- return substr(sha1(sha1($ip . $config['secure_trip_salt'] . $thread) . $config['secure_trip_salt']), 0, $config['poster_id_length']);
+ // Confusing, hard to brute-force, but simple algorithm
+ return substr(sha1(sha1($ip . $config['secure_trip_salt'] . $thread) . $config['secure_trip_salt']), 0, $config['poster_id_length']);
}
function generate_tripcode($name) {
- global $config;
+ global $config;
- if ($trip = event('tripcode', $name))
- return $trip;
+ if ($trip = event('tripcode', $name))
+ return $trip;
- if (!preg_match('/^([^#]+)?(##|#)(.+)$/', $name, $match))
- return array($name);
+ if (!preg_match('/^([^#]+)?(##|#)(.+)$/', $name, $match))
+ return array($name);
- $name = $match[1];
- $secure = $match[2] == '##';
- $trip = $match[3];
+ $name = $match[1];
+ $secure = $match[2] == '##';
+ $trip = $match[3];
- // convert to SHIT_JIS encoding
- $trip = mb_convert_encoding($trip, 'Shift_JIS', 'UTF-8');
+ // convert to SHIT_JIS encoding
+ $trip = mb_convert_encoding($trip, 'Shift_JIS', 'UTF-8');
- // generate salt
- $salt = substr($trip . 'H..', 1, 2);
- $salt = preg_replace('/[^.-z]/', '.', $salt);
- $salt = strtr($salt, ':;<=>?@[\]^_`', 'ABCDEFGabcdef');
+ // generate salt
+ $salt = substr($trip . 'H..', 1, 2);
+ $salt = preg_replace('/[^.-z]/', '.', $salt);
+ $salt = strtr($salt, ':;<=>?@[\]^_`', 'ABCDEFGabcdef');
- if ($secure) {
- if (isset($config['custom_tripcode']["##{$trip}"]))
- $trip = $config['custom_tripcode']["##{$trip}"];
- else
- $trip = '!!' . substr(crypt($trip, str_replace('+', '.', '_..A.' . substr(base64_encode(sha1($trip . $config['secure_trip_salt'], true)), 0, 4))), -10);
- } else {
- if (isset($config['custom_tripcode']["#{$trip}"]))
- $trip = $config['custom_tripcode']["#{$trip}"];
- else
- $trip = '!' . substr(crypt($trip, $salt), -10);
- }
+ if ($secure) {
+ if (isset($config['custom_tripcode']["##{$trip}"]))
+ $trip = $config['custom_tripcode']["##{$trip}"];
+ else
+ $trip = '!!' . substr(crypt($trip, str_replace('+', '.', '_..A.' . substr(base64_encode(sha1($trip . $config['secure_trip_salt'], true)), 0, 4))), -10);
+ } else {
+ if (isset($config['custom_tripcode']["#{$trip}"]))
+ $trip = $config['custom_tripcode']["#{$trip}"];
+ else
+ $trip = '!' . substr(crypt($trip, $salt), -10);
+ }
- return array($name, $trip);
+ return array($name, $trip);
}
// Highest common factor
function hcf($a, $b){
- $gcd = 1;
- if ($a>$b) {
- $a = $a+$b;
- $b = $a-$b;
- $a = $a-$b;
- }
- if ($b==(round($b/$a))*$a)
- $gcd=$a;
- else {
- for ($i=round($a/2);$i;$i--) {
- if ($a == round($a/$i)*$i && $b == round($b/$i)*$i) {
- $gcd = $i;
- $i = false;
- }
- }
- }
- return $gcd;
+ $gcd = 1;
+ if ($a>$b) {
+ $a = $a+$b;
+ $b = $a-$b;
+ $a = $a-$b;
+ }
+ if ($b==(round($b/$a))*$a)
+ $gcd=$a;
+ else {
+ for ($i=round($a/2);$i;$i--) {
+ if ($a == round($a/$i)*$i && $b == round($b/$i)*$i) {
+ $gcd = $i;
+ $i = false;
+ }
+ }
+ }
+ return $gcd;
}
function fraction($numerator, $denominator, $sep) {
- $gcf = hcf($numerator, $denominator);
- $numerator = $numerator / $gcf;
- $denominator = $denominator / $gcf;
+ $gcf = hcf($numerator, $denominator);
+ $numerator = $numerator / $gcf;
+ $denominator = $denominator / $gcf;
- return "{$numerator}{$sep}{$denominator}";
+ return "{$numerator}{$sep}{$denominator}";
}
function getPostByHash($hash) {
- global $board;
- $query = prepare(sprintf("SELECT `id`,`thread` FROM ``posts_%s`` WHERE `filehash` = :hash", $board['uri']));
- $query->bindValue(':hash', $hash, PDO::PARAM_STR);
- $query->execute() or error(db_error($query));
+ global $board;
+ $query = prepare(sprintf("SELECT `id`,`thread` FROM ``posts_%s`` WHERE `filehash` = :hash", $board['uri']));
+ $query->bindValue(':hash', $hash, PDO::PARAM_STR);
+ $query->execute() or error(db_error($query));
- if ($post = $query->fetch(PDO::FETCH_ASSOC)) {
- return $post;
- }
+ if ($post = $query->fetch(PDO::FETCH_ASSOC)) {
+ return $post;
+ }
- return false;
+ return false;
}
function getPostByHashInThread($hash, $thread) {
- global $board;
- $query = prepare(sprintf("SELECT `id`,`thread` FROM ``posts_%s`` WHERE `filehash` = :hash AND ( `thread` = :thread OR `id` = :thread )", $board['uri']));
- $query->bindValue(':hash', $hash, PDO::PARAM_STR);
- $query->bindValue(':thread', $thread, PDO::PARAM_INT);
- $query->execute() or error(db_error($query));
+ global $board;
+ $query = prepare(sprintf("SELECT `id`,`thread` FROM ``posts_%s`` WHERE `filehash` = :hash AND ( `thread` = :thread OR `id` = :thread )", $board['uri']));
+ $query->bindValue(':hash', $hash, PDO::PARAM_STR);
+ $query->bindValue(':thread', $thread, PDO::PARAM_INT);
+ $query->execute() or error(db_error($query));
- if ($post = $query->fetch(PDO::FETCH_ASSOC)) {
- return $post;
- }
+ if ($post = $query->fetch(PDO::FETCH_ASSOC)) {
+ return $post;
+ }
- return false;
+ return false;
}
function undoImage(array $post) {
- if (!$post['has_file'] || !isset($post['files']))
- return;
+ if (!$post['has_file'] || !isset($post['files']))
+ return;
- foreach ($post['files'] as $key => $file) {
- if (isset($file['file_path']))
- file_unlink($file['file_path']);
- if (isset($file['thumb_path']))
- file_unlink($file['thumb_path']);
- }
+ foreach ($post['files'] as $key => $file) {
+ if (isset($file['file_path']))
+ file_unlink($file['file_path']);
+ if (isset($file['thumb_path']))
+ file_unlink($file['thumb_path']);
+ }
}
function rDNS($ip_addr) {
- global $config;
+ global $config;
- if ($config['cache']['enabled'] && ($host = cache::get('rdns_' . $ip_addr))) {
- return $host;
- }
+ if ($config['cache']['enabled'] && ($host = cache::get('rdns_' . $ip_addr))) {
+ return $host;
+ }
- if (!$config['dns_system']) {
- $host = gethostbyaddr($ip_addr);
- } else {
- $resp = shell_exec_error('host -W 3 ' . $ip_addr);
- if (preg_match('/domain name pointer ([^\s]+)$/', $resp, $m))
- $host = $m[1];
- else
- $host = $ip_addr;
- }
+ if (!$config['dns_system']) {
+ $host = gethostbyaddr($ip_addr);
+ } else {
+ $resp = shell_exec_error('host -W 3 ' . $ip_addr);
+ if (preg_match('/domain name pointer ([^\s]+)$/', $resp, $m))
+ $host = $m[1];
+ else
+ $host = $ip_addr;
+ }
- $isip = filter_var($host, FILTER_VALIDATE_IP);
+ $isip = filter_var($host, FILTER_VALIDATE_IP);
- if ($config['fcrdns'] && !$isip && DNS($host) != $ip_addr) {
- $host = $ip_addr;
- }
+ if ($config['fcrdns'] && !$isip && DNS($host) != $ip_addr) {
+ $host = $ip_addr;
+ }
- if ($config['cache']['enabled'])
- cache::set('rdns_' . $ip_addr, $host);
+ if ($config['cache']['enabled'])
+ cache::set('rdns_' . $ip_addr, $host);
- return $host;
+ return $host;
}
function DNS($host) {
- global $config;
+ global $config;
- if ($config['cache']['enabled'] && ($ip_addr = cache::get('dns_' . $host))) {
- return $ip_addr != '?' ? $ip_addr : false;
- }
+ if ($config['cache']['enabled'] && ($ip_addr = cache::get('dns_' . $host))) {
+ return $ip_addr != '?' ? $ip_addr : false;
+ }
- if (!$config['dns_system']) {
- $ip_addr = gethostbyname($host);
- if ($ip_addr == $host)
- $ip_addr = false;
- } else {
- $resp = shell_exec_error('host -W 1 ' . $host);
- if (preg_match('/has address ([^\s]+)$/', $resp, $m))
- $ip_addr = $m[1];
- else
- $ip_addr = false;
- }
+ if (!$config['dns_system']) {
+ $ip_addr = gethostbyname($host);
+ if ($ip_addr == $host)
+ $ip_addr = false;
+ } else {
+ $resp = shell_exec_error('host -W 1 ' . $host);
+ if (preg_match('/has address ([^\s]+)$/', $resp, $m))
+ $ip_addr = $m[1];
+ else
+ $ip_addr = false;
+ }
- if ($config['cache']['enabled'])
- cache::set('dns_' . $host, $ip_addr !== false ? $ip_addr : '?');
+ if ($config['cache']['enabled'])
+ cache::set('dns_' . $host, $ip_addr !== false ? $ip_addr : '?');
- return $ip_addr;
+ return $ip_addr;
}
function shell_exec_error($command, $suppress_stdout = false) {
- global $config, $debug;
+ global $config, $debug;
- if ($config['debug'])
- $start = microtime(true);
+ if ($config['debug'])
+ $start = microtime(true);
- $return = trim(shell_exec('PATH="' . escapeshellcmd($config['shell_path']) . ':$PATH";' .
- $command . ' 2>&1 ' . ($suppress_stdout ? '> /dev/null ' : '') . '&& echo "TB_SUCCESS"'));
- $return = preg_replace('/TB_SUCCESS$/', '', $return);
+ $return = trim(shell_exec('PATH="' . escapeshellcmd($config['shell_path']) . ':$PATH";' .
+ $command . ' 2>&1 ' . ($suppress_stdout ? '> /dev/null ' : '') . '&& echo "TB_SUCCESS"'));
+ $return = preg_replace('/TB_SUCCESS$/', '', $return);
- if ($config['debug']) {
- $time = microtime(true) - $start;
- $debug['exec'][] = array(
- 'command' => $command,
- 'time' => '~' . round($time * 1000, 2) . 'ms',
- 'response' => $return ? $return : null
- );
- $debug['time']['exec'] += $time;
- }
+ if ($config['debug']) {
+ $time = microtime(true) - $start;
+ $debug['exec'][] = array(
+ 'command' => $command,
+ 'time' => '~' . round($time * 1000, 2) . 'ms',
+ 'response' => $return ? $return : null
+ );
+ $debug['time']['exec'] += $time;
+ }
- return $return === 'TB_SUCCESS' ? false : $return;
+ return $return === 'TB_SUCCESS' ? false : $return;
}
/* Die rolling:
@@ -2640,242 +2676,242 @@ function shell_exec_error($command, $suppress_stdout = false) {
* added on. The result is displayed at the top of the post.
*/
function diceRoller($post) {
- global $config;
- if(strpos(strtolower($post->email), 'dice%20') === 0) {
- $dicestr = str_split(substr($post->email, strlen('dice%20')));
+ global $config;
+ if(strpos(strtolower($post->email), 'dice%20') === 0) {
+ $dicestr = str_split(substr($post->email, strlen('dice%20')));
- // Get params
- $diceX = '';
- $diceY = '';
- $diceZ = '';
+ // Get params
+ $diceX = '';
+ $diceY = '';
+ $diceZ = '';
- $curd = 'diceX';
- for($i = 0; $i < count($dicestr); $i ++) {
- if(is_numeric($dicestr[$i])) {
- $$curd .= $dicestr[$i];
- } else if($dicestr[$i] == 'd') {
- $curd = 'diceY';
- } else if($dicestr[$i] == '-' || $dicestr[$i] == '+') {
- $curd = 'diceZ';
- $$curd = $dicestr[$i];
- }
- }
+ $curd = 'diceX';
+ for($i = 0; $i < count($dicestr); $i ++) {
+ if(is_numeric($dicestr[$i])) {
+ $$curd .= $dicestr[$i];
+ } else if($dicestr[$i] == 'd') {
+ $curd = 'diceY';
+ } else if($dicestr[$i] == '-' || $dicestr[$i] == '+') {
+ $curd = 'diceZ';
+ $$curd = $dicestr[$i];
+ }
+ }
- // Default values for X and Z
- if($diceX == '') {
- $diceX = '1';
- }
+ // Default values for X and Z
+ if($diceX == '') {
+ $diceX = '1';
+ }
- if($diceZ == '') {
- $diceZ = '+0';
- }
+ if($diceZ == '') {
+ $diceZ = '+0';
+ }
- // Intify them
- $diceX = intval($diceX);
- $diceY = intval($diceY);
- $diceZ = intval($diceZ);
+ // Intify them
+ $diceX = intval($diceX);
+ $diceY = intval($diceY);
+ $diceZ = intval($diceZ);
- // Continue only if we have valid values
- if($diceX > 0 && $diceY > 0) {
- $dicerolls = array();
- $dicesum = $diceZ;
- for($i = 0; $i < $diceX; $i++) {
- $roll = rand(1, $diceY);
- $dicerolls[] = $roll;
- $dicesum += $roll;
- }
+ // Continue only if we have valid values
+ if($diceX > 0 && $diceY > 0) {
+ $dicerolls = array();
+ $dicesum = $diceZ;
+ for($i = 0; $i < $diceX; $i++) {
+ $roll = rand(1, $diceY);
+ $dicerolls[] = $roll;
+ $dicesum += $roll;
+ }
- // Prepend the result to the post body
- $modifier = ($diceZ != 0) ? ((($diceZ < 0) ? ' - ' : ' + ') . abs($diceZ)) : '';
- $dicesum = ($diceX > 1) ? ' = ' . $dicesum : '';
- $post->body = 'Rolled ' . implode(', ', $dicerolls) . $modifier . $dicesum . '
' . $post->body;
- }
- }
+ // Prepend the result to the post body
+ $modifier = ($diceZ != 0) ? ((($diceZ < 0) ? ' - ' : ' + ') . abs($diceZ)) : '';
+ $dicesum = ($diceX > 1) ? ' = ' . $dicesum : '';
+ $post->body = 'Rolled ' . implode(', ', $dicerolls) . $modifier . $dicesum . '
' . $post->body;
+ }
+ }
}
function slugify($post) {
- global $config;
+ global $config;
- $slug = "";
+ $slug = "";
- if (isset($post['subject']) && $post['subject'])
- $slug = $post['subject'];
- elseif (isset ($post['body_nomarkup']) && $post['body_nomarkup'])
- $slug = $post['body_nomarkup'];
- elseif (isset ($post['body']) && $post['body'])
- $slug = strip_tags($post['body']);
+ if (isset($post['subject']) && $post['subject'])
+ $slug = $post['subject'];
+ elseif (isset ($post['body_nomarkup']) && $post['body_nomarkup'])
+ $slug = $post['body_nomarkup'];
+ elseif (isset ($post['body']) && $post['body'])
+ $slug = strip_tags($post['body']);
- // Fix UTF-8 first
- $slug = mb_convert_encoding($slug, "UTF-8", "UTF-8");
+ // Fix UTF-8 first
+ $slug = mb_convert_encoding($slug, "UTF-8", "UTF-8");
- // Transliterate local characters like ü, I wonder how would it work for weird alphabets :^)
- // $slug = iconv("UTF-8", "ASCII//TRANSLIT//IGNORE", $slug);
- $slug = mb_convert_encoding($slug, "ASCII", "UTF-8");
+ // Transliterate local characters like ü, I wonder how would it work for weird alphabets :^)
+ // $slug = iconv("UTF-8", "ASCII//TRANSLIT//IGNORE", $slug);
+ $slug = mb_convert_encoding($slug, "ASCII", "UTF-8");
- // Remove Tinyboard custom markup
- $slug = preg_replace("/]+>.*?<\/tinyboard>/s", '', $slug);
+ // Remove Tinyboard custom markup
+ $slug = preg_replace("/]+>.*?<\/tinyboard>/s", '', $slug);
- // Downcase everything
- $slug = strtolower($slug);
+ // Downcase everything
+ $slug = strtolower($slug);
- // Strip bad characters, alphanumerics should suffice
- $slug = preg_replace('/[^a-zA-Z0-9]/', '-', $slug);
+ // Strip bad characters, alphanumerics should suffice
+ $slug = preg_replace('/[^a-zA-Z0-9]/', '-', $slug);
- // Replace multiple dashes with single ones
- $slug = preg_replace('/-+/', '-', $slug);
+ // Replace multiple dashes with single ones
+ $slug = preg_replace('/-+/', '-', $slug);
- // Strip dashes at the beginning and at the end
- $slug = preg_replace('/^-|-$/', '', $slug);
+ // Strip dashes at the beginning and at the end
+ $slug = preg_replace('/^-|-$/', '', $slug);
- // Slug should be X characters long, at max (80?)
- $slug = substr($slug, 0, $config['slug_max_size']);
+ // Slug should be X characters long, at max (80?)
+ $slug = substr($slug, 0, $config['slug_max_size']);
- // Slug is now ready
- return $slug;
+ // Slug is now ready
+ return $slug;
}
function link_for($post, $page50 = false, $foreignlink = false, $thread = false) {
- global $config, $board;
+ global $config, $board;
- $post = (array)$post;
+ $post = (array)$post;
- // Where do we need to look for OP?
- $b = $foreignlink ? $foreignlink : (isset($post['board']) ? array('uri' => $post['board']) : $board);
+ // Where do we need to look for OP?
+ $b = $foreignlink ? $foreignlink : (isset($post['board']) ? array('uri' => $post['board']) : $board);
- $id = (isset($post['thread']) && $post['thread']) ? $post['thread'] : $post['id'];
+ $id = (isset($post['thread']) && $post['thread']) ? $post['thread'] : $post['id'];
- $slug = false;
+ $slug = false;
- if ($config['slugify'] && ( (isset($post['thread']) && $post['thread']) || !isset ($post['slug']) ) ) {
- $cvar = "slug_".$b['uri']."_".$id;
- if (!$thread) {
- $slug = Cache::get($cvar);
+ if ($config['slugify'] && ( (isset($post['thread']) && $post['thread']) || !isset ($post['slug']) ) ) {
+ $cvar = "slug_".$b['uri']."_".$id;
+ if (!$thread) {
+ $slug = Cache::get($cvar);
- if ($slug === false) {
- $query = prepare(sprintf("SELECT `slug` FROM ``posts_%s`` WHERE `id` = :id", $b['uri']));
- $query->bindValue(':id', $id, PDO::PARAM_INT);
- $query->execute() or error(db_error($query));
+ if ($slug === false) {
+ $query = prepare(sprintf("SELECT `slug` FROM ``posts_%s`` WHERE `id` = :id", $b['uri']));
+ $query->bindValue(':id', $id, PDO::PARAM_INT);
+ $query->execute() or error(db_error($query));
- $thread = $query->fetch(PDO::FETCH_ASSOC);
+ $thread = $query->fetch(PDO::FETCH_ASSOC);
- $slug = $thread['slug'];
+ $slug = $thread['slug'];
- Cache::set($cvar, $slug);
- }
- }
- else {
- $slug = $thread['slug'];
- }
- }
- elseif ($config['slugify']) {
- $slug = $post['slug'];
- }
+ Cache::set($cvar, $slug);
+ }
+ }
+ else {
+ $slug = $thread['slug'];
+ }
+ }
+ elseif ($config['slugify']) {
+ $slug = $post['slug'];
+ }
- if ( $page50 && $slug) $tpl = $config['file_page50_slug'];
- else if (!$page50 && $slug) $tpl = $config['file_page_slug'];
- else if ( $page50 && !$slug) $tpl = $config['file_page50'];
- else if (!$page50 && !$slug) $tpl = $config['file_page'];
+ if ( $page50 && $slug) $tpl = $config['file_page50_slug'];
+ else if (!$page50 && $slug) $tpl = $config['file_page_slug'];
+ else if ( $page50 && !$slug) $tpl = $config['file_page50'];
+ else if (!$page50 && !$slug) $tpl = $config['file_page'];
- return sprintf($tpl, $id, $slug);
+ return sprintf($tpl, $id, $slug);
}
function prettify_textarea($s){
- return str_replace("\t", ' ', str_replace("\n", '
', htmlentities($s)));
+ return str_replace("\t", ' ', str_replace("\n", '
', htmlentities($s)));
}
/*class HTMLPurifier_URIFilter_NoExternalImages extends HTMLPurifier_URIFilter {
- public $name = 'NoExternalImages';
- public function filter(&$uri, $c, $context) {
- global $config;
- $ct = $context->get('CurrentToken');
+ public $name = 'NoExternalImages';
+ public function filter(&$uri, $c, $context) {
+ global $config;
+ $ct = $context->get('CurrentToken');
- if (!$ct || $ct->name !== 'img') return true;
+ if (!$ct || $ct->name !== 'img') return true;
- if (!isset($uri->host) && !isset($uri->scheme)) return true;
+ if (!isset($uri->host) && !isset($uri->scheme)) return true;
- if (!in_array($uri->scheme . '://' . $uri->host . '/', $config['allowed_offsite_urls'])) {
- error('No off-site links in board announcement images.');
- }
+ if (!in_array($uri->scheme . '://' . $uri->host . '/', $config['allowed_offsite_urls'])) {
+ error('No off-site links in board announcement images.');
+ }
- return true;
- }
+ return true;
+ }
}*/
function purify_html($s) {
- global $config;
+ global $config;
- $c = HTMLPurifier_Config::createDefault();
- $c->set('HTML.Allowed', $config['allowed_html']);
- $uri = $c->getDefinition('URI');
- $uri->addFilter(new HTMLPurifier_URIFilter_NoExternalImages(), $c);
- $purifier = new HTMLPurifier($c);
- $clean_html = $purifier->purify($s);
- return $clean_html;
+ $c = HTMLPurifier_Config::createDefault();
+ $c->set('HTML.Allowed', $config['allowed_html']);
+ $uri = $c->getDefinition('URI');
+ $uri->addFilter(new HTMLPurifier_URIFilter_NoExternalImages(), $c);
+ $purifier = new HTMLPurifier($c);
+ $clean_html = $purifier->purify($s);
+ return $clean_html;
}
function markdown($s) {
- $pd = new Parsedown();
- $pd->setMarkupEscaped(true);
- $pd->setimagesEnabled(false);
+ $pd = new Parsedown();
+ $pd->setMarkupEscaped(true);
+ $pd->setimagesEnabled(false);
- return $pd->text($s);
+ return $pd->text($s);
}
function generation_strategy($fun, $array=array()) { global $config;
- $action = false;
+ $action = false;
- foreach ($config['generation_strategies'] as $s) {
- if ($action = $s($fun, $array)) {
- break;
- }
- }
+ foreach ($config['generation_strategies'] as $s) {
+ if ($action = $s($fun, $array)) {
+ break;
+ }
+ }
- switch ($action[0]) {
- case 'immediate':
- return 'rebuild';
- case 'defer':
- // Ok, it gets interesting here :)
- get_queue('generate')->push(serialize(array('build', $fun, $array, $action)));
- return 'ignore';
- case 'build_on_load':
- return 'delete';
- }
+ switch ($action[0]) {
+ case 'immediate':
+ return 'rebuild';
+ case 'defer':
+ // Ok, it gets interesting here :)
+ get_queue('generate')->push(serialize(array('build', $fun, $array, $action)));
+ return 'ignore';
+ case 'build_on_load':
+ return 'delete';
+ }
}
function strategy_immediate($fun, $array) {
- return array('immediate');
+ return array('immediate');
}
function strategy_smart_build($fun, $array) {
- return array('build_on_load');
+ return array('build_on_load');
}
function strategy_sane($fun, $array) { global $config;
- if (php_sapi_name() == 'cli') return false;
- else if (isset($_POST['mod'])) return false;
- // Thread needs to be done instantly. Same with a board page, but only if posting a new thread.
- else if ($fun == 'sb_thread' || ($fun == 'sb_board' && $array[1] == 1 && isset ($_POST['page']))) return array('immediate');
- else return false;
+ if (php_sapi_name() == 'cli') return false;
+ else if (isset($_POST['mod'])) return false;
+ // Thread needs to be done instantly. Same with a board page, but only if posting a new thread.
+ else if ($fun == 'sb_thread' || ($fun == 'sb_board' && $array[1] == 1 && isset ($_POST['page']))) return array('immediate');
+ else return false;
}
// My first, test strategy.
function strategy_first($fun, $array) {
- switch ($fun) {
- case 'sb_thread':
- return array('defer');
- case 'sb_board':
- if ($array[1] > 8) return array('build_on_load');
- else return array('defer');
- case 'sb_api':
- return array('defer');
- case 'sb_catalog':
- return array('defer');
- case 'sb_recent':
- return array('build_on_load');
- case 'sb_sitemap':
- return array('build_on_load');
- case 'sb_ukko':
- return array('defer');
- }
+ switch ($fun) {
+ case 'sb_thread':
+ return array('defer');
+ case 'sb_board':
+ if ($array[1] > 8) return array('build_on_load');
+ else return array('defer');
+ case 'sb_api':
+ return array('defer');
+ case 'sb_catalog':
+ return array('defer');
+ case 'sb_recent':
+ return array('build_on_load');
+ case 'sb_sitemap':
+ return array('build_on_load');
+ case 'sb_ukko':
+ return array('defer');
+ }
}
diff --git a/inc/instance-config.php b/inc/instance-config.php
index d7d5ebe4..c3c68f37 100644
--- a/inc/instance-config.php
+++ b/inc/instance-config.php
@@ -13,23 +13,11 @@
*/
$config['boards'] = array(
- array(
- 'leftypol',
- 'b',
- 'WRK',
- 'hobby',
- 'tech',
- 'edu',
- 'ga',
- 'ent',
- '777',
- 'posad',
- 'i',
- 'a',
- 'R9K',
- 'dead'
- ),
- array('meta')
+ array(
+ 'b',
+ 'leftypol',
+ 'Test'
+ )
);
$config['prepended_foreign_boards'] = array(
@@ -41,23 +29,9 @@ $config['prepended_foreign_boards'] = array(
// Board categories. Only used in the "Categories" theme.
$config['categories'] = array(
- 'Leftypol' => array(
- 'leftypol',
- 'b',
- 'WRK',
- 'hobby',
- 'tech',
- 'edu',
- 'ga',
- 'ent',
- '777',
- 'posad',
- 'i',
- 'a',
- 'R9K',
- 'dead'
- ),
- 'Meta' => array('meta')
+ 'Leftychan' => array(
+ 'b',
+ )
);
// Optional for the Categories theme. This is an array of name => (title, url) groups for categories
@@ -93,11 +67,11 @@ $config['cookies']['mod'] = 'mod';
$config['cookies']['salt'] = 'MGYwNjhlNjU5Y2QxNWU3YjQ3MzQ1Yj';
$config['search']['enable'] = true;
-$config['flood_cache'] = 60 * 15; // 15 minutes. The oldest a post can be in the flood table
-$config['flood_time_any'] = 20; // time between thread creation
-$config['flood_time'] = 0;
-$config['flood_time_ip'] = 60;
-$config['flood_time_same'] = 60;
+$config['flood_cache'] = 0; // 15 minutes. The oldest a post can be in the flood table
+$config['flood_time_any'] = -1; // time between thread creation
+$config['flood_time'] = -1;
+$config['flood_time_ip'] = -1;
+$config['flood_time_same'] = -1;
$config['max_body'] = 80000;
$config['reply_limit'] = 600;
$config['max_links'] = 40;
@@ -130,8 +104,12 @@ $config['post_date'] = '%F (%a) %T';
$config['thread_subject_in_title'] = true;
-// this functionality is permanently disabled.
-$config['spam']['enabled'] = false;
+$config['spam']['enabled'] = true;
+$config['spam_noticer']['enabled'] = true;
+$config['spam_noticer']['base_url'] = 'http://localhost:8300';
+$config['spam_noticer']['ui_url'] = 'https://dev-spamnoticer.leftychan.net/static/index.html';
+$config['spam_noticer']['imageboard_root'] = 'http://dev.leftychan.net/';
+$config['spam_noticer']['website_name'] = "leftychan_dev";
/*
* Basic captcha. See also: captchaconfig.php
@@ -528,3 +506,4 @@ $config['filters'][] = array(
);
$config['global_message'] = 'Matrix
IRC Chat
Mumble
Telegram
Discord
';
+$config['debug'] = true;
diff --git a/inc/lib/IP/LICENSE b/inc/lib/IP/LICENSE
deleted file mode 100755
index fb315548..00000000
--- a/inc/lib/IP/LICENSE
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2013 Jason Morriss
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is furnished
-to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
diff --git a/inc/lib/IP/Lifo/IP/BC.php b/inc/lib/IP/Lifo/IP/BC.php
deleted file mode 100755
index 545fe372..00000000
--- a/inc/lib/IP/Lifo/IP/BC.php
+++ /dev/null
@@ -1,293 +0,0 @@
-
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-namespace Lifo\IP;
-
-/**
- * BCMath helper class.
- *
- * Provides a handful of BCMath routines that are not included in the native
- * PHP library.
- *
- * Note: The Bitwise functions operate on fixed byte boundaries. For example,
- * comparing the following numbers uses X number of bits:
- * 0xFFFF and 0xFF will result in comparison of 16 bits.
- * 0xFFFFFFFF and 0xF will result in comparison of 32 bits.
- * etc...
- *
- */
-abstract class BC
-{
- // Some common (maybe useless) constants
- const MAX_INT_32 = '2147483647'; // 7FFFFFFF
- const MAX_UINT_32 = '4294967295'; // FFFFFFFF
- const MAX_INT_64 = '9223372036854775807'; // 7FFFFFFFFFFFFFFF
- const MAX_UINT_64 = '18446744073709551615'; // FFFFFFFFFFFFFFFF
- const MAX_INT_96 = '39614081257132168796771975167'; // 7FFFFFFFFFFFFFFFFFFFFFFF
- const MAX_UINT_96 = '79228162514264337593543950335'; // FFFFFFFFFFFFFFFFFFFFFFFF
- const MAX_INT_128 = '170141183460469231731687303715884105727'; // 7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
- const MAX_UINT_128 = '340282366920938463463374607431768211455'; // FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
-
- /**
- * BC Math function to convert a HEX string into a DECIMAL
- */
- public static function bchexdec($hex)
- {
- if (strlen($hex) == 1) {
- return hexdec($hex);
- }
-
- $remain = substr($hex, 0, -1);
- $last = substr($hex, -1);
- return bcadd(bcmul(16, self::bchexdec($remain), 0), hexdec($last), 0);
- }
-
- /**
- * BC Math function to convert a DECIMAL string into a BINARY string
- */
- public static function bcdecbin($dec, $pad = null)
- {
- $bin = '';
- while ($dec) {
- $m = bcmod($dec, 2);
- $dec = bcdiv($dec, 2, 0);
- $bin = abs($m) . $bin;
- }
- return $pad ? sprintf("%0{$pad}s", $bin) : $bin;
- }
-
- /**
- * BC Math function to convert a BINARY string into a DECIMAL string
- */
- public static function bcbindec($bin)
- {
- $dec = '0';
- for ($i=0, $j=strlen($bin); $i<$j; $i++) {
- $dec = bcmul($dec, '2', 0);
- $dec = bcadd($dec, $bin[$i], 0);
- }
- return $dec;
- }
-
- /**
- * BC Math function to convert a BINARY string into a HEX string
- */
- public static function bcbinhex($bin, $pad = 0)
- {
- return self::bcdechex(self::bcbindec($bin));
- }
-
- /**
- * BC Math function to convert a DECIMAL into a HEX string
- */
- public static function bcdechex($dec)
- {
- $last = bcmod($dec, 16);
- $remain = bcdiv(bcsub($dec, $last, 0), 16, 0);
- return $remain == 0 ? dechex($last) : self::bcdechex($remain) . dechex($last);
- }
-
- /**
- * Bitwise AND two arbitrarily large numbers together.
- */
- public static function bcand($left, $right)
- {
- $len = self::_bitwise($left, $right);
-
- $value = '';
- for ($i=0; $i<$len; $i++) {
- $value .= (($left{$i} + 0) & ($right{$i} + 0)) ? '1' : '0';
- }
- return self::bcbindec($value != '' ? $value : '0');
- }
-
- /**
- * Bitwise OR two arbitrarily large numbers together.
- */
- public static function bcor($left, $right)
- {
- $len = self::_bitwise($left, $right);
-
- $value = '';
- for ($i=0; $i<$len; $i++) {
- $value .= (($left{$i} + 0) | ($right{$i} + 0)) ? '1' : '0';
- }
- return self::bcbindec($value != '' ? $value : '0');
- }
-
- /**
- * Bitwise XOR two arbitrarily large numbers together.
- */
- public static function bcxor($left, $right)
- {
- $len = self::_bitwise($left, $right);
-
- $value = '';
- for ($i=0; $i<$len; $i++) {
- $value .= (($left{$i} + 0) ^ ($right{$i} + 0)) ? '1' : '0';
- }
- return self::bcbindec($value != '' ? $value : '0');
- }
-
- /**
- * Bitwise NOT two arbitrarily large numbers together.
- */
- public static function bcnot($left, $bits = null)
- {
- $right = 0;
- $len = self::_bitwise($left, $right, $bits);
- $value = '';
- for ($i=0; $i<$len; $i++) {
- $value .= $left{$i} == '1' ? '0' : '1';
- }
- return self::bcbindec($value);
- }
-
- /**
- * Shift number to the left
- *
- * @param integer $bits Total bits to shift
- */
- public static function bcleft($num, $bits) {
- return bcmul($num, bcpow('2', $bits));
- }
-
- /**
- * Shift number to the right
- *
- * @param integer $bits Total bits to shift
- */
- public static function bcright($num, $bits) {
- return bcdiv($num, bcpow('2', $bits));
- }
-
- /**
- * Determine how many bits are needed to store the number rounded to the
- * nearest bit boundary.
- */
- public static function bits_needed($num, $boundary = 4)
- {
- $bits = 0;
- while ($num > 0) {
- $num = bcdiv($num, '2', 0);
- $bits++;
- }
- // round to nearest boundrary
- return $boundary ? ceil($bits / $boundary) * $boundary : $bits;
- }
-
- /**
- * BC Math function to return an arbitrarily large random number.
- */
- public static function bcrand($min, $max = null)
- {
- if ($max === null) {
- $max = $min;
- $min = 0;
- }
-
- // swap values if $min > $max
- if (bccomp($min, $max) == 1) {
- list($min,$max) = array($max,$min);
- }
-
- return bcadd(
- bcmul(
- bcdiv(
- mt_rand(0, mt_getrandmax()),
- mt_getrandmax(),
- strlen($max)
- ),
- bcsub(
- bcadd($max, '1'),
- $min
- )
- ),
- $min
- );
- }
-
- /**
- * Computes the natural logarithm using a series.
- * @author Thomas Oldbury.
- * @license Public domain.
- */
- public static function bclog($num, $iter = 10, $scale = 100)
- {
- $log = "0.0";
- for($i = 0; $i < $iter; $i++) {
- $pow = 1 + (2 * $i);
- $mul = bcdiv("1.0", $pow, $scale);
- $fraction = bcmul($mul, bcpow(bcsub($num, "1.0", $scale) / bcadd($num, "1.0", $scale), $pow, $scale), $scale);
- $log = bcadd($fraction, $log, $scale);
- }
- return bcmul("2.0", $log, $scale);
- }
-
- /**
- * Computes the base2 log using baseN log.
- */
- public static function bclog2($num, $iter = 10, $scale = 100)
- {
- return bcdiv(self::bclog($num, $iter, $scale), self::bclog("2", $iter, $scale), $scale);
- }
-
- public static function bcfloor($num)
- {
- if (substr($num, 0, 1) == '-') {
- return bcsub($num, 1, 0);
- }
- return bcadd($num, 0, 0);
- }
-
- public static function bcceil($num)
- {
- if (substr($num, 0, 1) == '-') {
- return bcsub($num, 0, 0);
- }
- return bcadd($num, 1, 0);
- }
-
- /**
- * Compare two numbers and return -1, 0, 1 depending if the LEFT number is
- * < = > the RIGHT.
- *
- * @param string|integer $left Left side operand
- * @param string|integer $right Right side operand
- * @return integer Return -1,0,1 for <=> comparison
- */
- public static function cmp($left, $right)
- {
- // @todo could an optimization be done to determine if a normal 32bit
- // comparison could be done instead of using bccomp? But would
- // the number verification cause too much overhead to be useful?
- return bccomp($left, $right, 0);
- }
-
- /**
- * Internal function to prepare for bitwise operations
- */
- private static function _bitwise(&$left, &$right, $bits = null)
- {
- if ($bits === null) {
- $bits = max(self::bits_needed($left), self::bits_needed($right));
- }
-
- $left = self::bcdecbin($left);
- $right = self::bcdecbin($right);
-
- $len = max(strlen($left), strlen($right), (int)$bits);
-
- $left = sprintf("%0{$len}s", $left);
- $right = sprintf("%0{$len}s", $right);
-
- return $len;
- }
-
-}
diff --git a/inc/lib/IP/Lifo/IP/CIDR.php b/inc/lib/IP/Lifo/IP/CIDR.php
deleted file mode 100755
index e8fe32ce..00000000
--- a/inc/lib/IP/Lifo/IP/CIDR.php
+++ /dev/null
@@ -1,706 +0,0 @@
-
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-namespace Lifo\IP;
-
-/**
- * CIDR Block helper class.
- *
- * Most routines can be used statically or by instantiating an object and
- * calling its methods.
- *
- * Provides routines to do various calculations on IP addresses and ranges.
- * Convert to/from CIDR to ranges, etc.
- */
-class CIDR
-{
- const INTERSECT_NO = 0;
- const INTERSECT_YES = 1;
- const INTERSECT_LOW = 2;
- const INTERSECT_HIGH = 3;
-
- protected $start;
- protected $end;
- protected $prefix;
- protected $version;
- protected $istart;
- protected $iend;
-
- private $cache;
-
- /**
- * Create a new CIDR object.
- *
- * The IP range can be arbitrary and does not have to fall on a valid CIDR
- * range. Some methods will return different values depending if you ignore
- * the prefix or not. By default all prefix sensitive methods will assume
- * the prefix is used.
- *
- * @param string $cidr An IP address (1.2.3.4), CIDR block (1.2.3.4/24),
- * or range "1.2.3.4-1.2.3.10"
- * @param string $end Ending IP in range if no cidr/prefix is given
- */
- public function __construct($cidr, $end = null)
- {
- if ($end !== null) {
- $this->setRange($cidr, $end);
- } else {
- $this->setCidr($cidr);
- }
- }
-
- /**
- * Returns the string representation of the CIDR block.
- */
- public function __toString()
- {
- // do not include the prefix if its a single IP
- try {
- if ($this->isTrueCidr() && (
- ($this->version == 4 and $this->prefix != 32) ||
- ($this->version == 6 and $this->prefix != 128)
- )
- ) {
- return $this->start . '/' . $this->prefix;
- }
- } catch (\Exception $e) {
- // isTrueCidr() calls getRange which can throw an exception
- }
- if (strcmp($this->start, $this->end) == 0) {
- return $this->start;
- }
- return $this->start . ' - ' . $this->end;
- }
-
- public function __clone()
- {
- // do not clone the cache. No real reason why. I just want to keep the
- // memory foot print as low as possible, even though this is trivial.
- $this->cache = array();
- }
-
- /**
- * Set an arbitrary IP range.
- * The closest matching prefix will be calculated but the actual range
- * stored in the object can be arbitrary.
- * @param string $start Starting IP or combination "start-end" string.
- * @param string $end Ending IP or null.
- */
- public function setRange($ip, $end = null)
- {
- if (strpos($ip, '-') !== false) {
- list($ip, $end) = array_map('trim', explode('-', $ip, 2));
- }
-
- if (false === filter_var($ip, FILTER_VALIDATE_IP) ||
- false === filter_var($end, FILTER_VALIDATE_IP)) {
- throw new \InvalidArgumentException("Invalid IP range \"$ip-$end\"");
- }
-
- // determine version (4 or 6)
- $this->version = (false === filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) ? 6 : 4;
-
- $this->istart = IP::inet_ptod($ip);
- $this->iend = IP::inet_ptod($end);
-
- // fix order
- if (bccomp($this->istart, $this->iend) == 1) {
- list($this->istart, $this->iend) = array($this->iend, $this->istart);
- list($ip, $end) = array($end, $ip);
- }
-
- $this->start = $ip;
- $this->end = $end;
-
- // calculate real prefix
- $len = $this->version == 4 ? 32 : 128;
- $this->prefix = $len - strlen(BC::bcdecbin(BC::bcxor($this->istart, $this->iend)));
- }
-
- /**
- * Returns true if the current IP is a true cidr block
- */
- public function isTrueCidr()
- {
- return $this->start == $this->getNetwork() && $this->end == $this->getBroadcast();
- }
-
- /**
- * Set the CIDR block.
- *
- * The prefix length is optional and will default to 32 ot 128 depending on
- * the version detected.
- *
- * @param string $cidr CIDR block string, eg: "192.168.0.0/24" or "2001::1/64"
- * @throws \InvalidArgumentException If the CIDR block is invalid
- */
- public function setCidr($cidr)
- {
- if (strpos($cidr, '-') !== false) {
- return $this->setRange($cidr);
- }
-
- list($ip, $bits) = array_pad(array_map('trim', explode('/', $cidr, 2)), 2, null);
- if (false === filter_var($ip, FILTER_VALIDATE_IP)) {
- throw new \InvalidArgumentException("Invalid IP address \"$cidr\"");
- }
-
- // determine version (4 or 6)
- $this->version = (false === filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) ? 6 : 4;
-
- $this->start = $ip;
- $this->istart = IP::inet_ptod($ip);
-
- if ($bits !== null and $bits !== '') {
- $this->prefix = $bits;
- } else {
- $this->prefix = $this->version == 4 ? 32 : 128;
- }
-
- if (($this->prefix < 0)
- || ($this->prefix > 32 and $this->version == 4)
- || ($this->prefix > 128 and $this->version == 6)) {
- throw new \InvalidArgumentException("Invalid IP address \"$cidr\"");
- }
-
- $this->end = $this->getBroadcast();
- $this->iend = IP::inet_ptod($this->end);
-
- $this->cache = array();
- }
-
- /**
- * Get the IP version. 4 or 6.
- *
- * @return integer
- */
- public function getVersion()
- {
- return $this->version;
- }
-
- /**
- * Get the prefix.
- *
- * Always returns the "proper" prefix, even if the IP range is arbitrary.
- *
- * @return integer
- */
- public function getPrefix()
- {
- return $this->prefix;
- }
-
- /**
- * Return the starting presentational IP or Decimal value.
- *
- * Ignores prefix
- */
- public function getStart($decimal = false)
- {
- return $decimal ? $this->istart : $this->start;
- }
-
- /**
- * Return the ending presentational IP or Decimal value.
- *
- * Ignores prefix
- */
- public function getEnd($decimal = false)
- {
- return $decimal ? $this->iend : $this->end;
- }
-
- /**
- * Return the next presentational IP or Decimal value (following the
- * broadcast address of the current CIDR block).
- */
- public function getNext($decimal = false)
- {
- $next = bcadd($this->getEnd(true), '1');
- return $decimal ? $next : new self(IP::inet_dtop($next));
- }
-
- /**
- * Returns true if the IP is an IPv4
- *
- * @return boolean
- */
- public function isIPv4()
- {
- return $this->version == 4;
- }
-
- /**
- * Returns true if the IP is an IPv6
- *
- * @return boolean
- */
- public function isIPv6()
- {
- return $this->version == 6;
- }
-
- /**
- * Get the cidr notation for the subnet block.
- *
- * This is useful for when you want a string representation of the IP/prefix
- * and the starting IP is not on a valid network boundrary (eg: Displaying
- * an IP from an interface).
- *
- * @return string IP in CIDR notation "ipaddr/prefix"
- */
- public function getCidr()
- {
- return $this->start . '/' . $this->prefix;
- }
-
- /**
- * Get the [low,high] range of the CIDR block
- *
- * Prefix sensitive.
- *
- * @param boolean $ignorePrefix If true the arbitrary start-end range is
- * returned. default=false.
- */
- public function getRange($ignorePrefix = false)
- {
- $range = $ignorePrefix
- ? array($this->start, $this->end)
- : self::cidr_to_range($this->start, $this->prefix);
- // watch out for IP '0' being converted to IPv6 '::'
- if ($range[0] == '::' and strpos($range[1], ':') == false) {
- $range[0] = '0.0.0.0';
- }
- return $range;
- }
-
- /**
- * Return the IP in its fully expanded form.
- *
- * For example: 2001::1 == 2007:0000:0000:0000:0000:0000:0000:0001
- *
- * @see IP::inet_expand
- */
- public function getExpanded()
- {
- return IP::inet_expand($this->start);
- }
-
- /**
- * Get network IP of the CIDR block
- *
- * Prefix sensitive.
- *
- * @param boolean $ignorePrefix If true the arbitrary start-end range is
- * returned. default=false.
- */
- public function getNetwork($ignorePrefix = false)
- {
- // micro-optimization to prevent calling getRange repeatedly
- $k = $ignorePrefix ? 1 : 0;
- if (!isset($this->cache['range'][$k])) {
- $this->cache['range'][$k] = $this->getRange($ignorePrefix);
- }
- return $this->cache['range'][$k][0];
- }
-
- /**
- * Get broadcast IP of the CIDR block
- *
- * Prefix sensitive.
- *
- * @param boolean $ignorePrefix If true the arbitrary start-end range is
- * returned. default=false.
- */
- public function getBroadcast($ignorePrefix = false)
- {
- // micro-optimization to prevent calling getRange repeatedly
- $k = $ignorePrefix ? 1 : 0;
- if (!isset($this->cache['range'][$k])) {
- $this->cache['range'][$k] = $this->getRange($ignorePrefix);
- }
- return $this->cache['range'][$k][1];
- }
-
- /**
- * Get the network mask based on the prefix.
- *
- */
- public function getMask()
- {
- return self::prefix_to_mask($this->prefix, $this->version);
- }
-
- /**
- * Get total hosts within CIDR range
- *
- * Prefix sensitive.
- *
- * @param boolean $ignorePrefix If true the arbitrary start-end range is
- * returned. default=false.
- */
- public function getTotal($ignorePrefix = false)
- {
- // micro-optimization to prevent calling getRange repeatedly
- $k = $ignorePrefix ? 1 : 0;
- if (!isset($this->cache['range'][$k])) {
- $this->cache['range'][$k] = $this->getRange($ignorePrefix);
- }
- return bcadd(bcsub(IP::inet_ptod($this->cache['range'][$k][1]),
- IP::inet_ptod($this->cache['range'][$k][0])), '1');
- }
-
- public function intersects($cidr)
- {
- return self::cidr_intersect((string)$this, $cidr);
- }
-
- /**
- * Determines the intersection between an IP (with optional prefix) and a
- * CIDR block.
- *
- * The IP will be checked against the CIDR block given and will either be
- * inside or outside the CIDR completely, or partially.
- *
- * NOTE: The caller should explicitly check against the INTERSECT_*
- * constants because this method will return a value > 1 even for partial
- * matches.
- *
- * @param mixed $ip The IP/cidr to match
- * @param mixed $cidr The CIDR block to match within
- * @return integer Returns an INTERSECT_* constant
- * @throws \InvalidArgumentException if either $ip or $cidr is invalid
- */
- public static function cidr_intersect($ip, $cidr)
- {
- // use fixed length HEX strings so we can easily do STRING comparisons
- // instead of using slower bccomp() math.
- list($lo,$hi) = array_map(function($v){ return sprintf("%032s", IP::inet_ptoh($v)); }, CIDR::cidr_to_range($ip));
- list($min,$max) = array_map(function($v){ return sprintf("%032s", IP::inet_ptoh($v)); }, CIDR::cidr_to_range($cidr));
-
- /** visualization of logic used below
- lo-hi = $ip to check
- min-max = $cidr block being checked against
- --- --- --- lo --- --- hi --- --- --- --- --- IP/prefix to check
- --- min --- --- max --- --- --- --- --- --- --- Partial "LOW" match
- --- --- --- --- --- min --- --- max --- --- --- Partial "HIGH" match
- --- --- --- --- min max --- --- --- --- --- --- No match "NO"
- --- --- --- --- --- --- --- --- min --- max --- No match "NO"
- min --- max --- --- --- --- --- --- --- --- --- No match "NO"
- --- --- min --- --- --- --- max --- --- --- --- Full match "YES"
- */
-
- // IP is exact match or completely inside the CIDR block
- if ($lo >= $min and $hi <= $max) {
- return self::INTERSECT_YES;
- }
-
- // IP is completely outside the CIDR block
- if ($max < $lo or $min > $hi) {
- return self::INTERSECT_NO;
- }
-
- // @todo is it useful to return LOW/HIGH partial matches?
-
- // IP matches the lower end
- if ($max <= $hi and $min <= $lo) {
- return self::INTERSECT_LOW;
- }
-
- // IP matches the higher end
- if ($min >= $lo and $max >= $hi) {
- return self::INTERSECT_HIGH;
- }
-
- return self::INTERSECT_NO;
- }
-
- /**
- * Converts an IPv4 or IPv6 CIDR block into its range.
- *
- * @todo May not be the fastest way to do this.
- *
- * @static
- * @param string $cidr CIDR block or IP address string.
- * @param integer|null $bits If /bits is not specified on string they can be
- * passed via this parameter instead.
- * @return array A 2 element array with the low, high range
- */
- public static function cidr_to_range($cidr, $bits = null)
- {
- if (strpos($cidr, '/') !== false) {
- list($ip, $_bits) = array_pad(explode('/', $cidr, 2), 2, null);
- } else {
- $ip = $cidr;
- $_bits = $bits;
- }
-
- if (false === filter_var($ip, FILTER_VALIDATE_IP)) {
- throw new \InvalidArgumentException("IP address \"$cidr\" is invalid");
- }
-
- // force bit length to 32 or 128 depending on type of IP
- $bitlen = (false === filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) ? 128 : 32;
-
- if ($bits === null) {
- // if no prefix is given use the length of the binary string which
- // will give us 32 or 128 and result in a single IP being returned.
- $bits = $_bits !== null ? $_bits : $bitlen;
- }
-
- if ($bits > $bitlen) {
- throw new \InvalidArgumentException("IP address \"$cidr\" is invalid");
- }
-
- $ipdec = IP::inet_ptod($ip);
- $ipbin = BC::bcdecbin($ipdec, $bitlen);
-
- // calculate network
- $netmask = BC::bcbindec(str_pad(str_repeat('1',$bits), $bitlen, '0'));
- $ip1 = BC::bcand($ipdec, $netmask);
-
- // calculate "broadcast" (not technically a broadcast in IPv6)
- $ip2 = BC::bcor($ip1, BC::bcnot($netmask));
-
- return array(IP::inet_dtop($ip1), IP::inet_dtop($ip2));
- }
-
- /**
- * Return the CIDR string from the range given
- */
- public static function range_to_cidr($start, $end)
- {
- $cidr = new CIDR($start, $end);
- return (string)$cidr;
- }
-
- /**
- * Return the maximum prefix length that would fit the IP address given.
- *
- * This is useful to determine how my bit would be needed to store the IP
- * address when you don't already have a prefix for the IP.
- *
- * @example 216.240.32.0 would return 27
- *
- * @param string $ip IP address without prefix
- * @param integer $bits Maximum bits to check; defaults to 32 for IPv4 and 128 for IPv6
- */
- public static function max_prefix($ip, $bits = null)
- {
- static $mask = array();
-
- $ver = (false === filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) ? 6 : 4;
- $max = $ver == 6 ? 128 : 32;
- if ($bits === null) {
- $bits = $max;
-
- }
-
- $int = IP::inet_ptod($ip);
- while ($bits > 0) {
- // micro-optimization; calculate mask once ...
- if (!isset($mask[$ver][$bits-1])) {
- // 2^$max - 2^($max - $bits);
- if ($ver == 4) {
- $mask[$ver][$bits-1] = pow(2, $max) - pow(2, $max - ($bits-1));
- } else {
- $mask[$ver][$bits-1] = bcsub(bcpow(2, $max), bcpow(2, $max - ($bits-1)));
- }
- }
-
- $m = $mask[$ver][$bits-1];
- //printf("%s/%d: %s & %s == %s\n", $ip, $bits-1, BC::bcdecbin($m, 32), BC::bcdecbin($int, 32), BC::bcdecbin(BC::bcand($int, $m)));
- //echo "$ip/", $bits-1, ": ", IP::inet_dtop($m), " ($m) & $int == ", BC::bcand($int, $m), "\n";
- if (bccomp(BC::bcand($int, $m), $int) != 0) {
- return $bits;
- }
- $bits--;
- }
- return $bits;
- }
-
- /**
- * Return a contiguous list of true CIDR blocks that span the range given.
- *
- * Note: It's not a good idea to call this with IPv6 addresses. While it may
- * work for certain ranges this can be very slow. Also an IPv6 list won't be
- * as accurate as an IPv4 list.
- *
- * @example
- * range_to_cidrlist(192.168.0.0, 192.168.0.15) ==
- * 192.168.0.0/28
- * range_to_cidrlist(192.168.0.0, 192.168.0.20) ==
- * 192.168.0.0/28
- * 192.168.0.16/30
- * 192.168.0.20/32
- */
- public static function range_to_cidrlist($start, $end)
- {
- $ver = (false === filter_var($start, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) ? 6 : 4;
- $start = IP::inet_ptod($start);
- $end = IP::inet_ptod($end);
-
- $len = $ver == 4 ? 32 : 128;
- $log2 = $ver == 4 ? log(2) : BC::bclog(2);
-
- $list = array();
- while (BC::cmp($end, $start) >= 0) { // $end >= $start
- $prefix = self::max_prefix(IP::inet_dtop($start), $len);
- if ($ver == 4) {
- $diff = $len - floor( log($end - $start + 1) / $log2 );
- } else {
- // this is not as accurate due to the bclog function
- $diff = bcsub($len, BC::bcfloor(bcdiv(BC::bclog(bcadd(bcsub($end, $start), '1')), $log2)));
- }
-
- if ($prefix < $diff) {
- $prefix = $diff;
- }
-
- $list[] = IP::inet_dtop($start) . "/" . $prefix;
-
- if ($ver == 4) {
- $start += pow(2, $len - $prefix);
- } else {
- $start = bcadd($start, bcpow(2, $len - $prefix));
- }
- }
- return $list;
- }
-
- /**
- * Return an list of optimized CIDR blocks by collapsing adjacent CIDR
- * blocks into larger blocks.
- *
- * @param array $cidrs List of CIDR block strings or objects
- * @param integer $maxPrefix Maximum prefix to allow
- * @return array Optimized list of CIDR objects
- */
- public static function optimize_cidrlist($cidrs, $maxPrefix = 32)
- {
- // all indexes must be a CIDR object
- $cidrs = array_map(function($o){ return $o instanceof CIDR ? $o : new CIDR($o); }, $cidrs);
- // sort CIDR blocks in proper order so we can easily loop over them
- $cidrs = self::cidr_sort($cidrs);
-
- $list = array();
- while ($cidrs) {
- $c = array_shift($cidrs);
- $start = $c->getStart();
-
- $max = bcadd($c->getStart(true), $c->getTotal());
-
- // loop through each cidr block until its ending range is more than
- // the current maximum.
- while (!empty($cidrs) and $cidrs[0]->getStart(true) <= $max) {
- $b = array_shift($cidrs);
- $newmax = bcadd($b->getStart(true), $b->getTotal());
- if ($newmax > $max) {
- $max = $newmax;
- }
- }
-
- // add the new cidr range to the optimized list
- $list = array_merge($list, self::range_to_cidrlist($start, IP::inet_dtop(bcsub($max, '1'))));
- }
-
- return $list;
- }
-
- /**
- * Sort the list of CIDR blocks, optionally with a custom callback function.
- *
- * @param array $cidrs A list of CIDR blocks (strings or objects)
- * @param Closure $callback Optional callback to perform the sorting.
- * See PHP usort documentation for more details.
- */
- public static function cidr_sort($cidrs, $callback = null)
- {
- // all indexes must be a CIDR object
- $cidrs = array_map(function($o){ return $o instanceof CIDR ? $o : new CIDR($o); }, $cidrs);
-
- if ($callback === null) {
- $callback = function($a, $b) {
- if (0 != ($o = BC::cmp($a->getStart(true), $b->getStart(true)))) {
- return $o; // < or >
- }
- if ($a->getPrefix() == $b->getPrefix()) {
- return 0;
- }
- return $a->getPrefix() < $b->getPrefix() ? -1 : 1;
- };
- } elseif (!($callback instanceof \Closure) or !is_callable($callback)) {
- throw new \InvalidArgumentException("Invalid callback in CIDR::cidr_sort, expected Closure, got " . gettype($callback));
- }
-
- usort($cidrs, $callback);
- return $cidrs;
- }
-
- /**
- * Return the Prefix bits from the IPv4 mask given.
- *
- * This is only valid for IPv4 addresses since IPv6 addressing does not
- * have a concept of network masks.
- *
- * Example: 255.255.255.0 == 24
- *
- * @param string $mask IPv4 network mask.
- */
- public static function mask_to_prefix($mask)
- {
- if (false === filter_var($mask, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
- throw new \InvalidArgumentException("Invalid IP netmask \"$mask\"");
- }
- return strrpos(IP::inet_ptob($mask, 32), '1') + 1;
- }
-
- /**
- * Return the network mask for the prefix given.
- *
- * Normally this is only useful for IPv4 addresses but you can generate a
- * mask for IPv6 addresses as well, only because its mathematically
- * possible.
- *
- * @param integer $prefix CIDR prefix bits (0-128)
- * @param integer $version IP version. If null the version will be detected
- * based on the prefix length given.
- */
- public static function prefix_to_mask($prefix, $version = null)
- {
- if ($version === null) {
- $version = $prefix > 32 ? 6 : 4;
- }
- if ($prefix < 0 or $prefix > 128) {
- throw new \InvalidArgumentException("Invalid prefix length \"$prefix\"");
- }
- if ($version != 4 and $version != 6) {
- throw new \InvalidArgumentException("Invalid version \"$version\". Must be 4 or 6");
- }
-
- if ($version == 4) {
- return long2ip($prefix == 0 ? 0 : (0xFFFFFFFF >> (32 - $prefix)) << (32 - $prefix));
- } else {
- return IP::inet_dtop($prefix == 0 ? 0 : BC::bcleft(BC::bcright(BC::MAX_UINT_128, 128-$prefix), 128-$prefix));
- }
- }
-
- /**
- * Return true if the $ip given is a true CIDR block.
- *
- * A true CIDR block is one where the $ip given is the actual Network
- * address and broadcast matches the prefix appropriately.
- */
- public static function cidr_is_true($ip)
- {
- $ip = new CIDR($ip);
- return $ip->isTrueCidr();
- }
-}
diff --git a/inc/lib/IP/Lifo/IP/IP.php b/inc/lib/IP/Lifo/IP/IP.php
deleted file mode 100755
index 4d22aa76..00000000
--- a/inc/lib/IP/Lifo/IP/IP.php
+++ /dev/null
@@ -1,207 +0,0 @@
-
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-namespace Lifo\IP;
-
-/**
- * IP Address helper class.
- *
- * Provides routines to translate IPv4 and IPv6 addresses between human readable
- * strings, decimal, hexidecimal and binary.
- *
- * Requires BCmath extension and IPv6 PHP support
- */
-abstract class IP
-{
- /**
- * Convert a human readable (presentational) IP address string into a decimal string.
- */
- public static function inet_ptod($ip)
- {
- // shortcut for IPv4 addresses
- if (strpos($ip, ':') === false && strpos($ip, '.') !== false) {
- return sprintf('%u', ip2long($ip));
- }
-
- // remove any cidr block notation
- if (($o = strpos($ip, '/')) !== false) {
- $ip = substr($ip, 0, $o);
- }
-
- // unpack into 4 32bit integers
- $parts = unpack('N*', inet_pton($ip));
- foreach ($parts as &$part) {
- if ($part < 0) {
- // convert signed int into unsigned
- $part = sprintf('%u', $part);
- //$part = bcadd($part, '4294967296');
- }
- }
-
- // add each 32bit integer to the proper bit location in our big decimal
- $decimal = $parts[4]; // << 0
- $decimal = bcadd($decimal, bcmul($parts[3], '4294967296')); // << 32
- $decimal = bcadd($decimal, bcmul($parts[2], '18446744073709551616')); // << 64
- $decimal = bcadd($decimal, bcmul($parts[1], '79228162514264337593543950336')); // << 96
-
- return $decimal;
- }
-
- /**
- * Convert a decimal string into a human readable IP address.
- */
- public static function inet_dtop($decimal, $expand = false)
- {
- $parts = array();
- $parts[1] = bcdiv($decimal, '79228162514264337593543950336', 0); // >> 96
- $decimal = bcsub($decimal, bcmul($parts[1], '79228162514264337593543950336'));
- $parts[2] = bcdiv($decimal, '18446744073709551616', 0); // >> 64
- $decimal = bcsub($decimal, bcmul($parts[2], '18446744073709551616'));
- $parts[3] = bcdiv($decimal, '4294967296', 0); // >> 32
- $decimal = bcsub($decimal, bcmul($parts[3], '4294967296'));
- $parts[4] = $decimal; // >> 0
-
- foreach ($parts as &$part) {
- if (bccomp($part, '2147483647') == 1) {
- $part = bcsub($part, '4294967296');
- }
- $part = (int) $part;
- }
-
- // if the first 96bits is all zeros then we can safely assume we
- // actually have an IPv4 address. Even though it's technically possible
- // you're not really ever going to see an IPv6 address in the range:
- // ::0 - ::ffff
- // It's feasible to see an IPv6 address of "::", in which case the
- // caller is going to have to account for that on their own.
- if (($parts[1] | $parts[2] | $parts[3]) == 0) {
- $ip = long2ip($parts[4]);
- } else {
- $packed = pack('N4', $parts[1], $parts[2], $parts[3], $parts[4]);
- $ip = inet_ntop($packed);
- }
-
- // Turn IPv6 to IPv4 if it's IPv4
- if (preg_match('/^::\d+\./', $ip)) {
- return substr($ip, 2);
- }
-
- return $expand ? self::inet_expand($ip) : $ip;
- }
-
- /**
- * Convert a human readable (presentational) IP address into a HEX string.
- */
- public static function inet_ptoh($ip)
- {
- return bin2hex(inet_pton($ip));
- //return BC::bcdechex(self::inet_ptod($ip));
- }
-
- /**
- * Convert a human readable (presentational) IP address into a BINARY string.
- */
- public static function inet_ptob($ip, $bits = 128)
- {
- return BC::bcdecbin(self::inet_ptod($ip), $bits);
- }
-
- /**
- * Convert a binary string into an IP address (presentational) string.
- */
- public static function inet_btop($bin)
- {
- return self::inet_dtop(BC::bcbindec($bin));
- }
-
- /**
- * Convert a HEX string into a human readable (presentational) IP address
- */
- public static function inet_htop($hex)
- {
- return self::inet_dtop(BC::bchexdec($hex));
- }
-
- /**
- * Expand an IP address. IPv4 addresses are returned as-is.
- *
- * Example:
- * 2001::1 expands to 2001:0000:0000:0000:0000:0000:0000:0001
- * ::127.0.0.1 expands to 0000:0000:0000:0000:0000:0000:7f00:0001
- * 127.0.0.1 expands to 127.0.0.1
- */
- public static function inet_expand($ip)
- {
- // strip possible cidr notation off
- if (($pos = strpos($ip, '/')) !== false) {
- $ip = substr($ip, 0, $pos);
- }
- $bytes = unpack('n*', inet_pton($ip));
- if (count($bytes) > 2) {
- return implode(':', array_map(function ($b) {
- return sprintf("%04x", $b);
- }, $bytes));
- }
- return $ip;
- }
-
- /**
- * Convert an IPv4 address into an IPv6 address.
- *
- * One use-case for this is IP 6to4 tunnels used in networking.
- *
- * @example
- * to_ipv4("10.10.10.10") == a0a:a0a
- *
- * @param string $ip IPv4 address.
- * @param boolean $mapped If true a Full IPv6 address is returned within the
- * official ipv4to6 mapped space "0:0:0:0:0:ffff:x:x"
- */
- public static function to_ipv6($ip, $mapped = false)
- {
- if (!self::isIPv4($ip)) {
- throw new \InvalidArgumentException("Invalid IPv4 address \"$ip\"");
- }
-
- $num = IP::inet_ptod($ip);
- $o1 = dechex($num >> 16);
- $o2 = dechex($num & 0x0000FFFF);
-
- return $mapped ? "0:0:0:0:0:ffff:$o1:$o2" : "$o1:$o2";
- }
-
- /**
- * Returns true if the IP address is a valid IPv4 address
- */
- public static function isIPv4($ip)
- {
- return $ip === filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4);
- }
-
- /**
- * Returns true if the IP address is a valid IPv6 address
- */
- public static function isIPv6($ip)
- {
- return $ip === filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6);
- }
-
- /**
- * Compare two IP's (v4 or v6) and return -1, 0, 1 if the first is < = >
- * the second.
- *
- * @param string $ip1 IP address
- * @param string $ip2 IP address to compare against
- * @return integer Return -1,0,1 depending if $ip1 is <=> $ip2
- */
- public static function cmp($ip1, $ip2)
- {
- return bccomp(self::inet_ptod($ip1), self::inet_ptod($ip2), 0);
- }
-}
diff --git a/inc/lib/Twig/Autoloader.php b/inc/lib/Twig/Autoloader.php
deleted file mode 100644
index 212af544..00000000
--- a/inc/lib/Twig/Autoloader.php
+++ /dev/null
@@ -1,54 +0,0 @@
-
- *
- * @deprecated since 1.21 and will be removed in 2.0. Use Composer instead. 2.0.
- */
-class Twig_Autoloader
-{
- /**
- * Registers Twig_Autoloader as an SPL autoloader.
- *
- * @param bool $prepend whether to prepend the autoloader or not
- */
- public static function register($prepend = false)
- {
- @trigger_error('Using Twig_Autoloader is deprecated since version 1.21. Use Composer instead.', E_USER_DEPRECATED);
-
- if (PHP_VERSION_ID < 50300) {
- spl_autoload_register(array(__CLASS__, 'autoload'));
- } else {
- spl_autoload_register(array(__CLASS__, 'autoload'), true, $prepend);
- }
- }
-
- /**
- * Handles autoloading of classes.
- *
- * @param string $class a class name
- */
- public static function autoload($class)
- {
- if (0 !== strpos($class, 'Twig')) {
- return;
- }
-
- if (is_file($file = dirname(__FILE__).'/../'.str_replace(array('_', "\0"), array('/', ''), $class).'.php')) {
- require $file;
- }
- }
-}
diff --git a/inc/lib/Twig/BaseNodeVisitor.php b/inc/lib/Twig/BaseNodeVisitor.php
deleted file mode 100644
index d8ef02fb..00000000
--- a/inc/lib/Twig/BaseNodeVisitor.php
+++ /dev/null
@@ -1,54 +0,0 @@
-
- */
-abstract class Twig_BaseNodeVisitor implements Twig_NodeVisitorInterface
-{
- final public function enterNode(Twig_NodeInterface $node, Twig_Environment $env)
- {
- if (!$node instanceof Twig_Node) {
- throw new LogicException('Twig_BaseNodeVisitor only supports Twig_Node instances.');
- }
-
- return $this->doEnterNode($node, $env);
- }
-
- final public function leaveNode(Twig_NodeInterface $node, Twig_Environment $env)
- {
- if (!$node instanceof Twig_Node) {
- throw new LogicException('Twig_BaseNodeVisitor only supports Twig_Node instances.');
- }
-
- return $this->doLeaveNode($node, $env);
- }
-
- /**
- * Called before child nodes are visited.
- *
- * @return Twig_Node The modified node
- */
- abstract protected function doEnterNode(Twig_Node $node, Twig_Environment $env);
-
- /**
- * Called after child nodes are visited.
- *
- * @return Twig_Node|false The modified node or false if the node must be removed
- */
- abstract protected function doLeaveNode(Twig_Node $node, Twig_Environment $env);
-}
-
-class_alias('Twig_BaseNodeVisitor', 'Twig\NodeVisitor\AbstractNodeVisitor', false);
-class_exists('Twig_Environment');
-class_exists('Twig_Node');
diff --git a/inc/lib/Twig/Cache/Filesystem.php b/inc/lib/Twig/Cache/Filesystem.php
deleted file mode 100644
index 65976282..00000000
--- a/inc/lib/Twig/Cache/Filesystem.php
+++ /dev/null
@@ -1,93 +0,0 @@
-
- */
-class Twig_Cache_Filesystem implements Twig_CacheInterface
-{
- const FORCE_BYTECODE_INVALIDATION = 1;
-
- private $directory;
- private $options;
-
- /**
- * @param $directory string The root cache directory
- * @param $options int A set of options
- */
- public function __construct($directory, $options = 0)
- {
- $this->directory = rtrim($directory, '\/').'/';
- $this->options = $options;
- }
-
- public function generateKey($name, $className)
- {
- $hash = hash('sha256', $className);
-
- return $this->directory.$hash[0].$hash[1].'/'.$hash.'.php';
- }
-
- public function load($key)
- {
- if (file_exists($key)) {
- @include_once $key;
- }
- }
-
- public function write($key, $content)
- {
- $dir = dirname($key);
- if (!is_dir($dir)) {
- if (false === @mkdir($dir, 0777, true)) {
- if (PHP_VERSION_ID >= 50300) {
- clearstatcache(true, $dir);
- }
- if (!is_dir($dir)) {
- throw new RuntimeException(sprintf('Unable to create the cache directory (%s).', $dir));
- }
- }
- } elseif (!is_writable($dir)) {
- throw new RuntimeException(sprintf('Unable to write in the cache directory (%s).', $dir));
- }
-
- $tmpFile = tempnam($dir, basename($key));
- if (false !== @file_put_contents($tmpFile, $content) && @rename($tmpFile, $key)) {
- @chmod($key, 0666 & ~umask());
-
- if (self::FORCE_BYTECODE_INVALIDATION == ($this->options & self::FORCE_BYTECODE_INVALIDATION)) {
- // Compile cached file into bytecode cache
- if (function_exists('opcache_invalidate')) {
- opcache_invalidate($key, true);
- } elseif (function_exists('apc_compile_file')) {
- apc_compile_file($key);
- }
- }
-
- return;
- }
-
- throw new RuntimeException(sprintf('Failed to write cache file "%s".', $key));
- }
-
- public function getTimestamp($key)
- {
- if (!file_exists($key)) {
- return 0;
- }
-
- return (int) @filemtime($key);
- }
-}
-
-class_alias('Twig_Cache_Filesystem', 'Twig\Cache\FilesystemCache', false);
diff --git a/inc/lib/Twig/Cache/Null.php b/inc/lib/Twig/Cache/Null.php
deleted file mode 100644
index 69d1d2f9..00000000
--- a/inc/lib/Twig/Cache/Null.php
+++ /dev/null
@@ -1,40 +0,0 @@
-
- */
-class Twig_Cache_Null implements Twig_CacheInterface
-{
- public function generateKey($name, $className)
- {
- return '';
- }
-
- public function write($key, $content)
- {
- }
-
- public function load($key)
- {
- }
-
- public function getTimestamp($key)
- {
- return 0;
- }
-}
-
-class_alias('Twig_Cache_Null', 'Twig\Cache\NullCache', false);
diff --git a/inc/lib/Twig/CacheInterface.php b/inc/lib/Twig/CacheInterface.php
deleted file mode 100644
index 776808bf..00000000
--- a/inc/lib/Twig/CacheInterface.php
+++ /dev/null
@@ -1,58 +0,0 @@
-
- */
-interface Twig_CacheInterface
-{
- /**
- * Generates a cache key for the given template class name.
- *
- * @param string $name The template name
- * @param string $className The template class name
- *
- * @return string
- */
- public function generateKey($name, $className);
-
- /**
- * Writes the compiled template to cache.
- *
- * @param string $key The cache key
- * @param string $content The template representation as a PHP class
- */
- public function write($key, $content);
-
- /**
- * Loads a template from the cache.
- *
- * @param string $key The cache key
- */
- public function load($key);
-
- /**
- * Returns the modification timestamp of a key.
- *
- * @param string $key The cache key
- *
- * @return int
- */
- public function getTimestamp($key);
-}
-
-class_alias('Twig_CacheInterface', 'Twig\Cache\CacheInterface', false);
diff --git a/inc/lib/Twig/Compiler.php b/inc/lib/Twig/Compiler.php
deleted file mode 100644
index 803eb896..00000000
--- a/inc/lib/Twig/Compiler.php
+++ /dev/null
@@ -1,286 +0,0 @@
-
- */
-class Twig_Compiler implements Twig_CompilerInterface
-{
- protected $lastLine;
- protected $source;
- protected $indentation;
- protected $env;
- protected $debugInfo = array();
- protected $sourceOffset;
- protected $sourceLine;
- protected $filename;
- private $varNameSalt = 0;
-
- public function __construct(Twig_Environment $env)
- {
- $this->env = $env;
- }
-
- /**
- * @deprecated since 1.25 (to be removed in 2.0)
- */
- public function getFilename()
- {
- @trigger_error(sprintf('The %s() method is deprecated since version 1.25 and will be removed in 2.0.', __FUNCTION__), E_USER_DEPRECATED);
-
- return $this->filename;
- }
-
- /**
- * Returns the environment instance related to this compiler.
- *
- * @return Twig_Environment
- */
- public function getEnvironment()
- {
- return $this->env;
- }
-
- /**
- * Gets the current PHP code after compilation.
- *
- * @return string The PHP code
- */
- public function getSource()
- {
- return $this->source;
- }
-
- /**
- * Compiles a node.
- *
- * @param Twig_NodeInterface $node The node to compile
- * @param int $indentation The current indentation
- *
- * @return $this
- */
- public function compile(Twig_NodeInterface $node, $indentation = 0)
- {
- $this->lastLine = null;
- $this->source = '';
- $this->debugInfo = array();
- $this->sourceOffset = 0;
- // source code starts at 1 (as we then increment it when we encounter new lines)
- $this->sourceLine = 1;
- $this->indentation = $indentation;
- $this->varNameSalt = 0;
-
- if ($node instanceof Twig_Node_Module) {
- // to be removed in 2.0
- $this->filename = $node->getTemplateName();
- }
-
- $node->compile($this);
-
- return $this;
- }
-
- public function subcompile(Twig_NodeInterface $node, $raw = true)
- {
- if (false === $raw) {
- $this->source .= str_repeat(' ', $this->indentation * 4);
- }
-
- $node->compile($this);
-
- return $this;
- }
-
- /**
- * Adds a raw string to the compiled code.
- *
- * @param string $string The string
- *
- * @return $this
- */
- public function raw($string)
- {
- $this->source .= $string;
-
- return $this;
- }
-
- /**
- * Writes a string to the compiled code by adding indentation.
- *
- * @return $this
- */
- public function write()
- {
- $strings = func_get_args();
- foreach ($strings as $string) {
- $this->source .= str_repeat(' ', $this->indentation * 4).$string;
- }
-
- return $this;
- }
-
- /**
- * Appends an indentation to the current PHP code after compilation.
- *
- * @return $this
- *
- * @deprecated since 1.27 (to be removed in 2.0).
- */
- public function addIndentation()
- {
- @trigger_error('The '.__METHOD__.' method is deprecated since version 1.27 and will be removed in 2.0. Use write(\'\') instead.', E_USER_DEPRECATED);
-
- $this->source .= str_repeat(' ', $this->indentation * 4);
-
- return $this;
- }
-
- /**
- * Adds a quoted string to the compiled code.
- *
- * @param string $value The string
- *
- * @return $this
- */
- public function string($value)
- {
- $this->source .= sprintf('"%s"', addcslashes($value, "\0\t\"\$\\"));
-
- return $this;
- }
-
- /**
- * Returns a PHP representation of a given value.
- *
- * @param mixed $value The value to convert
- *
- * @return $this
- */
- public function repr($value)
- {
- if (is_int($value) || is_float($value)) {
- if (false !== $locale = setlocale(LC_NUMERIC, '0')) {
- setlocale(LC_NUMERIC, 'C');
- }
-
- $this->raw($value);
-
- if (false !== $locale) {
- setlocale(LC_NUMERIC, $locale);
- }
- } elseif (null === $value) {
- $this->raw('null');
- } elseif (is_bool($value)) {
- $this->raw($value ? 'true' : 'false');
- } elseif (is_array($value)) {
- $this->raw('array(');
- $first = true;
- foreach ($value as $key => $v) {
- if (!$first) {
- $this->raw(', ');
- }
- $first = false;
- $this->repr($key);
- $this->raw(' => ');
- $this->repr($v);
- }
- $this->raw(')');
- } else {
- $this->string($value);
- }
-
- return $this;
- }
-
- /**
- * Adds debugging information.
- *
- * @return $this
- */
- public function addDebugInfo(Twig_NodeInterface $node)
- {
- if ($node->getTemplateLine() != $this->lastLine) {
- $this->write(sprintf("// line %d\n", $node->getTemplateLine()));
-
- // when mbstring.func_overload is set to 2
- // mb_substr_count() replaces substr_count()
- // but they have different signatures!
- if (((int) ini_get('mbstring.func_overload')) & 2) {
- @trigger_error('Support for having "mbstring.func_overload" different from 0 is deprecated version 1.29 and will be removed in 2.0.', E_USER_DEPRECATED);
-
- // this is much slower than the "right" version
- $this->sourceLine += mb_substr_count(mb_substr($this->source, $this->sourceOffset), "\n");
- } else {
- $this->sourceLine += substr_count($this->source, "\n", $this->sourceOffset);
- }
- $this->sourceOffset = strlen($this->source);
- $this->debugInfo[$this->sourceLine] = $node->getTemplateLine();
-
- $this->lastLine = $node->getTemplateLine();
- }
-
- return $this;
- }
-
- public function getDebugInfo()
- {
- ksort($this->debugInfo);
-
- return $this->debugInfo;
- }
-
- /**
- * Indents the generated code.
- *
- * @param int $step The number of indentation to add
- *
- * @return $this
- */
- public function indent($step = 1)
- {
- $this->indentation += $step;
-
- return $this;
- }
-
- /**
- * Outdents the generated code.
- *
- * @param int $step The number of indentation to remove
- *
- * @return $this
- *
- * @throws LogicException When trying to outdent too much so the indentation would become negative
- */
- public function outdent($step = 1)
- {
- // can't outdent by more steps than the current indentation level
- if ($this->indentation < $step) {
- throw new LogicException('Unable to call outdent() as the indentation would become negative.');
- }
-
- $this->indentation -= $step;
-
- return $this;
- }
-
- public function getVarName()
- {
- return sprintf('__internal_%s', hash('sha256', __METHOD__.$this->varNameSalt++));
- }
-}
-
-class_alias('Twig_Compiler', 'Twig\Compiler', false);
-class_exists('Twig_Node');
diff --git a/inc/lib/Twig/CompilerInterface.php b/inc/lib/Twig/CompilerInterface.php
deleted file mode 100644
index 42872c9c..00000000
--- a/inc/lib/Twig/CompilerInterface.php
+++ /dev/null
@@ -1,34 +0,0 @@
-
- *
- * @deprecated since 1.12 (to be removed in 3.0)
- */
-interface Twig_CompilerInterface
-{
- /**
- * Compiles a node.
- *
- * @return $this
- */
- public function compile(Twig_NodeInterface $node);
-
- /**
- * Gets the current PHP code after compilation.
- *
- * @return string The PHP code
- */
- public function getSource();
-}
diff --git a/inc/lib/Twig/ContainerRuntimeLoader.php b/inc/lib/Twig/ContainerRuntimeLoader.php
deleted file mode 100644
index 814ab58b..00000000
--- a/inc/lib/Twig/ContainerRuntimeLoader.php
+++ /dev/null
@@ -1,39 +0,0 @@
-
- * @author Robin Chalas
- */
-class Twig_ContainerRuntimeLoader implements Twig_RuntimeLoaderInterface
-{
- private $container;
-
- public function __construct(ContainerInterface $container)
- {
- $this->container = $container;
- }
-
- public function load($class)
- {
- if ($this->container->has($class)) {
- return $this->container->get($class);
- }
- }
-}
-
-class_alias('Twig_ContainerRuntimeLoader', 'Twig\RuntimeLoader\ContainerRuntimeLoader', false);
diff --git a/inc/lib/Twig/Environment.php b/inc/lib/Twig/Environment.php
deleted file mode 100644
index b15f2aff..00000000
--- a/inc/lib/Twig/Environment.php
+++ /dev/null
@@ -1,1604 +0,0 @@
-
- */
-class Twig_Environment
-{
- const VERSION = '1.35.4-DEV';
- const VERSION_ID = 13504;
- const MAJOR_VERSION = 1;
- const MINOR_VERSION = 35;
- const RELEASE_VERSION = 4;
- const EXTRA_VERSION = 'DEV';
-
- protected $charset;
- protected $loader;
- protected $debug;
- protected $autoReload;
- protected $cache;
- protected $lexer;
- protected $parser;
- protected $compiler;
- protected $baseTemplateClass;
- protected $extensions;
- protected $parsers;
- protected $visitors;
- protected $filters;
- protected $tests;
- protected $functions;
- protected $globals;
- protected $runtimeInitialized = false;
- protected $extensionInitialized = false;
- protected $loadedTemplates;
- protected $strictVariables;
- protected $unaryOperators;
- protected $binaryOperators;
- protected $templateClassPrefix = '__TwigTemplate_';
- protected $functionCallbacks = array();
- protected $filterCallbacks = array();
- protected $staging;
-
- private $originalCache;
- private $bcWriteCacheFile = false;
- private $bcGetCacheFilename = false;
- private $lastModifiedExtension = 0;
- private $extensionsByClass = array();
- private $runtimeLoaders = array();
- private $runtimes = array();
- private $optionsHash;
- private $loading = array();
-
- /**
- * Constructor.
- *
- * Available options:
- *
- * * debug: When set to true, it automatically set "auto_reload" to true as
- * well (default to false).
- *
- * * charset: The charset used by the templates (default to UTF-8).
- *
- * * base_template_class: The base template class to use for generated
- * templates (default to Twig_Template).
- *
- * * cache: An absolute path where to store the compiled templates,
- * a Twig_Cache_Interface implementation,
- * or false to disable compilation cache (default).
- *
- * * auto_reload: Whether to reload the template if the original source changed.
- * If you don't provide the auto_reload option, it will be
- * determined automatically based on the debug value.
- *
- * * strict_variables: Whether to ignore invalid variables in templates
- * (default to false).
- *
- * * autoescape: Whether to enable auto-escaping (default to html):
- * * false: disable auto-escaping
- * * true: equivalent to html
- * * html, js: set the autoescaping to one of the supported strategies
- * * name: set the autoescaping strategy based on the template name extension
- * * PHP callback: a PHP callback that returns an escaping strategy based on the template "name"
- *
- * * optimizations: A flag that indicates which optimizations to apply
- * (default to -1 which means that all optimizations are enabled;
- * set it to 0 to disable).
- *
- * @param Twig_LoaderInterface $loader
- * @param array $options An array of options
- */
- public function __construct(Twig_LoaderInterface $loader = null, $options = array())
- {
- if (null !== $loader) {
- $this->setLoader($loader);
- } else {
- @trigger_error('Not passing a Twig_LoaderInterface as the first constructor argument of Twig_Environment is deprecated since version 1.21.', E_USER_DEPRECATED);
- }
-
- $options = array_merge(array(
- 'debug' => false,
- 'charset' => 'UTF-8',
- 'base_template_class' => 'Twig_Template',
- 'strict_variables' => false,
- 'autoescape' => 'html',
- 'cache' => false,
- 'auto_reload' => null,
- 'optimizations' => -1,
- ), $options);
-
- $this->debug = (bool) $options['debug'];
- $this->charset = strtoupper($options['charset']);
- $this->baseTemplateClass = $options['base_template_class'];
- $this->autoReload = null === $options['auto_reload'] ? $this->debug : (bool) $options['auto_reload'];
- $this->strictVariables = (bool) $options['strict_variables'];
- $this->setCache($options['cache']);
-
- $this->addExtension(new Twig_Extension_Core());
- $this->addExtension(new Twig_Extension_Escaper($options['autoescape']));
- $this->addExtension(new Twig_Extension_Optimizer($options['optimizations']));
- $this->staging = new Twig_Extension_Staging();
-
- // For BC
- if (is_string($this->originalCache)) {
- $r = new ReflectionMethod($this, 'writeCacheFile');
- if (__CLASS__ !== $r->getDeclaringClass()->getName()) {
- @trigger_error('The Twig_Environment::writeCacheFile method is deprecated since version 1.22 and will be removed in Twig 2.0.', E_USER_DEPRECATED);
-
- $this->bcWriteCacheFile = true;
- }
-
- $r = new ReflectionMethod($this, 'getCacheFilename');
- if (__CLASS__ !== $r->getDeclaringClass()->getName()) {
- @trigger_error('The Twig_Environment::getCacheFilename method is deprecated since version 1.22 and will be removed in Twig 2.0.', E_USER_DEPRECATED);
-
- $this->bcGetCacheFilename = true;
- }
- }
- }
-
- /**
- * Gets the base template class for compiled templates.
- *
- * @return string The base template class name
- */
- public function getBaseTemplateClass()
- {
- return $this->baseTemplateClass;
- }
-
- /**
- * Sets the base template class for compiled templates.
- *
- * @param string $class The base template class name
- */
- public function setBaseTemplateClass($class)
- {
- $this->baseTemplateClass = $class;
- $this->updateOptionsHash();
- }
-
- /**
- * Enables debugging mode.
- */
- public function enableDebug()
- {
- $this->debug = true;
- $this->updateOptionsHash();
- }
-
- /**
- * Disables debugging mode.
- */
- public function disableDebug()
- {
- $this->debug = false;
- $this->updateOptionsHash();
- }
-
- /**
- * Checks if debug mode is enabled.
- *
- * @return bool true if debug mode is enabled, false otherwise
- */
- public function isDebug()
- {
- return $this->debug;
- }
-
- /**
- * Enables the auto_reload option.
- */
- public function enableAutoReload()
- {
- $this->autoReload = true;
- }
-
- /**
- * Disables the auto_reload option.
- */
- public function disableAutoReload()
- {
- $this->autoReload = false;
- }
-
- /**
- * Checks if the auto_reload option is enabled.
- *
- * @return bool true if auto_reload is enabled, false otherwise
- */
- public function isAutoReload()
- {
- return $this->autoReload;
- }
-
- /**
- * Enables the strict_variables option.
- */
- public function enableStrictVariables()
- {
- $this->strictVariables = true;
- $this->updateOptionsHash();
- }
-
- /**
- * Disables the strict_variables option.
- */
- public function disableStrictVariables()
- {
- $this->strictVariables = false;
- $this->updateOptionsHash();
- }
-
- /**
- * Checks if the strict_variables option is enabled.
- *
- * @return bool true if strict_variables is enabled, false otherwise
- */
- public function isStrictVariables()
- {
- return $this->strictVariables;
- }
-
- /**
- * Gets the current cache implementation.
- *
- * @param bool $original Whether to return the original cache option or the real cache instance
- *
- * @return Twig_CacheInterface|string|false A Twig_CacheInterface implementation,
- * an absolute path to the compiled templates,
- * or false to disable cache
- */
- public function getCache($original = true)
- {
- return $original ? $this->originalCache : $this->cache;
- }
-
- /**
- * Sets the current cache implementation.
- *
- * @param Twig_CacheInterface|string|false $cache A Twig_CacheInterface implementation,
- * an absolute path to the compiled templates,
- * or false to disable cache
- */
- public function setCache($cache)
- {
- if (is_string($cache)) {
- $this->originalCache = $cache;
- $this->cache = new Twig_Cache_Filesystem($cache);
- } elseif (false === $cache) {
- $this->originalCache = $cache;
- $this->cache = new Twig_Cache_Null();
- } elseif (null === $cache) {
- @trigger_error('Using "null" as the cache strategy is deprecated since version 1.23 and will be removed in Twig 2.0.', E_USER_DEPRECATED);
- $this->originalCache = false;
- $this->cache = new Twig_Cache_Null();
- } elseif ($cache instanceof Twig_CacheInterface) {
- $this->originalCache = $this->cache = $cache;
- } else {
- throw new LogicException(sprintf('Cache can only be a string, false, or a Twig_CacheInterface implementation.'));
- }
- }
-
- /**
- * Gets the cache filename for a given template.
- *
- * @param string $name The template name
- *
- * @return string|false The cache file name or false when caching is disabled
- *
- * @deprecated since 1.22 (to be removed in 2.0)
- */
- public function getCacheFilename($name)
- {
- @trigger_error(sprintf('The %s method is deprecated since version 1.22 and will be removed in Twig 2.0.', __METHOD__), E_USER_DEPRECATED);
-
- $key = $this->cache->generateKey($name, $this->getTemplateClass($name));
-
- return !$key ? false : $key;
- }
-
- /**
- * Gets the template class associated with the given string.
- *
- * The generated template class is based on the following parameters:
- *
- * * The cache key for the given template;
- * * The currently enabled extensions;
- * * Whether the Twig C extension is available or not;
- * * PHP version;
- * * Twig version;
- * * Options with what environment was created.
- *
- * @param string $name The name for which to calculate the template class name
- * @param int|null $index The index if it is an embedded template
- *
- * @return string The template class name
- */
- public function getTemplateClass($name, $index = null)
- {
- $key = $this->getLoader()->getCacheKey($name).$this->optionsHash;
-
- return $this->templateClassPrefix.hash('sha256', $key).(null === $index ? '' : '_'.$index);
- }
-
- /**
- * Gets the template class prefix.
- *
- * @return string The template class prefix
- *
- * @deprecated since 1.22 (to be removed in 2.0)
- */
- public function getTemplateClassPrefix()
- {
- @trigger_error(sprintf('The %s method is deprecated since version 1.22 and will be removed in Twig 2.0.', __METHOD__), E_USER_DEPRECATED);
-
- return $this->templateClassPrefix;
- }
-
- /**
- * Renders a template.
- *
- * @param string $name The template name
- * @param array $context An array of parameters to pass to the template
- *
- * @return string The rendered template
- *
- * @throws Twig_Error_Loader When the template cannot be found
- * @throws Twig_Error_Syntax When an error occurred during compilation
- * @throws Twig_Error_Runtime When an error occurred during rendering
- */
- public function render($name, array $context = array())
- {
- return $this->loadTemplate($name)->render($context);
- }
-
- /**
- * Displays a template.
- *
- * @param string $name The template name
- * @param array $context An array of parameters to pass to the template
- *
- * @throws Twig_Error_Loader When the template cannot be found
- * @throws Twig_Error_Syntax When an error occurred during compilation
- * @throws Twig_Error_Runtime When an error occurred during rendering
- */
- public function display($name, array $context = array())
- {
- $this->loadTemplate($name)->display($context);
- }
-
- /**
- * Loads a template.
- *
- * @param string|Twig_TemplateWrapper|Twig_Template $name The template name
- *
- * @throws Twig_Error_Loader When the template cannot be found
- * @throws Twig_Error_Runtime When a previously generated cache is corrupted
- * @throws Twig_Error_Syntax When an error occurred during compilation
- *
- * @return Twig_TemplateWrapper
- */
- public function load($name)
- {
- if ($name instanceof Twig_TemplateWrapper) {
- return $name;
- }
-
- if ($name instanceof Twig_Template) {
- return new Twig_TemplateWrapper($this, $name);
- }
-
- return new Twig_TemplateWrapper($this, $this->loadTemplate($name));
- }
-
- /**
- * Loads a template internal representation.
- *
- * This method is for internal use only and should never be called
- * directly.
- *
- * @param string $name The template name
- * @param int $index The index if it is an embedded template
- *
- * @return Twig_TemplateInterface A template instance representing the given template name
- *
- * @throws Twig_Error_Loader When the template cannot be found
- * @throws Twig_Error_Runtime When a previously generated cache is corrupted
- * @throws Twig_Error_Syntax When an error occurred during compilation
- *
- * @internal
- */
- public function loadTemplate($name, $index = null)
- {
- $cls = $mainCls = $this->getTemplateClass($name);
- if (null !== $index) {
- $cls .= '_'.$index;
- }
-
- if (isset($this->loadedTemplates[$cls])) {
- return $this->loadedTemplates[$cls];
- }
-
- if (!class_exists($cls, false)) {
- if ($this->bcGetCacheFilename) {
- $key = $this->getCacheFilename($name);
- } else {
- $key = $this->cache->generateKey($name, $mainCls);
- }
-
- if (!$this->isAutoReload() || $this->isTemplateFresh($name, $this->cache->getTimestamp($key))) {
- $this->cache->load($key);
- }
-
- if (!class_exists($cls, false)) {
- $loader = $this->getLoader();
- if (!$loader instanceof Twig_SourceContextLoaderInterface) {
- $source = new Twig_Source($loader->getSource($name), $name);
- } else {
- $source = $loader->getSourceContext($name);
- }
-
- $content = $this->compileSource($source);
-
- if ($this->bcWriteCacheFile) {
- $this->writeCacheFile($key, $content);
- } else {
- $this->cache->write($key, $content);
- $this->cache->load($key);
- }
-
- if (!class_exists($mainCls, false)) {
- /* Last line of defense if either $this->bcWriteCacheFile was used,
- * $this->cache is implemented as a no-op or we have a race condition
- * where the cache was cleared between the above calls to write to and load from
- * the cache.
- */
- eval('?>'.$content);
- }
- }
-
- if (!class_exists($cls, false)) {
- throw new Twig_Error_Runtime(sprintf('Failed to load Twig template "%s", index "%s": cache is corrupted.', $name, $index), -1, $source);
- }
- }
-
- if (!$this->runtimeInitialized) {
- $this->initRuntime();
- }
-
- if (isset($this->loading[$cls])) {
- throw new Twig_Error_Runtime(sprintf('Circular reference detected for Twig template "%s", path: %s.', $name, implode(' -> ', array_merge($this->loading, array($name)))));
- }
-
- $this->loading[$cls] = $name;
-
- try {
- $this->loadedTemplates[$cls] = new $cls($this);
- unset($this->loading[$cls]);
- } catch (\Exception $e) {
- unset($this->loading[$cls]);
-
- throw $e;
- }
-
- return $this->loadedTemplates[$cls];
- }
-
- /**
- * Creates a template from source.
- *
- * This method should not be used as a generic way to load templates.
- *
- * @param string $template The template name
- *
- * @return Twig_Template A template instance representing the given template name
- *
- * @throws Twig_Error_Loader When the template cannot be found
- * @throws Twig_Error_Syntax When an error occurred during compilation
- */
- public function createTemplate($template)
- {
- $name = sprintf('__string_template__%s', hash('sha256', $template, false));
-
- $loader = new Twig_Loader_Chain(array(
- new Twig_Loader_Array(array($name => $template)),
- $current = $this->getLoader(),
- ));
-
- $this->setLoader($loader);
- try {
- $template = $this->loadTemplate($name);
- } catch (Exception $e) {
- $this->setLoader($current);
-
- throw $e;
- } catch (Throwable $e) {
- $this->setLoader($current);
-
- throw $e;
- }
- $this->setLoader($current);
-
- return $template;
- }
-
- /**
- * Returns true if the template is still fresh.
- *
- * Besides checking the loader for freshness information,
- * this method also checks if the enabled extensions have
- * not changed.
- *
- * @param string $name The template name
- * @param int $time The last modification time of the cached template
- *
- * @return bool true if the template is fresh, false otherwise
- */
- public function isTemplateFresh($name, $time)
- {
- if (0 === $this->lastModifiedExtension) {
- foreach ($this->extensions as $extension) {
- $r = new ReflectionObject($extension);
- if (file_exists($r->getFileName()) && ($extensionTime = filemtime($r->getFileName())) > $this->lastModifiedExtension) {
- $this->lastModifiedExtension = $extensionTime;
- }
- }
- }
-
- return $this->lastModifiedExtension <= $time && $this->getLoader()->isFresh($name, $time);
- }
-
- /**
- * Tries to load a template consecutively from an array.
- *
- * Similar to loadTemplate() but it also accepts instances of Twig_Template and
- * Twig_TemplateWrapper, and an array of templates where each is tried to be loaded.
- *
- * @param string|Twig_Template|Twig_TemplateWrapper|array $names A template or an array of templates to try consecutively
- *
- * @return Twig_Template|Twig_TemplateWrapper
- *
- * @throws Twig_Error_Loader When none of the templates can be found
- * @throws Twig_Error_Syntax When an error occurred during compilation
- */
- public function resolveTemplate($names)
- {
- if (!is_array($names)) {
- $names = array($names);
- }
-
- foreach ($names as $name) {
- if ($name instanceof Twig_Template) {
- return $name;
- }
-
- if ($name instanceof Twig_TemplateWrapper) {
- return $name;
- }
-
- try {
- return $this->loadTemplate($name);
- } catch (Twig_Error_Loader $e) {
- }
- }
-
- if (1 === count($names)) {
- throw $e;
- }
-
- throw new Twig_Error_Loader(sprintf('Unable to find one of the following templates: "%s".', implode('", "', $names)));
- }
-
- /**
- * Clears the internal template cache.
- *
- * @deprecated since 1.18.3 (to be removed in 2.0)
- */
- public function clearTemplateCache()
- {
- @trigger_error(sprintf('The %s method is deprecated since version 1.18.3 and will be removed in Twig 2.0.', __METHOD__), E_USER_DEPRECATED);
-
- $this->loadedTemplates = array();
- }
-
- /**
- * Clears the template cache files on the filesystem.
- *
- * @deprecated since 1.22 (to be removed in 2.0)
- */
- public function clearCacheFiles()
- {
- @trigger_error(sprintf('The %s method is deprecated since version 1.22 and will be removed in Twig 2.0.', __METHOD__), E_USER_DEPRECATED);
-
- if (is_string($this->originalCache)) {
- foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($this->originalCache), RecursiveIteratorIterator::LEAVES_ONLY) as $file) {
- if ($file->isFile()) {
- @unlink($file->getPathname());
- }
- }
- }
- }
-
- /**
- * Gets the Lexer instance.
- *
- * @return Twig_LexerInterface
- *
- * @deprecated since 1.25 (to be removed in 2.0)
- */
- public function getLexer()
- {
- @trigger_error(sprintf('The %s() method is deprecated since version 1.25 and will be removed in 2.0.', __FUNCTION__), E_USER_DEPRECATED);
-
- if (null === $this->lexer) {
- $this->lexer = new Twig_Lexer($this);
- }
-
- return $this->lexer;
- }
-
- public function setLexer(Twig_LexerInterface $lexer)
- {
- $this->lexer = $lexer;
- }
-
- /**
- * Tokenizes a source code.
- *
- * @param string|Twig_Source $source The template source code
- * @param string $name The template name (deprecated)
- *
- * @return Twig_TokenStream
- *
- * @throws Twig_Error_Syntax When the code is syntactically wrong
- */
- public function tokenize($source, $name = null)
- {
- if (!$source instanceof Twig_Source) {
- @trigger_error(sprintf('Passing a string as the $source argument of %s() is deprecated since version 1.27. Pass a Twig_Source instance instead.', __METHOD__), E_USER_DEPRECATED);
- $source = new Twig_Source($source, $name);
- }
-
- if (null === $this->lexer) {
- $this->lexer = new Twig_Lexer($this);
- }
-
- return $this->lexer->tokenize($source);
- }
-
- /**
- * Gets the Parser instance.
- *
- * @return Twig_ParserInterface
- *
- * @deprecated since 1.25 (to be removed in 2.0)
- */
- public function getParser()
- {
- @trigger_error(sprintf('The %s() method is deprecated since version 1.25 and will be removed in 2.0.', __FUNCTION__), E_USER_DEPRECATED);
-
- if (null === $this->parser) {
- $this->parser = new Twig_Parser($this);
- }
-
- return $this->parser;
- }
-
- public function setParser(Twig_ParserInterface $parser)
- {
- $this->parser = $parser;
- }
-
- /**
- * Converts a token stream to a node tree.
- *
- * @return Twig_Node_Module
- *
- * @throws Twig_Error_Syntax When the token stream is syntactically or semantically wrong
- */
- public function parse(Twig_TokenStream $stream)
- {
- if (null === $this->parser) {
- $this->parser = new Twig_Parser($this);
- }
-
- return $this->parser->parse($stream);
- }
-
- /**
- * Gets the Compiler instance.
- *
- * @return Twig_CompilerInterface
- *
- * @deprecated since 1.25 (to be removed in 2.0)
- */
- public function getCompiler()
- {
- @trigger_error(sprintf('The %s() method is deprecated since version 1.25 and will be removed in 2.0.', __FUNCTION__), E_USER_DEPRECATED);
-
- if (null === $this->compiler) {
- $this->compiler = new Twig_Compiler($this);
- }
-
- return $this->compiler;
- }
-
- public function setCompiler(Twig_CompilerInterface $compiler)
- {
- $this->compiler = $compiler;
- }
-
- /**
- * Compiles a node and returns the PHP code.
- *
- * @return string The compiled PHP source code
- */
- public function compile(Twig_NodeInterface $node)
- {
- if (null === $this->compiler) {
- $this->compiler = new Twig_Compiler($this);
- }
-
- return $this->compiler->compile($node)->getSource();
- }
-
- /**
- * Compiles a template source code.
- *
- * @param string|Twig_Source $source The template source code
- * @param string $name The template name (deprecated)
- *
- * @return string The compiled PHP source code
- *
- * @throws Twig_Error_Syntax When there was an error during tokenizing, parsing or compiling
- */
- public function compileSource($source, $name = null)
- {
- if (!$source instanceof Twig_Source) {
- @trigger_error(sprintf('Passing a string as the $source argument of %s() is deprecated since version 1.27. Pass a Twig_Source instance instead.', __METHOD__), E_USER_DEPRECATED);
- $source = new Twig_Source($source, $name);
- }
-
- try {
- return $this->compile($this->parse($this->tokenize($source)));
- } catch (Twig_Error $e) {
- $e->setSourceContext($source);
- throw $e;
- } catch (Exception $e) {
- throw new Twig_Error_Syntax(sprintf('An exception has been thrown during the compilation of a template ("%s").', $e->getMessage()), -1, $source, $e);
- }
- }
-
- public function setLoader(Twig_LoaderInterface $loader)
- {
- if (!$loader instanceof Twig_SourceContextLoaderInterface && 0 !== strpos(get_class($loader), 'Mock_')) {
- @trigger_error(sprintf('Twig loader "%s" should implement Twig_SourceContextLoaderInterface since version 1.27.', get_class($loader)), E_USER_DEPRECATED);
- }
-
- $this->loader = $loader;
- }
-
- /**
- * Gets the Loader instance.
- *
- * @return Twig_LoaderInterface
- */
- public function getLoader()
- {
- if (null === $this->loader) {
- throw new LogicException('You must set a loader first.');
- }
-
- return $this->loader;
- }
-
- /**
- * Sets the default template charset.
- *
- * @param string $charset The default charset
- */
- public function setCharset($charset)
- {
- $this->charset = strtoupper($charset);
- }
-
- /**
- * Gets the default template charset.
- *
- * @return string The default charset
- */
- public function getCharset()
- {
- return $this->charset;
- }
-
- /**
- * Initializes the runtime environment.
- *
- * @deprecated since 1.23 (to be removed in 2.0)
- */
- public function initRuntime()
- {
- $this->runtimeInitialized = true;
-
- foreach ($this->getExtensions() as $name => $extension) {
- if (!$extension instanceof Twig_Extension_InitRuntimeInterface) {
- $m = new ReflectionMethod($extension, 'initRuntime');
-
- if ('Twig_Extension' !== $m->getDeclaringClass()->getName()) {
- @trigger_error(sprintf('Defining the initRuntime() method in the "%s" extension is deprecated since version 1.23. Use the `needs_environment` option to get the Twig_Environment instance in filters, functions, or tests; or explicitly implement Twig_Extension_InitRuntimeInterface if needed (not recommended).', $name), E_USER_DEPRECATED);
- }
- }
-
- $extension->initRuntime($this);
- }
- }
-
- /**
- * Returns true if the given extension is registered.
- *
- * @param string $class The extension class name
- *
- * @return bool Whether the extension is registered or not
- */
- public function hasExtension($class)
- {
- $class = ltrim($class, '\\');
- if (!isset($this->extensionsByClass[$class]) && class_exists($class, false)) {
- // For BC/FC with namespaced aliases
- $class = new ReflectionClass($class);
- $class = $class->name;
- }
-
- if (isset($this->extensions[$class])) {
- if ($class !== get_class($this->extensions[$class])) {
- @trigger_error(sprintf('Referencing the "%s" extension by its name (defined by getName()) is deprecated since 1.26 and will be removed in Twig 2.0. Use the Fully Qualified Extension Class Name instead.', $class), E_USER_DEPRECATED);
- }
-
- return true;
- }
-
- return isset($this->extensionsByClass[$class]);
- }
-
- /**
- * Adds a runtime loader.
- */
- public function addRuntimeLoader(Twig_RuntimeLoaderInterface $loader)
- {
- $this->runtimeLoaders[] = $loader;
- }
-
- /**
- * Gets an extension by class name.
- *
- * @param string $class The extension class name
- *
- * @return Twig_ExtensionInterface
- */
- public function getExtension($class)
- {
- $class = ltrim($class, '\\');
- if (!isset($this->extensionsByClass[$class]) && class_exists($class, false)) {
- // For BC/FC with namespaced aliases
- $class = new ReflectionClass($class);
- $class = $class->name;
- }
-
- if (isset($this->extensions[$class])) {
- if ($class !== get_class($this->extensions[$class])) {
- @trigger_error(sprintf('Referencing the "%s" extension by its name (defined by getName()) is deprecated since 1.26 and will be removed in Twig 2.0. Use the Fully Qualified Extension Class Name instead.', $class), E_USER_DEPRECATED);
- }
-
- return $this->extensions[$class];
- }
-
- if (!isset($this->extensionsByClass[$class])) {
- throw new Twig_Error_Runtime(sprintf('The "%s" extension is not enabled.', $class));
- }
-
- return $this->extensionsByClass[$class];
- }
-
- /**
- * Returns the runtime implementation of a Twig element (filter/function/test).
- *
- * @param string $class A runtime class name
- *
- * @return object The runtime implementation
- *
- * @throws Twig_Error_Runtime When the template cannot be found
- */
- public function getRuntime($class)
- {
- if (isset($this->runtimes[$class])) {
- return $this->runtimes[$class];
- }
-
- foreach ($this->runtimeLoaders as $loader) {
- if (null !== $runtime = $loader->load($class)) {
- return $this->runtimes[$class] = $runtime;
- }
- }
-
- throw new Twig_Error_Runtime(sprintf('Unable to load the "%s" runtime.', $class));
- }
-
- public function addExtension(Twig_ExtensionInterface $extension)
- {
- if ($this->extensionInitialized) {
- throw new LogicException(sprintf('Unable to register extension "%s" as extensions have already been initialized.', $extension->getName()));
- }
-
- $class = get_class($extension);
- if ($class !== $extension->getName()) {
- if (isset($this->extensions[$extension->getName()])) {
- unset($this->extensions[$extension->getName()], $this->extensionsByClass[$class]);
- @trigger_error(sprintf('The possibility to register the same extension twice ("%s") is deprecated since version 1.23 and will be removed in Twig 2.0. Use proper PHP inheritance instead.', $extension->getName()), E_USER_DEPRECATED);
- }
- }
-
- $this->lastModifiedExtension = 0;
- $this->extensionsByClass[$class] = $extension;
- $this->extensions[$extension->getName()] = $extension;
- $this->updateOptionsHash();
- }
-
- /**
- * Removes an extension by name.
- *
- * This method is deprecated and you should not use it.
- *
- * @param string $name The extension name
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
- public function removeExtension($name)
- {
- @trigger_error(sprintf('The %s method is deprecated since version 1.12 and will be removed in Twig 2.0.', __METHOD__), E_USER_DEPRECATED);
-
- if ($this->extensionInitialized) {
- throw new LogicException(sprintf('Unable to remove extension "%s" as extensions have already been initialized.', $name));
- }
-
- $class = ltrim($name, '\\');
- if (!isset($this->extensionsByClass[$class]) && class_exists($class, false)) {
- // For BC/FC with namespaced aliases
- $class = new ReflectionClass($class);
- $class = $class->name;
- }
-
- if (isset($this->extensions[$class])) {
- if ($class !== get_class($this->extensions[$class])) {
- @trigger_error(sprintf('Referencing the "%s" extension by its name (defined by getName()) is deprecated since 1.26 and will be removed in Twig 2.0. Use the Fully Qualified Extension Class Name instead.', $class), E_USER_DEPRECATED);
- }
-
- unset($this->extensions[$class]);
- }
-
- unset($this->extensions[$class]);
- $this->updateOptionsHash();
- }
-
- /**
- * Registers an array of extensions.
- *
- * @param array $extensions An array of extensions
- */
- public function setExtensions(array $extensions)
- {
- foreach ($extensions as $extension) {
- $this->addExtension($extension);
- }
- }
-
- /**
- * Returns all registered extensions.
- *
- * @return Twig_ExtensionInterface[] An array of extensions (keys are for internal usage only and should not be relied on)
- */
- public function getExtensions()
- {
- return $this->extensions;
- }
-
- public function addTokenParser(Twig_TokenParserInterface $parser)
- {
- if ($this->extensionInitialized) {
- throw new LogicException('Unable to add a token parser as extensions have already been initialized.');
- }
-
- $this->staging->addTokenParser($parser);
- }
-
- /**
- * Gets the registered Token Parsers.
- *
- * @return Twig_TokenParserBrokerInterface
- *
- * @internal
- */
- public function getTokenParsers()
- {
- if (!$this->extensionInitialized) {
- $this->initExtensions();
- }
-
- return $this->parsers;
- }
-
- /**
- * Gets registered tags.
- *
- * Be warned that this method cannot return tags defined by Twig_TokenParserBrokerInterface classes.
- *
- * @return Twig_TokenParserInterface[]
- *
- * @internal
- */
- public function getTags()
- {
- $tags = array();
- foreach ($this->getTokenParsers()->getParsers() as $parser) {
- if ($parser instanceof Twig_TokenParserInterface) {
- $tags[$parser->getTag()] = $parser;
- }
- }
-
- return $tags;
- }
-
- public function addNodeVisitor(Twig_NodeVisitorInterface $visitor)
- {
- if ($this->extensionInitialized) {
- throw new LogicException('Unable to add a node visitor as extensions have already been initialized.');
- }
-
- $this->staging->addNodeVisitor($visitor);
- }
-
- /**
- * Gets the registered Node Visitors.
- *
- * @return Twig_NodeVisitorInterface[]
- *
- * @internal
- */
- public function getNodeVisitors()
- {
- if (!$this->extensionInitialized) {
- $this->initExtensions();
- }
-
- return $this->visitors;
- }
-
- /**
- * Registers a Filter.
- *
- * @param string|Twig_SimpleFilter $name The filter name or a Twig_SimpleFilter instance
- * @param Twig_FilterInterface|Twig_SimpleFilter $filter
- */
- public function addFilter($name, $filter = null)
- {
- if (!$name instanceof Twig_SimpleFilter && !($filter instanceof Twig_SimpleFilter || $filter instanceof Twig_FilterInterface)) {
- throw new LogicException('A filter must be an instance of Twig_FilterInterface or Twig_SimpleFilter.');
- }
-
- if ($name instanceof Twig_SimpleFilter) {
- $filter = $name;
- $name = $filter->getName();
- } else {
- @trigger_error(sprintf('Passing a name as a first argument to the %s method is deprecated since version 1.21. Pass an instance of "Twig_SimpleFilter" instead when defining filter "%s".', __METHOD__, $name), E_USER_DEPRECATED);
- }
-
- if ($this->extensionInitialized) {
- throw new LogicException(sprintf('Unable to add filter "%s" as extensions have already been initialized.', $name));
- }
-
- $this->staging->addFilter($name, $filter);
- }
-
- /**
- * Get a filter by name.
- *
- * Subclasses may override this method and load filters differently;
- * so no list of filters is available.
- *
- * @param string $name The filter name
- *
- * @return Twig_Filter|false A Twig_Filter instance or false if the filter does not exist
- *
- * @internal
- */
- public function getFilter($name)
- {
- if (!$this->extensionInitialized) {
- $this->initExtensions();
- }
-
- if (isset($this->filters[$name])) {
- return $this->filters[$name];
- }
-
- foreach ($this->filters as $pattern => $filter) {
- $pattern = str_replace('\\*', '(.*?)', preg_quote($pattern, '#'), $count);
-
- if ($count) {
- if (preg_match('#^'.$pattern.'$#', $name, $matches)) {
- array_shift($matches);
- $filter->setArguments($matches);
-
- return $filter;
- }
- }
- }
-
- foreach ($this->filterCallbacks as $callback) {
- if (false !== $filter = call_user_func($callback, $name)) {
- return $filter;
- }
- }
-
- return false;
- }
-
- public function registerUndefinedFilterCallback($callable)
- {
- $this->filterCallbacks[] = $callable;
- }
-
- /**
- * Gets the registered Filters.
- *
- * Be warned that this method cannot return filters defined with registerUndefinedFilterCallback.
- *
- * @return Twig_FilterInterface[]
- *
- * @see registerUndefinedFilterCallback
- *
- * @internal
- */
- public function getFilters()
- {
- if (!$this->extensionInitialized) {
- $this->initExtensions();
- }
-
- return $this->filters;
- }
-
- /**
- * Registers a Test.
- *
- * @param string|Twig_SimpleTest $name The test name or a Twig_SimpleTest instance
- * @param Twig_TestInterface|Twig_SimpleTest $test A Twig_TestInterface instance or a Twig_SimpleTest instance
- */
- public function addTest($name, $test = null)
- {
- if (!$name instanceof Twig_SimpleTest && !($test instanceof Twig_SimpleTest || $test instanceof Twig_TestInterface)) {
- throw new LogicException('A test must be an instance of Twig_TestInterface or Twig_SimpleTest.');
- }
-
- if ($name instanceof Twig_SimpleTest) {
- $test = $name;
- $name = $test->getName();
- } else {
- @trigger_error(sprintf('Passing a name as a first argument to the %s method is deprecated since version 1.21. Pass an instance of "Twig_SimpleTest" instead when defining test "%s".', __METHOD__, $name), E_USER_DEPRECATED);
- }
-
- if ($this->extensionInitialized) {
- throw new LogicException(sprintf('Unable to add test "%s" as extensions have already been initialized.', $name));
- }
-
- $this->staging->addTest($name, $test);
- }
-
- /**
- * Gets the registered Tests.
- *
- * @return Twig_TestInterface[]
- *
- * @internal
- */
- public function getTests()
- {
- if (!$this->extensionInitialized) {
- $this->initExtensions();
- }
-
- return $this->tests;
- }
-
- /**
- * Gets a test by name.
- *
- * @param string $name The test name
- *
- * @return Twig_Test|false A Twig_Test instance or false if the test does not exist
- *
- * @internal
- */
- public function getTest($name)
- {
- if (!$this->extensionInitialized) {
- $this->initExtensions();
- }
-
- if (isset($this->tests[$name])) {
- return $this->tests[$name];
- }
-
- return false;
- }
-
- /**
- * Registers a Function.
- *
- * @param string|Twig_SimpleFunction $name The function name or a Twig_SimpleFunction instance
- * @param Twig_FunctionInterface|Twig_SimpleFunction $function
- */
- public function addFunction($name, $function = null)
- {
- if (!$name instanceof Twig_SimpleFunction && !($function instanceof Twig_SimpleFunction || $function instanceof Twig_FunctionInterface)) {
- throw new LogicException('A function must be an instance of Twig_FunctionInterface or Twig_SimpleFunction.');
- }
-
- if ($name instanceof Twig_SimpleFunction) {
- $function = $name;
- $name = $function->getName();
- } else {
- @trigger_error(sprintf('Passing a name as a first argument to the %s method is deprecated since version 1.21. Pass an instance of "Twig_SimpleFunction" instead when defining function "%s".', __METHOD__, $name), E_USER_DEPRECATED);
- }
-
- if ($this->extensionInitialized) {
- throw new LogicException(sprintf('Unable to add function "%s" as extensions have already been initialized.', $name));
- }
-
- $this->staging->addFunction($name, $function);
- }
-
- /**
- * Get a function by name.
- *
- * Subclasses may override this method and load functions differently;
- * so no list of functions is available.
- *
- * @param string $name function name
- *
- * @return Twig_Function|false A Twig_Function instance or false if the function does not exist
- *
- * @internal
- */
- public function getFunction($name)
- {
- if (!$this->extensionInitialized) {
- $this->initExtensions();
- }
-
- if (isset($this->functions[$name])) {
- return $this->functions[$name];
- }
-
- foreach ($this->functions as $pattern => $function) {
- $pattern = str_replace('\\*', '(.*?)', preg_quote($pattern, '#'), $count);
-
- if ($count) {
- if (preg_match('#^'.$pattern.'$#', $name, $matches)) {
- array_shift($matches);
- $function->setArguments($matches);
-
- return $function;
- }
- }
- }
-
- foreach ($this->functionCallbacks as $callback) {
- if (false !== $function = call_user_func($callback, $name)) {
- return $function;
- }
- }
-
- return false;
- }
-
- public function registerUndefinedFunctionCallback($callable)
- {
- $this->functionCallbacks[] = $callable;
- }
-
- /**
- * Gets registered functions.
- *
- * Be warned that this method cannot return functions defined with registerUndefinedFunctionCallback.
- *
- * @return Twig_FunctionInterface[]
- *
- * @see registerUndefinedFunctionCallback
- *
- * @internal
- */
- public function getFunctions()
- {
- if (!$this->extensionInitialized) {
- $this->initExtensions();
- }
-
- return $this->functions;
- }
-
- /**
- * Registers a Global.
- *
- * New globals can be added before compiling or rendering a template;
- * but after, you can only update existing globals.
- *
- * @param string $name The global name
- * @param mixed $value The global value
- */
- public function addGlobal($name, $value)
- {
- if ($this->extensionInitialized || $this->runtimeInitialized) {
- if (null === $this->globals) {
- $this->globals = $this->initGlobals();
- }
-
- if (!array_key_exists($name, $this->globals)) {
- // The deprecation notice must be turned into the following exception in Twig 2.0
- @trigger_error(sprintf('Registering global variable "%s" at runtime or when the extensions have already been initialized is deprecated since version 1.21.', $name), E_USER_DEPRECATED);
- //throw new LogicException(sprintf('Unable to add global "%s" as the runtime or the extensions have already been initialized.', $name));
- }
- }
-
- if ($this->extensionInitialized || $this->runtimeInitialized) {
- // update the value
- $this->globals[$name] = $value;
- } else {
- $this->staging->addGlobal($name, $value);
- }
- }
-
- /**
- * Gets the registered Globals.
- *
- * @return array An array of globals
- *
- * @internal
- */
- public function getGlobals()
- {
- if (!$this->runtimeInitialized && !$this->extensionInitialized) {
- return $this->initGlobals();
- }
-
- if (null === $this->globals) {
- $this->globals = $this->initGlobals();
- }
-
- return $this->globals;
- }
-
- /**
- * Merges a context with the defined globals.
- *
- * @param array $context An array representing the context
- *
- * @return array The context merged with the globals
- */
- public function mergeGlobals(array $context)
- {
- // we don't use array_merge as the context being generally
- // bigger than globals, this code is faster.
- foreach ($this->getGlobals() as $key => $value) {
- if (!array_key_exists($key, $context)) {
- $context[$key] = $value;
- }
- }
-
- return $context;
- }
-
- /**
- * Gets the registered unary Operators.
- *
- * @return array An array of unary operators
- *
- * @internal
- */
- public function getUnaryOperators()
- {
- if (!$this->extensionInitialized) {
- $this->initExtensions();
- }
-
- return $this->unaryOperators;
- }
-
- /**
- * Gets the registered binary Operators.
- *
- * @return array An array of binary operators
- *
- * @internal
- */
- public function getBinaryOperators()
- {
- if (!$this->extensionInitialized) {
- $this->initExtensions();
- }
-
- return $this->binaryOperators;
- }
-
- /**
- * @deprecated since 1.23 (to be removed in 2.0)
- */
- public function computeAlternatives($name, $items)
- {
- @trigger_error(sprintf('The %s method is deprecated since version 1.23 and will be removed in Twig 2.0.', __METHOD__), E_USER_DEPRECATED);
-
- return Twig_Error_Syntax::computeAlternatives($name, $items);
- }
-
- /**
- * @internal
- */
- protected function initGlobals()
- {
- $globals = array();
- foreach ($this->extensions as $name => $extension) {
- if (!$extension instanceof Twig_Extension_GlobalsInterface) {
- $m = new ReflectionMethod($extension, 'getGlobals');
-
- if ('Twig_Extension' !== $m->getDeclaringClass()->getName()) {
- @trigger_error(sprintf('Defining the getGlobals() method in the "%s" extension without explicitly implementing Twig_Extension_GlobalsInterface is deprecated since version 1.23.', $name), E_USER_DEPRECATED);
- }
- }
-
- $extGlob = $extension->getGlobals();
- if (!is_array($extGlob)) {
- throw new UnexpectedValueException(sprintf('"%s::getGlobals()" must return an array of globals.', get_class($extension)));
- }
-
- $globals[] = $extGlob;
- }
-
- $globals[] = $this->staging->getGlobals();
-
- return call_user_func_array('array_merge', $globals);
- }
-
- /**
- * @internal
- */
- protected function initExtensions()
- {
- if ($this->extensionInitialized) {
- return;
- }
-
- $this->parsers = new Twig_TokenParserBroker(array(), array(), false);
- $this->filters = array();
- $this->functions = array();
- $this->tests = array();
- $this->visitors = array();
- $this->unaryOperators = array();
- $this->binaryOperators = array();
-
- foreach ($this->extensions as $extension) {
- $this->initExtension($extension);
- }
- $this->initExtension($this->staging);
- // Done at the end only, so that an exception during initialization does not mark the environment as initialized when catching the exception
- $this->extensionInitialized = true;
- }
-
- /**
- * @internal
- */
- protected function initExtension(Twig_ExtensionInterface $extension)
- {
- // filters
- foreach ($extension->getFilters() as $name => $filter) {
- if ($filter instanceof Twig_SimpleFilter) {
- $name = $filter->getName();
- } else {
- @trigger_error(sprintf('Using an instance of "%s" for filter "%s" is deprecated since version 1.21. Use Twig_SimpleFilter instead.', get_class($filter), $name), E_USER_DEPRECATED);
- }
-
- $this->filters[$name] = $filter;
- }
-
- // functions
- foreach ($extension->getFunctions() as $name => $function) {
- if ($function instanceof Twig_SimpleFunction) {
- $name = $function->getName();
- } else {
- @trigger_error(sprintf('Using an instance of "%s" for function "%s" is deprecated since version 1.21. Use Twig_SimpleFunction instead.', get_class($function), $name), E_USER_DEPRECATED);
- }
-
- $this->functions[$name] = $function;
- }
-
- // tests
- foreach ($extension->getTests() as $name => $test) {
- if ($test instanceof Twig_SimpleTest) {
- $name = $test->getName();
- } else {
- @trigger_error(sprintf('Using an instance of "%s" for test "%s" is deprecated since version 1.21. Use Twig_SimpleTest instead.', get_class($test), $name), E_USER_DEPRECATED);
- }
-
- $this->tests[$name] = $test;
- }
-
- // token parsers
- foreach ($extension->getTokenParsers() as $parser) {
- if ($parser instanceof Twig_TokenParserInterface) {
- $this->parsers->addTokenParser($parser);
- } elseif ($parser instanceof Twig_TokenParserBrokerInterface) {
- @trigger_error('Registering a Twig_TokenParserBrokerInterface instance is deprecated since version 1.21.', E_USER_DEPRECATED);
-
- $this->parsers->addTokenParserBroker($parser);
- } else {
- throw new LogicException('getTokenParsers() must return an array of Twig_TokenParserInterface or Twig_TokenParserBrokerInterface instances.');
- }
- }
-
- // node visitors
- foreach ($extension->getNodeVisitors() as $visitor) {
- $this->visitors[] = $visitor;
- }
-
- // operators
- if ($operators = $extension->getOperators()) {
- if (!is_array($operators)) {
- throw new InvalidArgumentException(sprintf('"%s::getOperators()" must return an array with operators, got "%s".', get_class($extension), is_object($operators) ? get_class($operators) : gettype($operators).(is_resource($operators) ? '' : '#'.$operators)));
- }
-
- if (2 !== count($operators)) {
- throw new InvalidArgumentException(sprintf('"%s::getOperators()" must return an array of 2 elements, got %d.', get_class($extension), count($operators)));
- }
-
- $this->unaryOperators = array_merge($this->unaryOperators, $operators[0]);
- $this->binaryOperators = array_merge($this->binaryOperators, $operators[1]);
- }
- }
-
- /**
- * @deprecated since 1.22 (to be removed in 2.0)
- */
- protected function writeCacheFile($file, $content)
- {
- $this->cache->write($file, $content);
- }
-
- private function updateOptionsHash()
- {
- $hashParts = array_merge(
- array_keys($this->extensions),
- array(
- (int) function_exists('twig_template_get_attributes'),
- PHP_MAJOR_VERSION,
- PHP_MINOR_VERSION,
- self::VERSION,
- (int) $this->debug,
- $this->baseTemplateClass,
- (int) $this->strictVariables,
- )
- );
- $this->optionsHash = implode(':', $hashParts);
- }
-}
-
-class_alias('Twig_Environment', 'Twig\Environment', false);
diff --git a/inc/lib/Twig/Error.php b/inc/lib/Twig/Error.php
deleted file mode 100644
index 787e0d09..00000000
--- a/inc/lib/Twig/Error.php
+++ /dev/null
@@ -1,363 +0,0 @@
-
- */
-class Twig_Error extends Exception
-{
- protected $lineno;
- // to be renamed to name in 2.0
- protected $filename;
- protected $rawMessage;
- protected $previous;
-
- private $sourcePath;
- private $sourceCode;
-
- /**
- * Constructor.
- *
- * Set both the line number and the name to false to
- * disable automatic guessing of the original template name
- * and line number.
- *
- * Set the line number to -1 to enable its automatic guessing.
- * Set the name to null to enable its automatic guessing.
- *
- * By default, automatic guessing is enabled.
- *
- * @param string $message The error message
- * @param int $lineno The template line where the error occurred
- * @param Twig_Source|string|null $source The source context where the error occurred
- * @param Exception $previous The previous exception
- */
- public function __construct($message, $lineno = -1, $source = null, Exception $previous = null)
- {
- if (null === $source) {
- $name = null;
- } elseif (!$source instanceof Twig_Source) {
- // for compat with the Twig C ext., passing the template name as string is accepted
- $name = $source;
- } else {
- $name = $source->getName();
- $this->sourceCode = $source->getCode();
- $this->sourcePath = $source->getPath();
- }
- if (PHP_VERSION_ID < 50300) {
- $this->previous = $previous;
- parent::__construct('');
- } else {
- parent::__construct('', 0, $previous);
- }
-
- $this->lineno = $lineno;
- $this->filename = $name;
-
- if (-1 === $lineno || null === $name || null === $this->sourcePath) {
- $this->guessTemplateInfo();
- }
-
- $this->rawMessage = $message;
-
- $this->updateRepr();
- }
-
- /**
- * Gets the raw message.
- *
- * @return string The raw message
- */
- public function getRawMessage()
- {
- return $this->rawMessage;
- }
-
- /**
- * Gets the logical name where the error occurred.
- *
- * @return string The name
- *
- * @deprecated since 1.27 (to be removed in 2.0). Use getSourceContext() instead.
- */
- public function getTemplateFile()
- {
- @trigger_error(sprintf('The "%s" method is deprecated since version 1.27 and will be removed in 2.0. Use getSourceContext() instead.', __METHOD__), E_USER_DEPRECATED);
-
- return $this->filename;
- }
-
- /**
- * Sets the logical name where the error occurred.
- *
- * @param string $name The name
- *
- * @deprecated since 1.27 (to be removed in 2.0). Use setSourceContext() instead.
- */
- public function setTemplateFile($name)
- {
- @trigger_error(sprintf('The "%s" method is deprecated since version 1.27 and will be removed in 2.0. Use setSourceContext() instead.', __METHOD__), E_USER_DEPRECATED);
-
- $this->filename = $name;
-
- $this->updateRepr();
- }
-
- /**
- * Gets the logical name where the error occurred.
- *
- * @return string The name
- *
- * @deprecated since 1.29 (to be removed in 2.0). Use getSourceContext() instead.
- */
- public function getTemplateName()
- {
- @trigger_error(sprintf('The "%s" method is deprecated since version 1.29 and will be removed in 2.0. Use getSourceContext() instead.', __METHOD__), E_USER_DEPRECATED);
-
- return $this->filename;
- }
-
- /**
- * Sets the logical name where the error occurred.
- *
- * @param string $name The name
- *
- * @deprecated since 1.29 (to be removed in 2.0). Use setSourceContext() instead.
- */
- public function setTemplateName($name)
- {
- @trigger_error(sprintf('The "%s" method is deprecated since version 1.29 and will be removed in 2.0. Use setSourceContext() instead.', __METHOD__), E_USER_DEPRECATED);
-
- $this->filename = $name;
- $this->sourceCode = $this->sourcePath = null;
-
- $this->updateRepr();
- }
-
- /**
- * Gets the template line where the error occurred.
- *
- * @return int The template line
- */
- public function getTemplateLine()
- {
- return $this->lineno;
- }
-
- /**
- * Sets the template line where the error occurred.
- *
- * @param int $lineno The template line
- */
- public function setTemplateLine($lineno)
- {
- $this->lineno = $lineno;
-
- $this->updateRepr();
- }
-
- /**
- * Gets the source context of the Twig template where the error occurred.
- *
- * @return Twig_Source|null
- */
- public function getSourceContext()
- {
- return $this->filename ? new Twig_Source($this->sourceCode, $this->filename, $this->sourcePath) : null;
- }
-
- /**
- * Sets the source context of the Twig template where the error occurred.
- */
- public function setSourceContext(Twig_Source $source = null)
- {
- if (null === $source) {
- $this->sourceCode = $this->filename = $this->sourcePath = null;
- } else {
- $this->sourceCode = $source->getCode();
- $this->filename = $source->getName();
- $this->sourcePath = $source->getPath();
- }
-
- $this->updateRepr();
- }
-
- public function guess()
- {
- $this->guessTemplateInfo();
- $this->updateRepr();
- }
-
- /**
- * For PHP < 5.3.0, provides access to the getPrevious() method.
- *
- * @param string $method The method name
- * @param array $arguments The parameters to be passed to the method
- *
- * @return Exception The previous exception or null
- *
- * @throws BadMethodCallException
- */
- public function __call($method, $arguments)
- {
- if ('getprevious' == strtolower($method)) {
- return $this->previous;
- }
-
- throw new BadMethodCallException(sprintf('Method "Twig_Error::%s()" does not exist.', $method));
- }
-
- public function appendMessage($rawMessage)
- {
- $this->rawMessage .= $rawMessage;
- $this->updateRepr();
- }
-
- /**
- * @internal
- */
- protected function updateRepr()
- {
- $this->message = $this->rawMessage;
-
- if ($this->sourcePath && $this->lineno > 0) {
- $this->file = $this->sourcePath;
- $this->line = $this->lineno;
-
- return;
- }
-
- $dot = false;
- if ('.' === substr($this->message, -1)) {
- $this->message = substr($this->message, 0, -1);
- $dot = true;
- }
-
- $questionMark = false;
- if ('?' === substr($this->message, -1)) {
- $this->message = substr($this->message, 0, -1);
- $questionMark = true;
- }
-
- if ($this->filename) {
- if (is_string($this->filename) || (is_object($this->filename) && method_exists($this->filename, '__toString'))) {
- $name = sprintf('"%s"', $this->filename);
- } else {
- $name = json_encode($this->filename);
- }
- $this->message .= sprintf(' in %s', $name);
- }
-
- if ($this->lineno && $this->lineno >= 0) {
- $this->message .= sprintf(' at line %d', $this->lineno);
- }
-
- if ($dot) {
- $this->message .= '.';
- }
-
- if ($questionMark) {
- $this->message .= '?';
- }
- }
-
- /**
- * @internal
- */
- protected function guessTemplateInfo()
- {
- $template = null;
- $templateClass = null;
-
- if (PHP_VERSION_ID >= 50306) {
- $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS | DEBUG_BACKTRACE_PROVIDE_OBJECT);
- } else {
- $backtrace = debug_backtrace();
- }
-
- foreach ($backtrace as $trace) {
- if (isset($trace['object']) && $trace['object'] instanceof Twig_Template && 'Twig_Template' !== get_class($trace['object'])) {
- $currentClass = get_class($trace['object']);
- $isEmbedContainer = 0 === strpos($templateClass, $currentClass);
- if (null === $this->filename || ($this->filename == $trace['object']->getTemplateName() && !$isEmbedContainer)) {
- $template = $trace['object'];
- $templateClass = get_class($trace['object']);
- }
- }
- }
-
- // update template name
- if (null !== $template && null === $this->filename) {
- $this->filename = $template->getTemplateName();
- }
-
- // update template path if any
- if (null !== $template && null === $this->sourcePath) {
- $src = $template->getSourceContext();
- $this->sourceCode = $src->getCode();
- $this->sourcePath = $src->getPath();
- }
-
- if (null === $template || $this->lineno > -1) {
- return;
- }
-
- $r = new ReflectionObject($template);
- $file = $r->getFileName();
-
- $exceptions = array($e = $this);
- while (($e instanceof self || method_exists($e, 'getPrevious')) && $e = $e->getPrevious()) {
- $exceptions[] = $e;
- }
-
- while ($e = array_pop($exceptions)) {
- $traces = $e->getTrace();
- array_unshift($traces, array('file' => $e->getFile(), 'line' => $e->getLine()));
-
- while ($trace = array_shift($traces)) {
- if (!isset($trace['file']) || !isset($trace['line']) || $file != $trace['file']) {
- continue;
- }
-
- foreach ($template->getDebugInfo() as $codeLine => $templateLine) {
- if ($codeLine <= $trace['line']) {
- // update template line
- $this->lineno = $templateLine;
-
- return;
- }
- }
- }
- }
- }
-}
-
-class_alias('Twig_Error', 'Twig\Error\Error', false);
-class_exists('Twig_Source');
diff --git a/inc/lib/Twig/Error/Loader.php b/inc/lib/Twig/Error/Loader.php
deleted file mode 100644
index df566dd7..00000000
--- a/inc/lib/Twig/Error/Loader.php
+++ /dev/null
@@ -1,40 +0,0 @@
-
- */
-class Twig_Error_Loader extends Twig_Error
-{
- public function __construct($message, $lineno = -1, $source = null, Exception $previous = null)
- {
- if (PHP_VERSION_ID < 50300) {
- $this->previous = $previous;
- Exception::__construct('');
- } else {
- Exception::__construct('', 0, $previous);
- }
- $this->appendMessage($message);
- $this->setTemplateLine(false);
- }
-}
-
-class_alias('Twig_Error_Loader', 'Twig\Error\LoaderError', false);
diff --git a/inc/lib/Twig/Error/Runtime.php b/inc/lib/Twig/Error/Runtime.php
deleted file mode 100644
index 3b24ad3a..00000000
--- a/inc/lib/Twig/Error/Runtime.php
+++ /dev/null
@@ -1,22 +0,0 @@
-
- */
-class Twig_Error_Runtime extends Twig_Error
-{
-}
-
-class_alias('Twig_Error_Runtime', 'Twig\Error\RuntimeError', false);
diff --git a/inc/lib/Twig/Error/Syntax.php b/inc/lib/Twig/Error/Syntax.php
deleted file mode 100644
index 9d09f217..00000000
--- a/inc/lib/Twig/Error/Syntax.php
+++ /dev/null
@@ -1,55 +0,0 @@
-
- */
-class Twig_Error_Syntax extends Twig_Error
-{
- /**
- * Tweaks the error message to include suggestions.
- *
- * @param string $name The original name of the item that does not exist
- * @param array $items An array of possible items
- */
- public function addSuggestions($name, array $items)
- {
- if (!$alternatives = self::computeAlternatives($name, $items)) {
- return;
- }
-
- $this->appendMessage(sprintf(' Did you mean "%s"?', implode('", "', $alternatives)));
- }
-
- /**
- * @internal
- *
- * To be merged with the addSuggestions() method in 2.0.
- */
- public static function computeAlternatives($name, $items)
- {
- $alternatives = array();
- foreach ($items as $item) {
- $lev = levenshtein($name, $item);
- if ($lev <= strlen($name) / 3 || false !== strpos($item, $name)) {
- $alternatives[$item] = $lev;
- }
- }
- asort($alternatives);
-
- return array_keys($alternatives);
- }
-}
-
-class_alias('Twig_Error_Syntax', 'Twig\Error\SyntaxError', false);
diff --git a/inc/lib/Twig/ExistsLoaderInterface.php b/inc/lib/Twig/ExistsLoaderInterface.php
deleted file mode 100644
index 968cb21a..00000000
--- a/inc/lib/Twig/ExistsLoaderInterface.php
+++ /dev/null
@@ -1,31 +0,0 @@
-
- *
- * @deprecated since 1.12 (to be removed in 3.0)
- */
-interface Twig_ExistsLoaderInterface
-{
- /**
- * Check if we have the source code of a template, given its name.
- *
- * @param string $name The name of the template to check if we can load
- *
- * @return bool If the template source code is handled by this loader or not
- */
- public function exists($name);
-}
-
-class_alias('Twig_ExistsLoaderInterface', 'Twig\Loader\ExistsLoaderInterface', false);
diff --git a/inc/lib/Twig/ExpressionParser.php b/inc/lib/Twig/ExpressionParser.php
deleted file mode 100644
index fe4a9b4a..00000000
--- a/inc/lib/Twig/ExpressionParser.php
+++ /dev/null
@@ -1,744 +0,0 @@
-
- *
- * @internal
- */
-class Twig_ExpressionParser
-{
- const OPERATOR_LEFT = 1;
- const OPERATOR_RIGHT = 2;
-
- protected $parser;
- protected $unaryOperators;
- protected $binaryOperators;
-
- private $env;
-
- public function __construct(Twig_Parser $parser, $env = null)
- {
- $this->parser = $parser;
-
- if ($env instanceof Twig_Environment) {
- $this->env = $env;
- $this->unaryOperators = $env->getUnaryOperators();
- $this->binaryOperators = $env->getBinaryOperators();
- } else {
- @trigger_error('Passing the operators as constructor arguments to '.__METHOD__.' is deprecated since version 1.27. Pass the environment instead.', E_USER_DEPRECATED);
-
- $this->env = $parser->getEnvironment();
- $this->unaryOperators = func_get_arg(1);
- $this->binaryOperators = func_get_arg(2);
- }
- }
-
- public function parseExpression($precedence = 0)
- {
- $expr = $this->getPrimary();
- $token = $this->parser->getCurrentToken();
- while ($this->isBinary($token) && $this->binaryOperators[$token->getValue()]['precedence'] >= $precedence) {
- $op = $this->binaryOperators[$token->getValue()];
- $this->parser->getStream()->next();
-
- if ('is not' === $token->getValue()) {
- $expr = $this->parseNotTestExpression($expr);
- } elseif ('is' === $token->getValue()) {
- $expr = $this->parseTestExpression($expr);
- } elseif (isset($op['callable'])) {
- $expr = call_user_func($op['callable'], $this->parser, $expr);
- } else {
- $expr1 = $this->parseExpression(self::OPERATOR_LEFT === $op['associativity'] ? $op['precedence'] + 1 : $op['precedence']);
- $class = $op['class'];
- $expr = new $class($expr, $expr1, $token->getLine());
- }
-
- $token = $this->parser->getCurrentToken();
- }
-
- if (0 === $precedence) {
- return $this->parseConditionalExpression($expr);
- }
-
- return $expr;
- }
-
- protected function getPrimary()
- {
- $token = $this->parser->getCurrentToken();
-
- if ($this->isUnary($token)) {
- $operator = $this->unaryOperators[$token->getValue()];
- $this->parser->getStream()->next();
- $expr = $this->parseExpression($operator['precedence']);
- $class = $operator['class'];
-
- return $this->parsePostfixExpression(new $class($expr, $token->getLine()));
- } elseif ($token->test(Twig_Token::PUNCTUATION_TYPE, '(')) {
- $this->parser->getStream()->next();
- $expr = $this->parseExpression();
- $this->parser->getStream()->expect(Twig_Token::PUNCTUATION_TYPE, ')', 'An opened parenthesis is not properly closed');
-
- return $this->parsePostfixExpression($expr);
- }
-
- return $this->parsePrimaryExpression();
- }
-
- protected function parseConditionalExpression($expr)
- {
- while ($this->parser->getStream()->nextIf(Twig_Token::PUNCTUATION_TYPE, '?')) {
- if (!$this->parser->getStream()->nextIf(Twig_Token::PUNCTUATION_TYPE, ':')) {
- $expr2 = $this->parseExpression();
- if ($this->parser->getStream()->nextIf(Twig_Token::PUNCTUATION_TYPE, ':')) {
- $expr3 = $this->parseExpression();
- } else {
- $expr3 = new Twig_Node_Expression_Constant('', $this->parser->getCurrentToken()->getLine());
- }
- } else {
- $expr2 = $expr;
- $expr3 = $this->parseExpression();
- }
-
- $expr = new Twig_Node_Expression_Conditional($expr, $expr2, $expr3, $this->parser->getCurrentToken()->getLine());
- }
-
- return $expr;
- }
-
- protected function isUnary(Twig_Token $token)
- {
- return $token->test(Twig_Token::OPERATOR_TYPE) && isset($this->unaryOperators[$token->getValue()]);
- }
-
- protected function isBinary(Twig_Token $token)
- {
- return $token->test(Twig_Token::OPERATOR_TYPE) && isset($this->binaryOperators[$token->getValue()]);
- }
-
- public function parsePrimaryExpression()
- {
- $token = $this->parser->getCurrentToken();
- switch ($token->getType()) {
- case Twig_Token::NAME_TYPE:
- $this->parser->getStream()->next();
- switch ($token->getValue()) {
- case 'true':
- case 'TRUE':
- $node = new Twig_Node_Expression_Constant(true, $token->getLine());
- break;
-
- case 'false':
- case 'FALSE':
- $node = new Twig_Node_Expression_Constant(false, $token->getLine());
- break;
-
- case 'none':
- case 'NONE':
- case 'null':
- case 'NULL':
- $node = new Twig_Node_Expression_Constant(null, $token->getLine());
- break;
-
- default:
- if ('(' === $this->parser->getCurrentToken()->getValue()) {
- $node = $this->getFunctionNode($token->getValue(), $token->getLine());
- } else {
- $node = new Twig_Node_Expression_Name($token->getValue(), $token->getLine());
- }
- }
- break;
-
- case Twig_Token::NUMBER_TYPE:
- $this->parser->getStream()->next();
- $node = new Twig_Node_Expression_Constant($token->getValue(), $token->getLine());
- break;
-
- case Twig_Token::STRING_TYPE:
- case Twig_Token::INTERPOLATION_START_TYPE:
- $node = $this->parseStringExpression();
- break;
-
- case Twig_Token::OPERATOR_TYPE:
- if (preg_match(Twig_Lexer::REGEX_NAME, $token->getValue(), $matches) && $matches[0] == $token->getValue()) {
- // in this context, string operators are variable names
- $this->parser->getStream()->next();
- $node = new Twig_Node_Expression_Name($token->getValue(), $token->getLine());
- break;
- } elseif (isset($this->unaryOperators[$token->getValue()])) {
- $class = $this->unaryOperators[$token->getValue()]['class'];
-
- $ref = new ReflectionClass($class);
- $negClass = 'Twig_Node_Expression_Unary_Neg';
- $posClass = 'Twig_Node_Expression_Unary_Pos';
- if (!(in_array($ref->getName(), array($negClass, $posClass)) || $ref->isSubclassOf($negClass) || $ref->isSubclassOf($posClass))) {
- throw new Twig_Error_Syntax(sprintf('Unexpected unary operator "%s".', $token->getValue()), $token->getLine(), $this->parser->getStream()->getSourceContext());
- }
-
- $this->parser->getStream()->next();
- $expr = $this->parsePrimaryExpression();
-
- $node = new $class($expr, $token->getLine());
- break;
- }
-
- // no break
- default:
- if ($token->test(Twig_Token::PUNCTUATION_TYPE, '[')) {
- $node = $this->parseArrayExpression();
- } elseif ($token->test(Twig_Token::PUNCTUATION_TYPE, '{')) {
- $node = $this->parseHashExpression();
- } elseif ($token->test(Twig_Token::OPERATOR_TYPE, '=') && ('==' === $this->parser->getStream()->look(-1)->getValue() || '!=' === $this->parser->getStream()->look(-1)->getValue())) {
- throw new Twig_Error_Syntax(sprintf('Unexpected operator of value "%s". Did you try to use "===" or "!==" for strict comparison? Use "is same as(value)" instead.', $token->getValue()), $token->getLine(), $this->parser->getStream()->getSourceContext());
- } else {
- throw new Twig_Error_Syntax(sprintf('Unexpected token "%s" of value "%s".', Twig_Token::typeToEnglish($token->getType()), $token->getValue()), $token->getLine(), $this->parser->getStream()->getSourceContext());
- }
- }
-
- return $this->parsePostfixExpression($node);
- }
-
- public function parseStringExpression()
- {
- $stream = $this->parser->getStream();
-
- $nodes = array();
- // a string cannot be followed by another string in a single expression
- $nextCanBeString = true;
- while (true) {
- if ($nextCanBeString && $token = $stream->nextIf(Twig_Token::STRING_TYPE)) {
- $nodes[] = new Twig_Node_Expression_Constant($token->getValue(), $token->getLine());
- $nextCanBeString = false;
- } elseif ($stream->nextIf(Twig_Token::INTERPOLATION_START_TYPE)) {
- $nodes[] = $this->parseExpression();
- $stream->expect(Twig_Token::INTERPOLATION_END_TYPE);
- $nextCanBeString = true;
- } else {
- break;
- }
- }
-
- $expr = array_shift($nodes);
- foreach ($nodes as $node) {
- $expr = new Twig_Node_Expression_Binary_Concat($expr, $node, $node->getTemplateLine());
- }
-
- return $expr;
- }
-
- public function parseArrayExpression()
- {
- $stream = $this->parser->getStream();
- $stream->expect(Twig_Token::PUNCTUATION_TYPE, '[', 'An array element was expected');
-
- $node = new Twig_Node_Expression_Array(array(), $stream->getCurrent()->getLine());
- $first = true;
- while (!$stream->test(Twig_Token::PUNCTUATION_TYPE, ']')) {
- if (!$first) {
- $stream->expect(Twig_Token::PUNCTUATION_TYPE, ',', 'An array element must be followed by a comma');
-
- // trailing ,?
- if ($stream->test(Twig_Token::PUNCTUATION_TYPE, ']')) {
- break;
- }
- }
- $first = false;
-
- $node->addElement($this->parseExpression());
- }
- $stream->expect(Twig_Token::PUNCTUATION_TYPE, ']', 'An opened array is not properly closed');
-
- return $node;
- }
-
- public function parseHashExpression()
- {
- $stream = $this->parser->getStream();
- $stream->expect(Twig_Token::PUNCTUATION_TYPE, '{', 'A hash element was expected');
-
- $node = new Twig_Node_Expression_Array(array(), $stream->getCurrent()->getLine());
- $first = true;
- while (!$stream->test(Twig_Token::PUNCTUATION_TYPE, '}')) {
- if (!$first) {
- $stream->expect(Twig_Token::PUNCTUATION_TYPE, ',', 'A hash value must be followed by a comma');
-
- // trailing ,?
- if ($stream->test(Twig_Token::PUNCTUATION_TYPE, '}')) {
- break;
- }
- }
- $first = false;
-
- // a hash key can be:
- //
- // * a number -- 12
- // * a string -- 'a'
- // * a name, which is equivalent to a string -- a
- // * an expression, which must be enclosed in parentheses -- (1 + 2)
- if (($token = $stream->nextIf(Twig_Token::STRING_TYPE)) || ($token = $stream->nextIf(Twig_Token::NAME_TYPE)) || $token = $stream->nextIf(Twig_Token::NUMBER_TYPE)) {
- $key = new Twig_Node_Expression_Constant($token->getValue(), $token->getLine());
- } elseif ($stream->test(Twig_Token::PUNCTUATION_TYPE, '(')) {
- $key = $this->parseExpression();
- } else {
- $current = $stream->getCurrent();
-
- throw new Twig_Error_Syntax(sprintf('A hash key must be a quoted string, a number, a name, or an expression enclosed in parentheses (unexpected token "%s" of value "%s".', Twig_Token::typeToEnglish($current->getType()), $current->getValue()), $current->getLine(), $stream->getSourceContext());
- }
-
- $stream->expect(Twig_Token::PUNCTUATION_TYPE, ':', 'A hash key must be followed by a colon (:)');
- $value = $this->parseExpression();
-
- $node->addElement($value, $key);
- }
- $stream->expect(Twig_Token::PUNCTUATION_TYPE, '}', 'An opened hash is not properly closed');
-
- return $node;
- }
-
- public function parsePostfixExpression($node)
- {
- while (true) {
- $token = $this->parser->getCurrentToken();
- if (Twig_Token::PUNCTUATION_TYPE == $token->getType()) {
- if ('.' == $token->getValue() || '[' == $token->getValue()) {
- $node = $this->parseSubscriptExpression($node);
- } elseif ('|' == $token->getValue()) {
- $node = $this->parseFilterExpression($node);
- } else {
- break;
- }
- } else {
- break;
- }
- }
-
- return $node;
- }
-
- public function getFunctionNode($name, $line)
- {
- switch ($name) {
- case 'parent':
- $this->parseArguments();
- if (!count($this->parser->getBlockStack())) {
- throw new Twig_Error_Syntax('Calling "parent" outside a block is forbidden.', $line, $this->parser->getStream()->getSourceContext());
- }
-
- if (!$this->parser->getParent() && !$this->parser->hasTraits()) {
- throw new Twig_Error_Syntax('Calling "parent" on a template that does not extend nor "use" another template is forbidden.', $line, $this->parser->getStream()->getSourceContext());
- }
-
- return new Twig_Node_Expression_Parent($this->parser->peekBlockStack(), $line);
- case 'block':
- $args = $this->parseArguments();
- if (count($args) < 1) {
- throw new Twig_Error_Syntax('The "block" function takes one argument (the block name).', $line, $this->parser->getStream()->getSourceContext());
- }
-
- return new Twig_Node_Expression_BlockReference($args->getNode(0), count($args) > 1 ? $args->getNode(1) : null, $line);
- case 'attribute':
- $args = $this->parseArguments();
- if (count($args) < 2) {
- throw new Twig_Error_Syntax('The "attribute" function takes at least two arguments (the variable and the attributes).', $line, $this->parser->getStream()->getSourceContext());
- }
-
- return new Twig_Node_Expression_GetAttr($args->getNode(0), $args->getNode(1), count($args) > 2 ? $args->getNode(2) : null, Twig_Template::ANY_CALL, $line);
- default:
- if (null !== $alias = $this->parser->getImportedSymbol('function', $name)) {
- $arguments = new Twig_Node_Expression_Array(array(), $line);
- foreach ($this->parseArguments() as $n) {
- $arguments->addElement($n);
- }
-
- $node = new Twig_Node_Expression_MethodCall($alias['node'], $alias['name'], $arguments, $line);
- $node->setAttribute('safe', true);
-
- return $node;
- }
-
- $args = $this->parseArguments(true);
- $class = $this->getFunctionNodeClass($name, $line);
-
- return new $class($name, $args, $line);
- }
- }
-
- public function parseSubscriptExpression($node)
- {
- $stream = $this->parser->getStream();
- $token = $stream->next();
- $lineno = $token->getLine();
- $arguments = new Twig_Node_Expression_Array(array(), $lineno);
- $type = Twig_Template::ANY_CALL;
- if ('.' == $token->getValue()) {
- $token = $stream->next();
- if (
- Twig_Token::NAME_TYPE == $token->getType()
- ||
- Twig_Token::NUMBER_TYPE == $token->getType()
- ||
- (Twig_Token::OPERATOR_TYPE == $token->getType() && preg_match(Twig_Lexer::REGEX_NAME, $token->getValue()))
- ) {
- $arg = new Twig_Node_Expression_Constant($token->getValue(), $lineno);
-
- if ($stream->test(Twig_Token::PUNCTUATION_TYPE, '(')) {
- $type = Twig_Template::METHOD_CALL;
- foreach ($this->parseArguments() as $n) {
- $arguments->addElement($n);
- }
- }
- } else {
- throw new Twig_Error_Syntax('Expected name or number.', $lineno, $stream->getSourceContext());
- }
-
- if ($node instanceof Twig_Node_Expression_Name && null !== $this->parser->getImportedSymbol('template', $node->getAttribute('name'))) {
- if (!$arg instanceof Twig_Node_Expression_Constant) {
- throw new Twig_Error_Syntax(sprintf('Dynamic macro names are not supported (called on "%s").', $node->getAttribute('name')), $token->getLine(), $stream->getSourceContext());
- }
-
- $name = $arg->getAttribute('value');
-
- if ($this->parser->isReservedMacroName($name)) {
- throw new Twig_Error_Syntax(sprintf('"%s" cannot be called as macro as it is a reserved keyword.', $name), $token->getLine(), $stream->getSourceContext());
- }
-
- $node = new Twig_Node_Expression_MethodCall($node, 'get'.$name, $arguments, $lineno);
- $node->setAttribute('safe', true);
-
- return $node;
- }
- } else {
- $type = Twig_Template::ARRAY_CALL;
-
- // slice?
- $slice = false;
- if ($stream->test(Twig_Token::PUNCTUATION_TYPE, ':')) {
- $slice = true;
- $arg = new Twig_Node_Expression_Constant(0, $token->getLine());
- } else {
- $arg = $this->parseExpression();
- }
-
- if ($stream->nextIf(Twig_Token::PUNCTUATION_TYPE, ':')) {
- $slice = true;
- }
-
- if ($slice) {
- if ($stream->test(Twig_Token::PUNCTUATION_TYPE, ']')) {
- $length = new Twig_Node_Expression_Constant(null, $token->getLine());
- } else {
- $length = $this->parseExpression();
- }
-
- $class = $this->getFilterNodeClass('slice', $token->getLine());
- $arguments = new Twig_Node(array($arg, $length));
- $filter = new $class($node, new Twig_Node_Expression_Constant('slice', $token->getLine()), $arguments, $token->getLine());
-
- $stream->expect(Twig_Token::PUNCTUATION_TYPE, ']');
-
- return $filter;
- }
-
- $stream->expect(Twig_Token::PUNCTUATION_TYPE, ']');
- }
-
- return new Twig_Node_Expression_GetAttr($node, $arg, $arguments, $type, $lineno);
- }
-
- public function parseFilterExpression($node)
- {
- $this->parser->getStream()->next();
-
- return $this->parseFilterExpressionRaw($node);
- }
-
- public function parseFilterExpressionRaw($node, $tag = null)
- {
- while (true) {
- $token = $this->parser->getStream()->expect(Twig_Token::NAME_TYPE);
-
- $name = new Twig_Node_Expression_Constant($token->getValue(), $token->getLine());
- if (!$this->parser->getStream()->test(Twig_Token::PUNCTUATION_TYPE, '(')) {
- $arguments = new Twig_Node();
- } else {
- $arguments = $this->parseArguments(true);
- }
-
- $class = $this->getFilterNodeClass($name->getAttribute('value'), $token->getLine());
-
- $node = new $class($node, $name, $arguments, $token->getLine(), $tag);
-
- if (!$this->parser->getStream()->test(Twig_Token::PUNCTUATION_TYPE, '|')) {
- break;
- }
-
- $this->parser->getStream()->next();
- }
-
- return $node;
- }
-
- /**
- * Parses arguments.
- *
- * @param bool $namedArguments Whether to allow named arguments or not
- * @param bool $definition Whether we are parsing arguments for a function definition
- *
- * @return Twig_Node
- *
- * @throws Twig_Error_Syntax
- */
- public function parseArguments($namedArguments = false, $definition = false)
- {
- $args = array();
- $stream = $this->parser->getStream();
-
- $stream->expect(Twig_Token::PUNCTUATION_TYPE, '(', 'A list of arguments must begin with an opening parenthesis');
- while (!$stream->test(Twig_Token::PUNCTUATION_TYPE, ')')) {
- if (!empty($args)) {
- $stream->expect(Twig_Token::PUNCTUATION_TYPE, ',', 'Arguments must be separated by a comma');
- }
-
- if ($definition) {
- $token = $stream->expect(Twig_Token::NAME_TYPE, null, 'An argument must be a name');
- $value = new Twig_Node_Expression_Name($token->getValue(), $this->parser->getCurrentToken()->getLine());
- } else {
- $value = $this->parseExpression();
- }
-
- $name = null;
- if ($namedArguments && $token = $stream->nextIf(Twig_Token::OPERATOR_TYPE, '=')) {
- if (!$value instanceof Twig_Node_Expression_Name) {
- throw new Twig_Error_Syntax(sprintf('A parameter name must be a string, "%s" given.', get_class($value)), $token->getLine(), $stream->getSourceContext());
- }
- $name = $value->getAttribute('name');
-
- if ($definition) {
- $value = $this->parsePrimaryExpression();
-
- if (!$this->checkConstantExpression($value)) {
- throw new Twig_Error_Syntax(sprintf('A default value for an argument must be a constant (a boolean, a string, a number, or an array).'), $token->getLine(), $stream->getSourceContext());
- }
- } else {
- $value = $this->parseExpression();
- }
- }
-
- if ($definition) {
- if (null === $name) {
- $name = $value->getAttribute('name');
- $value = new Twig_Node_Expression_Constant(null, $this->parser->getCurrentToken()->getLine());
- }
- $args[$name] = $value;
- } else {
- if (null === $name) {
- $args[] = $value;
- } else {
- $args[$name] = $value;
- }
- }
- }
- $stream->expect(Twig_Token::PUNCTUATION_TYPE, ')', 'A list of arguments must be closed by a parenthesis');
-
- return new Twig_Node($args);
- }
-
- public function parseAssignmentExpression()
- {
- $stream = $this->parser->getStream();
- $targets = array();
- while (true) {
- $token = $stream->expect(Twig_Token::NAME_TYPE, null, 'Only variables can be assigned to');
- $value = $token->getValue();
- if (in_array(strtolower($value), array('true', 'false', 'none', 'null'))) {
- throw new Twig_Error_Syntax(sprintf('You cannot assign a value to "%s".', $value), $token->getLine(), $stream->getSourceContext());
- }
- $targets[] = new Twig_Node_Expression_AssignName($value, $token->getLine());
-
- if (!$stream->nextIf(Twig_Token::PUNCTUATION_TYPE, ',')) {
- break;
- }
- }
-
- return new Twig_Node($targets);
- }
-
- public function parseMultitargetExpression()
- {
- $targets = array();
- while (true) {
- $targets[] = $this->parseExpression();
- if (!$this->parser->getStream()->nextIf(Twig_Token::PUNCTUATION_TYPE, ',')) {
- break;
- }
- }
-
- return new Twig_Node($targets);
- }
-
- private function parseNotTestExpression(Twig_NodeInterface $node)
- {
- return new Twig_Node_Expression_Unary_Not($this->parseTestExpression($node), $this->parser->getCurrentToken()->getLine());
- }
-
- private function parseTestExpression(Twig_NodeInterface $node)
- {
- $stream = $this->parser->getStream();
- list($name, $test) = $this->getTest($node->getTemplateLine());
-
- $class = $this->getTestNodeClass($test);
- $arguments = null;
- if ($stream->test(Twig_Token::PUNCTUATION_TYPE, '(')) {
- $arguments = $this->parser->getExpressionParser()->parseArguments(true);
- }
-
- return new $class($node, $name, $arguments, $this->parser->getCurrentToken()->getLine());
- }
-
- private function getTest($line)
- {
- $stream = $this->parser->getStream();
- $name = $stream->expect(Twig_Token::NAME_TYPE)->getValue();
-
- if ($test = $this->env->getTest($name)) {
- return array($name, $test);
- }
-
- if ($stream->test(Twig_Token::NAME_TYPE)) {
- // try 2-words tests
- $name = $name.' '.$this->parser->getCurrentToken()->getValue();
-
- if ($test = $this->env->getTest($name)) {
- $stream->next();
-
- return array($name, $test);
- }
- }
-
- $e = new Twig_Error_Syntax(sprintf('Unknown "%s" test.', $name), $line, $stream->getSourceContext());
- $e->addSuggestions($name, array_keys($this->env->getTests()));
-
- throw $e;
- }
-
- private function getTestNodeClass($test)
- {
- if ($test instanceof Twig_SimpleTest && $test->isDeprecated()) {
- $stream = $this->parser->getStream();
- $message = sprintf('Twig Test "%s" is deprecated', $test->getName());
- if (!is_bool($test->getDeprecatedVersion())) {
- $message .= sprintf(' since version %s', $test->getDeprecatedVersion());
- }
- if ($test->getAlternative()) {
- $message .= sprintf('. Use "%s" instead', $test->getAlternative());
- }
- $src = $stream->getSourceContext();
- $message .= sprintf(' in %s at line %d.', $src->getPath() ? $src->getPath() : $src->getName(), $stream->getCurrent()->getLine());
-
- @trigger_error($message, E_USER_DEPRECATED);
- }
-
- if ($test instanceof Twig_SimpleTest) {
- return $test->getNodeClass();
- }
-
- return $test instanceof Twig_Test_Node ? $test->getClass() : 'Twig_Node_Expression_Test';
- }
-
- protected function getFunctionNodeClass($name, $line)
- {
- if (false === $function = $this->env->getFunction($name)) {
- $e = new Twig_Error_Syntax(sprintf('Unknown "%s" function.', $name), $line, $this->parser->getStream()->getSourceContext());
- $e->addSuggestions($name, array_keys($this->env->getFunctions()));
-
- throw $e;
- }
-
- if ($function instanceof Twig_SimpleFunction && $function->isDeprecated()) {
- $message = sprintf('Twig Function "%s" is deprecated', $function->getName());
- if (!is_bool($function->getDeprecatedVersion())) {
- $message .= sprintf(' since version %s', $function->getDeprecatedVersion());
- }
- if ($function->getAlternative()) {
- $message .= sprintf('. Use "%s" instead', $function->getAlternative());
- }
- $src = $this->parser->getStream()->getSourceContext();
- $message .= sprintf(' in %s at line %d.', $src->getPath() ? $src->getPath() : $src->getName(), $line);
-
- @trigger_error($message, E_USER_DEPRECATED);
- }
-
- if ($function instanceof Twig_SimpleFunction) {
- return $function->getNodeClass();
- }
-
- return $function instanceof Twig_Function_Node ? $function->getClass() : 'Twig_Node_Expression_Function';
- }
-
- protected function getFilterNodeClass($name, $line)
- {
- if (false === $filter = $this->env->getFilter($name)) {
- $e = new Twig_Error_Syntax(sprintf('Unknown "%s" filter.', $name), $line, $this->parser->getStream()->getSourceContext());
- $e->addSuggestions($name, array_keys($this->env->getFilters()));
-
- throw $e;
- }
-
- if ($filter instanceof Twig_SimpleFilter && $filter->isDeprecated()) {
- $message = sprintf('Twig Filter "%s" is deprecated', $filter->getName());
- if (!is_bool($filter->getDeprecatedVersion())) {
- $message .= sprintf(' since version %s', $filter->getDeprecatedVersion());
- }
- if ($filter->getAlternative()) {
- $message .= sprintf('. Use "%s" instead', $filter->getAlternative());
- }
- $src = $this->parser->getStream()->getSourceContext();
- $message .= sprintf(' in %s at line %d.', $src->getPath() ? $src->getPath() : $src->getName(), $line);
-
- @trigger_error($message, E_USER_DEPRECATED);
- }
-
- if ($filter instanceof Twig_SimpleFilter) {
- return $filter->getNodeClass();
- }
-
- return $filter instanceof Twig_Filter_Node ? $filter->getClass() : 'Twig_Node_Expression_Filter';
- }
-
- // checks that the node only contains "constant" elements
- protected function checkConstantExpression(Twig_NodeInterface $node)
- {
- if (!($node instanceof Twig_Node_Expression_Constant || $node instanceof Twig_Node_Expression_Array
- || $node instanceof Twig_Node_Expression_Unary_Neg || $node instanceof Twig_Node_Expression_Unary_Pos
- )) {
- return false;
- }
-
- foreach ($node as $n) {
- if (!$this->checkConstantExpression($n)) {
- return false;
- }
- }
-
- return true;
- }
-}
-
-class_alias('Twig_ExpressionParser', 'Twig\ExpressionParser', false);
diff --git a/inc/lib/Twig/Extension.php b/inc/lib/Twig/Extension.php
deleted file mode 100644
index 38084495..00000000
--- a/inc/lib/Twig/Extension.php
+++ /dev/null
@@ -1,69 +0,0 @@
-escapers[$strategy] = $callable;
- }
-
- /**
- * Gets all defined escapers.
- *
- * @return array An array of escapers
- */
- public function getEscapers()
- {
- return $this->escapers;
- }
-
- /**
- * Sets the default format to be used by the date filter.
- *
- * @param string $format The default date format string
- * @param string $dateIntervalFormat The default date interval format string
- */
- public function setDateFormat($format = null, $dateIntervalFormat = null)
- {
- if (null !== $format) {
- $this->dateFormats[0] = $format;
- }
-
- if (null !== $dateIntervalFormat) {
- $this->dateFormats[1] = $dateIntervalFormat;
- }
- }
-
- /**
- * Gets the default format to be used by the date filter.
- *
- * @return array The default date format string and the default date interval format string
- */
- public function getDateFormat()
- {
- return $this->dateFormats;
- }
-
- /**
- * Sets the default timezone to be used by the date filter.
- *
- * @param DateTimeZone|string $timezone The default timezone string or a DateTimeZone object
- */
- public function setTimezone($timezone)
- {
- $this->timezone = $timezone instanceof DateTimeZone ? $timezone : new DateTimeZone($timezone);
- }
-
- /**
- * Gets the default timezone to be used by the date filter.
- *
- * @return DateTimeZone The default timezone currently in use
- */
- public function getTimezone()
- {
- if (null === $this->timezone) {
- $this->timezone = new DateTimeZone(date_default_timezone_get());
- }
-
- return $this->timezone;
- }
-
- /**
- * Sets the default format to be used by the number_format filter.
- *
- * @param int $decimal the number of decimal places to use
- * @param string $decimalPoint the character(s) to use for the decimal point
- * @param string $thousandSep the character(s) to use for the thousands separator
- */
- public function setNumberFormat($decimal, $decimalPoint, $thousandSep)
- {
- $this->numberFormat = array($decimal, $decimalPoint, $thousandSep);
- }
-
- /**
- * Get the default format used by the number_format filter.
- *
- * @return array The arguments for number_format()
- */
- public function getNumberFormat()
- {
- return $this->numberFormat;
- }
-
- public function getTokenParsers()
- {
- return array(
- new Twig_TokenParser_For(),
- new Twig_TokenParser_If(),
- new Twig_TokenParser_Extends(),
- new Twig_TokenParser_Include(),
- new Twig_TokenParser_Block(),
- new Twig_TokenParser_Use(),
- new Twig_TokenParser_Filter(),
- new Twig_TokenParser_Macro(),
- new Twig_TokenParser_Import(),
- new Twig_TokenParser_From(),
- new Twig_TokenParser_Set(),
- new Twig_TokenParser_Spaceless(),
- new Twig_TokenParser_Flush(),
- new Twig_TokenParser_Do(),
- new Twig_TokenParser_Embed(),
- new Twig_TokenParser_With(),
- );
- }
-
- public function getFilters()
- {
- $filters = array(
- // formatting filters
- new Twig_SimpleFilter('date', 'twig_date_format_filter', array('needs_environment' => true)),
- new Twig_SimpleFilter('date_modify', 'twig_date_modify_filter', array('needs_environment' => true)),
- new Twig_SimpleFilter('format', 'sprintf'),
- new Twig_SimpleFilter('replace', 'twig_replace_filter'),
- new Twig_SimpleFilter('number_format', 'twig_number_format_filter', array('needs_environment' => true)),
- new Twig_SimpleFilter('abs', 'abs'),
- new Twig_SimpleFilter('round', 'twig_round'),
-
- // encoding
- new Twig_SimpleFilter('url_encode', 'twig_urlencode_filter'),
- new Twig_SimpleFilter('json_encode', 'twig_jsonencode_filter'),
- new Twig_SimpleFilter('convert_encoding', 'twig_convert_encoding'),
-
- // string filters
- new Twig_SimpleFilter('title', 'twig_title_string_filter', array('needs_environment' => true)),
- new Twig_SimpleFilter('capitalize', 'twig_capitalize_string_filter', array('needs_environment' => true)),
- new Twig_SimpleFilter('upper', 'strtoupper'),
- new Twig_SimpleFilter('lower', 'strtolower'),
- new Twig_SimpleFilter('striptags', 'strip_tags'),
- new Twig_SimpleFilter('trim', 'twig_trim_filter'),
- new Twig_SimpleFilter('nl2br', 'nl2br', array('pre_escape' => 'html', 'is_safe' => array('html'))),
-
- // array helpers
- new Twig_SimpleFilter('join', 'twig_join_filter'),
- new Twig_SimpleFilter('split', 'twig_split_filter', array('needs_environment' => true)),
- new Twig_SimpleFilter('sort', 'twig_sort_filter'),
- new Twig_SimpleFilter('merge', 'twig_array_merge'),
- new Twig_SimpleFilter('batch', 'twig_array_batch'),
-
- // string/array filters
- new Twig_SimpleFilter('reverse', 'twig_reverse_filter', array('needs_environment' => true)),
- new Twig_SimpleFilter('length', 'twig_length_filter', array('needs_environment' => true)),
- new Twig_SimpleFilter('slice', 'twig_slice', array('needs_environment' => true)),
- new Twig_SimpleFilter('first', 'twig_first', array('needs_environment' => true)),
- new Twig_SimpleFilter('last', 'twig_last', array('needs_environment' => true)),
-
- // iteration and runtime
- new Twig_SimpleFilter('default', '_twig_default_filter', array('node_class' => 'Twig_Node_Expression_Filter_Default')),
- new Twig_SimpleFilter('keys', 'twig_get_array_keys_filter'),
-
- // escaping
- new Twig_SimpleFilter('escape', 'twig_escape_filter', array('needs_environment' => true, 'is_safe_callback' => 'twig_escape_filter_is_safe')),
- new Twig_SimpleFilter('e', 'twig_escape_filter', array('needs_environment' => true, 'is_safe_callback' => 'twig_escape_filter_is_safe')),
- );
-
- if (function_exists('mb_get_info')) {
- $filters[] = new Twig_SimpleFilter('upper', 'twig_upper_filter', array('needs_environment' => true));
- $filters[] = new Twig_SimpleFilter('lower', 'twig_lower_filter', array('needs_environment' => true));
- }
-
- return $filters;
- }
-
- public function getFunctions()
- {
- return array(
- new Twig_SimpleFunction('max', 'max'),
- new Twig_SimpleFunction('min', 'min'),
- new Twig_SimpleFunction('range', 'range'),
- new Twig_SimpleFunction('constant', 'twig_constant'),
- new Twig_SimpleFunction('cycle', 'twig_cycle'),
- new Twig_SimpleFunction('random', 'twig_random', array('needs_environment' => true)),
- new Twig_SimpleFunction('date', 'twig_date_converter', array('needs_environment' => true)),
- new Twig_SimpleFunction('include', 'twig_include', array('needs_environment' => true, 'needs_context' => true, 'is_safe' => array('all'))),
- new Twig_SimpleFunction('source', 'twig_source', array('needs_environment' => true, 'is_safe' => array('all'))),
- );
- }
-
- public function getTests()
- {
- return array(
- new Twig_SimpleTest('even', null, array('node_class' => 'Twig_Node_Expression_Test_Even')),
- new Twig_SimpleTest('odd', null, array('node_class' => 'Twig_Node_Expression_Test_Odd')),
- new Twig_SimpleTest('defined', null, array('node_class' => 'Twig_Node_Expression_Test_Defined')),
- new Twig_SimpleTest('sameas', null, array('node_class' => 'Twig_Node_Expression_Test_Sameas', 'deprecated' => '1.21', 'alternative' => 'same as')),
- new Twig_SimpleTest('same as', null, array('node_class' => 'Twig_Node_Expression_Test_Sameas')),
- new Twig_SimpleTest('none', null, array('node_class' => 'Twig_Node_Expression_Test_Null')),
- new Twig_SimpleTest('null', null, array('node_class' => 'Twig_Node_Expression_Test_Null')),
- new Twig_SimpleTest('divisibleby', null, array('node_class' => 'Twig_Node_Expression_Test_Divisibleby', 'deprecated' => '1.21', 'alternative' => 'divisible by')),
- new Twig_SimpleTest('divisible by', null, array('node_class' => 'Twig_Node_Expression_Test_Divisibleby')),
- new Twig_SimpleTest('constant', null, array('node_class' => 'Twig_Node_Expression_Test_Constant')),
- new Twig_SimpleTest('empty', 'twig_test_empty'),
- new Twig_SimpleTest('iterable', 'twig_test_iterable'),
- );
- }
-
- public function getOperators()
- {
- return array(
- array(
- 'not' => array('precedence' => 50, 'class' => 'Twig_Node_Expression_Unary_Not'),
- '-' => array('precedence' => 500, 'class' => 'Twig_Node_Expression_Unary_Neg'),
- '+' => array('precedence' => 500, 'class' => 'Twig_Node_Expression_Unary_Pos'),
- ),
- array(
- 'or' => array('precedence' => 10, 'class' => 'Twig_Node_Expression_Binary_Or', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
- 'and' => array('precedence' => 15, 'class' => 'Twig_Node_Expression_Binary_And', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
- 'b-or' => array('precedence' => 16, 'class' => 'Twig_Node_Expression_Binary_BitwiseOr', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
- 'b-xor' => array('precedence' => 17, 'class' => 'Twig_Node_Expression_Binary_BitwiseXor', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
- 'b-and' => array('precedence' => 18, 'class' => 'Twig_Node_Expression_Binary_BitwiseAnd', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
- '==' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_Equal', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
- '!=' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_NotEqual', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
- '<' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_Less', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
- '>' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_Greater', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
- '>=' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_GreaterEqual', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
- '<=' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_LessEqual', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
- 'not in' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_NotIn', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
- 'in' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_In', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
- 'matches' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_Matches', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
- 'starts with' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_StartsWith', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
- 'ends with' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_EndsWith', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
- '..' => array('precedence' => 25, 'class' => 'Twig_Node_Expression_Binary_Range', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
- '+' => array('precedence' => 30, 'class' => 'Twig_Node_Expression_Binary_Add', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
- '-' => array('precedence' => 30, 'class' => 'Twig_Node_Expression_Binary_Sub', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
- '~' => array('precedence' => 40, 'class' => 'Twig_Node_Expression_Binary_Concat', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
- '*' => array('precedence' => 60, 'class' => 'Twig_Node_Expression_Binary_Mul', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
- '/' => array('precedence' => 60, 'class' => 'Twig_Node_Expression_Binary_Div', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
- '//' => array('precedence' => 60, 'class' => 'Twig_Node_Expression_Binary_FloorDiv', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
- '%' => array('precedence' => 60, 'class' => 'Twig_Node_Expression_Binary_Mod', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
- 'is' => array('precedence' => 100, 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
- 'is not' => array('precedence' => 100, 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
- '**' => array('precedence' => 200, 'class' => 'Twig_Node_Expression_Binary_Power', 'associativity' => Twig_ExpressionParser::OPERATOR_RIGHT),
- '??' => array('precedence' => 300, 'class' => 'Twig_Node_Expression_NullCoalesce', 'associativity' => Twig_ExpressionParser::OPERATOR_RIGHT),
- ),
- );
- }
-
- public function getName()
- {
- return 'core';
- }
-}
-
-/**
- * Cycles over a value.
- *
- * @param ArrayAccess|array $values
- * @param int $position The cycle position
- *
- * @return string The next value in the cycle
- */
-function twig_cycle($values, $position)
-{
- if (!is_array($values) && !$values instanceof ArrayAccess) {
- return $values;
- }
-
- return $values[$position % count($values)];
-}
-
-/**
- * Returns a random value depending on the supplied parameter type:
- * - a random item from a Traversable or array
- * - a random character from a string
- * - a random integer between 0 and the integer parameter.
- *
- * @param Twig_Environment $env
- * @param Traversable|array|int|float|string $values The values to pick a random item from
- *
- * @throws Twig_Error_Runtime when $values is an empty array (does not apply to an empty string which is returned as is)
- *
- * @return mixed A random value from the given sequence
- */
-function twig_random(Twig_Environment $env, $values = null)
-{
- if (null === $values) {
- return mt_rand();
- }
-
- if (is_int($values) || is_float($values)) {
- return $values < 0 ? mt_rand($values, 0) : mt_rand(0, $values);
- }
-
- if ($values instanceof Traversable) {
- $values = iterator_to_array($values);
- } elseif (is_string($values)) {
- if ('' === $values) {
- return '';
- }
- if (null !== $charset = $env->getCharset()) {
- if ('UTF-8' !== $charset) {
- $values = twig_convert_encoding($values, 'UTF-8', $charset);
- }
-
- // unicode version of str_split()
- // split at all positions, but not after the start and not before the end
- $values = preg_split('/(? $value) {
- $values[$i] = twig_convert_encoding($value, $charset, 'UTF-8');
- }
- }
- } else {
- return $values[mt_rand(0, strlen($values) - 1)];
- }
- }
-
- if (!is_array($values)) {
- return $values;
- }
-
- if (0 === count($values)) {
- throw new Twig_Error_Runtime('The random function cannot pick from an empty array.');
- }
-
- return $values[array_rand($values, 1)];
-}
-
-/**
- * Converts a date to the given format.
- *
- *
- * {{ post.published_at|date("m/d/Y") }}
- *
- *
- * @param Twig_Environment $env
- * @param DateTime|DateTimeInterface|DateInterval|string $date A date
- * @param string|null $format The target format, null to use the default
- * @param DateTimeZone|string|null|false $timezone The target timezone, null to use the default, false to leave unchanged
- *
- * @return string The formatted date
- */
-function twig_date_format_filter(Twig_Environment $env, $date, $format = null, $timezone = null)
-{
- if (null === $format) {
- $formats = $env->getExtension('Twig_Extension_Core')->getDateFormat();
- $format = $date instanceof DateInterval ? $formats[1] : $formats[0];
- }
-
- if ($date instanceof DateInterval) {
- return $date->format($format);
- }
-
- return twig_date_converter($env, $date, $timezone)->format($format);
-}
-
-/**
- * Returns a new date object modified.
- *
- *
- * {{ post.published_at|date_modify("-1day")|date("m/d/Y") }}
- *
- *
- * @param Twig_Environment $env
- * @param DateTime|string $date A date
- * @param string $modifier A modifier string
- *
- * @return DateTime A new date object
- */
-function twig_date_modify_filter(Twig_Environment $env, $date, $modifier)
-{
- $date = twig_date_converter($env, $date, false);
- $resultDate = $date->modify($modifier);
-
- // This is a hack to ensure PHP 5.2 support and support for DateTimeImmutable
- // DateTime::modify does not return the modified DateTime object < 5.3.0
- // and DateTimeImmutable does not modify $date.
- return null === $resultDate ? $date : $resultDate;
-}
-
-/**
- * Converts an input to a DateTime instance.
- *
- *
- * {% if date(user.created_at) < date('+2days') %}
- * {# do something #}
- * {% endif %}
- *
- *
- * @param Twig_Environment $env
- * @param DateTime|DateTimeInterface|string|null $date A date
- * @param DateTimeZone|string|null|false $timezone The target timezone, null to use the default, false to leave unchanged
- *
- * @return DateTime A DateTime instance
- */
-function twig_date_converter(Twig_Environment $env, $date = null, $timezone = null)
-{
- // determine the timezone
- if (false !== $timezone) {
- if (null === $timezone) {
- $timezone = $env->getExtension('Twig_Extension_Core')->getTimezone();
- } elseif (!$timezone instanceof DateTimeZone) {
- $timezone = new DateTimeZone($timezone);
- }
- }
-
- // immutable dates
- if ($date instanceof DateTimeImmutable) {
- return false !== $timezone ? $date->setTimezone($timezone) : $date;
- }
-
- if ($date instanceof DateTime || $date instanceof DateTimeInterface) {
- $date = clone $date;
- if (false !== $timezone) {
- $date->setTimezone($timezone);
- }
-
- return $date;
- }
-
- if (null === $date || 'now' === $date) {
- return new DateTime($date, false !== $timezone ? $timezone : $env->getExtension('Twig_Extension_Core')->getTimezone());
- }
-
- $asString = (string) $date;
- if (ctype_digit($asString) || (!empty($asString) && '-' === $asString[0] && ctype_digit(substr($asString, 1)))) {
- $date = new DateTime('@'.$date);
- } else {
- $date = new DateTime($date, $env->getExtension('Twig_Extension_Core')->getTimezone());
- }
-
- if (false !== $timezone) {
- $date->setTimezone($timezone);
- }
-
- return $date;
-}
-
-/**
- * Replaces strings within a string.
- *
- * @param string $str String to replace in
- * @param array|Traversable $from Replace values
- * @param string|null $to Replace to, deprecated (@see https://secure.php.net/manual/en/function.strtr.php)
- *
- * @return string
- */
-function twig_replace_filter($str, $from, $to = null)
-{
- if ($from instanceof Traversable) {
- $from = iterator_to_array($from);
- } elseif (is_string($from) && is_string($to)) {
- @trigger_error('Using "replace" with character by character replacement is deprecated since version 1.22 and will be removed in Twig 2.0', E_USER_DEPRECATED);
-
- return strtr($str, $from, $to);
- } elseif (!is_array($from)) {
- throw new Twig_Error_Runtime(sprintf('The "replace" filter expects an array or "Traversable" as replace values, got "%s".', is_object($from) ? get_class($from) : gettype($from)));
- }
-
- return strtr($str, $from);
-}
-
-/**
- * Rounds a number.
- *
- * @param int|float $value The value to round
- * @param int|float $precision The rounding precision
- * @param string $method The method to use for rounding
- *
- * @return int|float The rounded number
- */
-function twig_round($value, $precision = 0, $method = 'common')
-{
- if ('common' == $method) {
- return round($value, $precision);
- }
-
- if ('ceil' != $method && 'floor' != $method) {
- throw new Twig_Error_Runtime('The round filter only supports the "common", "ceil", and "floor" methods.');
- }
-
- return $method($value * pow(10, $precision)) / pow(10, $precision);
-}
-
-/**
- * Number format filter.
- *
- * All of the formatting options can be left null, in that case the defaults will
- * be used. Supplying any of the parameters will override the defaults set in the
- * environment object.
- *
- * @param Twig_Environment $env
- * @param mixed $number A float/int/string of the number to format
- * @param int $decimal the number of decimal points to display
- * @param string $decimalPoint the character(s) to use for the decimal point
- * @param string $thousandSep the character(s) to use for the thousands separator
- *
- * @return string The formatted number
- */
-function twig_number_format_filter(Twig_Environment $env, $number, $decimal = null, $decimalPoint = null, $thousandSep = null)
-{
- $defaults = $env->getExtension('Twig_Extension_Core')->getNumberFormat();
- if (null === $decimal) {
- $decimal = $defaults[0];
- }
-
- if (null === $decimalPoint) {
- $decimalPoint = $defaults[1];
- }
-
- if (null === $thousandSep) {
- $thousandSep = $defaults[2];
- }
-
- return number_format((float) $number, $decimal, $decimalPoint, $thousandSep);
-}
-
-/**
- * URL encodes (RFC 3986) a string as a path segment or an array as a query string.
- *
- * @param string|array $url A URL or an array of query parameters
- *
- * @return string The URL encoded value
- */
-function twig_urlencode_filter($url)
-{
- if (is_array($url)) {
- if (defined('PHP_QUERY_RFC3986')) {
- return http_build_query($url, '', '&', PHP_QUERY_RFC3986);
- }
-
- return http_build_query($url, '', '&');
- }
-
- return rawurlencode($url);
-}
-
-if (PHP_VERSION_ID < 50300) {
- /**
- * JSON encodes a variable.
- *
- * @param mixed $value the value to encode
- * @param int $options Not used on PHP 5.2.x
- *
- * @return mixed The JSON encoded value
- */
- function twig_jsonencode_filter($value, $options = 0)
- {
- if ($value instanceof Twig_Markup) {
- $value = (string) $value;
- } elseif (is_array($value)) {
- array_walk_recursive($value, '_twig_markup2string');
- }
-
- return json_encode($value);
- }
-} else {
- /**
- * JSON encodes a variable.
- *
- * @param mixed $value the value to encode
- * @param int $options Bitmask consisting of JSON_HEX_QUOT, JSON_HEX_TAG, JSON_HEX_AMP, JSON_HEX_APOS, JSON_NUMERIC_CHECK, JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, JSON_FORCE_OBJECT
- *
- * @return mixed The JSON encoded value
- */
- function twig_jsonencode_filter($value, $options = 0)
- {
- if ($value instanceof Twig_Markup) {
- $value = (string) $value;
- } elseif (is_array($value)) {
- array_walk_recursive($value, '_twig_markup2string');
- }
-
- return json_encode($value, $options);
- }
-}
-
-function _twig_markup2string(&$value)
-{
- if ($value instanceof Twig_Markup) {
- $value = (string) $value;
- }
-}
-
-/**
- * Merges an array with another one.
- *
- *
- * {% set items = { 'apple': 'fruit', 'orange': 'fruit' } %}
- *
- * {% set items = items|merge({ 'peugeot': 'car' }) %}
- *
- * {# items now contains { 'apple': 'fruit', 'orange': 'fruit', 'peugeot': 'car' } #}
- *
- *
- * @param array|Traversable $arr1 An array
- * @param array|Traversable $arr2 An array
- *
- * @return array The merged array
- */
-function twig_array_merge($arr1, $arr2)
-{
- if ($arr1 instanceof Traversable) {
- $arr1 = iterator_to_array($arr1);
- } elseif (!is_array($arr1)) {
- throw new Twig_Error_Runtime(sprintf('The merge filter only works with arrays or "Traversable", got "%s" as first argument.', gettype($arr1)));
- }
-
- if ($arr2 instanceof Traversable) {
- $arr2 = iterator_to_array($arr2);
- } elseif (!is_array($arr2)) {
- throw new Twig_Error_Runtime(sprintf('The merge filter only works with arrays or "Traversable", got "%s" as second argument.', gettype($arr2)));
- }
-
- return array_merge($arr1, $arr2);
-}
-
-/**
- * Slices a variable.
- *
- * @param Twig_Environment $env
- * @param mixed $item A variable
- * @param int $start Start of the slice
- * @param int $length Size of the slice
- * @param bool $preserveKeys Whether to preserve key or not (when the input is an array)
- *
- * @return mixed The sliced variable
- */
-function twig_slice(Twig_Environment $env, $item, $start, $length = null, $preserveKeys = false)
-{
- if ($item instanceof Traversable) {
- while ($item instanceof IteratorAggregate) {
- $item = $item->getIterator();
- }
-
- if ($start >= 0 && $length >= 0 && $item instanceof Iterator) {
- try {
- return iterator_to_array(new LimitIterator($item, $start, null === $length ? -1 : $length), $preserveKeys);
- } catch (OutOfBoundsException $exception) {
- return array();
- }
- }
-
- $item = iterator_to_array($item, $preserveKeys);
- }
-
- if (is_array($item)) {
- return array_slice($item, $start, $length, $preserveKeys);
- }
-
- $item = (string) $item;
-
- if (function_exists('mb_get_info') && null !== $charset = $env->getCharset()) {
- return (string) mb_substr($item, $start, null === $length ? mb_strlen($item, $charset) - $start : $length, $charset);
- }
-
- return (string) (null === $length ? substr($item, $start) : substr($item, $start, $length));
-}
-
-/**
- * Returns the first element of the item.
- *
- * @param Twig_Environment $env
- * @param mixed $item A variable
- *
- * @return mixed The first element of the item
- */
-function twig_first(Twig_Environment $env, $item)
-{
- $elements = twig_slice($env, $item, 0, 1, false);
-
- return is_string($elements) ? $elements : current($elements);
-}
-
-/**
- * Returns the last element of the item.
- *
- * @param Twig_Environment $env
- * @param mixed $item A variable
- *
- * @return mixed The last element of the item
- */
-function twig_last(Twig_Environment $env, $item)
-{
- $elements = twig_slice($env, $item, -1, 1, false);
-
- return is_string($elements) ? $elements : current($elements);
-}
-
-/**
- * Joins the values to a string.
- *
- * The separator between elements is an empty string per default, you can define it with the optional parameter.
- *
- *
- * {{ [1, 2, 3]|join('|') }}
- * {# returns 1|2|3 #}
- *
- * {{ [1, 2, 3]|join }}
- * {# returns 123 #}
- *
- *
- * @param array $value An array
- * @param string $glue The separator
- *
- * @return string The concatenated string
- */
-function twig_join_filter($value, $glue = '')
-{
- if ($value instanceof Traversable) {
- $value = iterator_to_array($value, false);
- }
-
- return implode($glue, (array) $value);
-}
-
-/**
- * Splits the string into an array.
- *
- *
- * {{ "one,two,three"|split(',') }}
- * {# returns [one, two, three] #}
- *
- * {{ "one,two,three,four,five"|split(',', 3) }}
- * {# returns [one, two, "three,four,five"] #}
- *
- * {{ "123"|split('') }}
- * {# returns [1, 2, 3] #}
- *
- * {{ "aabbcc"|split('', 2) }}
- * {# returns [aa, bb, cc] #}
- *
- *
- * @param Twig_Environment $env
- * @param string $value A string
- * @param string $delimiter The delimiter
- * @param int $limit The limit
- *
- * @return array The split string as an array
- */
-function twig_split_filter(Twig_Environment $env, $value, $delimiter, $limit = null)
-{
- if (!empty($delimiter)) {
- return null === $limit ? explode($delimiter, $value) : explode($delimiter, $value, $limit);
- }
-
- if (!function_exists('mb_get_info') || null === $charset = $env->getCharset()) {
- return str_split($value, null === $limit ? 1 : $limit);
- }
-
- if ($limit <= 1) {
- return preg_split('/(?
- * {% for key in array|keys %}
- * {# ... #}
- * {% endfor %}
- *
- *
- * @param array $array An array
- *
- * @return array The keys
- */
-function twig_get_array_keys_filter($array)
-{
- if ($array instanceof Traversable) {
- while ($array instanceof IteratorAggregate) {
- $array = $array->getIterator();
- }
-
- if ($array instanceof Iterator) {
- $keys = array();
- $array->rewind();
- while ($array->valid()) {
- $keys[] = $array->key();
- $array->next();
- }
-
- return $keys;
- }
-
- $keys = array();
- foreach ($array as $key => $item) {
- $keys[] = $key;
- }
-
- return $keys;
- }
-
- if (!is_array($array)) {
- return array();
- }
-
- return array_keys($array);
-}
-
-/**
- * Reverses a variable.
- *
- * @param Twig_Environment $env
- * @param array|Traversable|string $item An array, a Traversable instance, or a string
- * @param bool $preserveKeys Whether to preserve key or not
- *
- * @return mixed The reversed input
- */
-function twig_reverse_filter(Twig_Environment $env, $item, $preserveKeys = false)
-{
- if ($item instanceof Traversable) {
- return array_reverse(iterator_to_array($item), $preserveKeys);
- }
-
- if (is_array($item)) {
- return array_reverse($item, $preserveKeys);
- }
-
- if (null !== $charset = $env->getCharset()) {
- $string = (string) $item;
-
- if ('UTF-8' !== $charset) {
- $item = twig_convert_encoding($string, 'UTF-8', $charset);
- }
-
- preg_match_all('/./us', $item, $matches);
-
- $string = implode('', array_reverse($matches[0]));
-
- if ('UTF-8' !== $charset) {
- $string = twig_convert_encoding($string, $charset, 'UTF-8');
- }
-
- return $string;
- }
-
- return strrev((string) $item);
-}
-
-/**
- * Sorts an array.
- *
- * @param array|Traversable $array
- *
- * @return array
- */
-function twig_sort_filter($array)
-{
- if ($array instanceof Traversable) {
- $array = iterator_to_array($array);
- } elseif (!is_array($array)) {
- throw new Twig_Error_Runtime(sprintf('The sort filter only works with arrays or "Traversable", got "%s".', gettype($array)));
- }
-
- asort($array);
-
- return $array;
-}
-
-/**
- * @internal
- */
-function twig_in_filter($value, $compare)
-{
- if (is_array($compare)) {
- return in_array($value, $compare, is_object($value) || is_resource($value));
- } elseif (is_string($compare) && (is_string($value) || is_int($value) || is_float($value))) {
- return '' === $value || false !== strpos($compare, (string) $value);
- } elseif ($compare instanceof Traversable) {
- if (is_object($value) || is_resource($value)) {
- foreach ($compare as $item) {
- if ($item === $value) {
- return true;
- }
- }
- } else {
- foreach ($compare as $item) {
- if ($item == $value) {
- return true;
- }
- }
- }
-
- return false;
- }
-
- return false;
-}
-
-/**
- * Returns a trimmed string.
- *
- * @return string
- *
- * @throws Twig_Error_Runtime When an invalid trimming side is used (not a string or not 'left', 'right', or 'both')
- */
-function twig_trim_filter($string, $characterMask = null, $side = 'both')
-{
- if (null === $characterMask) {
- $characterMask = " \t\n\r\0\x0B";
- }
-
- switch ($side) {
- case 'both':
- return trim($string, $characterMask);
- case 'left':
- return ltrim($string, $characterMask);
- case 'right':
- return rtrim($string, $characterMask);
- default:
- throw new Twig_Error_Runtime('Trimming side must be "left", "right" or "both".');
- }
-}
-
-/**
- * Escapes a string.
- *
- * @param Twig_Environment $env
- * @param mixed $string The value to be escaped
- * @param string $strategy The escaping strategy
- * @param string $charset The charset
- * @param bool $autoescape Whether the function is called by the auto-escaping feature (true) or by the developer (false)
- *
- * @return string
- */
-function twig_escape_filter(Twig_Environment $env, $string, $strategy = 'html', $charset = null, $autoescape = false)
-{
- if ($autoescape && $string instanceof Twig_Markup) {
- return $string;
- }
-
- if (!is_string($string)) {
- if (is_object($string) && method_exists($string, '__toString')) {
- $string = (string) $string;
- } elseif (in_array($strategy, array('html', 'js', 'css', 'html_attr', 'url'))) {
- return $string;
- }
- }
-
- if (null === $charset) {
- $charset = $env->getCharset();
- }
-
- switch ($strategy) {
- case 'html':
- // see https://secure.php.net/htmlspecialchars
-
- // Using a static variable to avoid initializing the array
- // each time the function is called. Moving the declaration on the
- // top of the function slow downs other escaping strategies.
- static $htmlspecialcharsCharsets = array(
- 'ISO-8859-1' => true, 'ISO8859-1' => true,
- 'ISO-8859-15' => true, 'ISO8859-15' => true,
- 'utf-8' => true, 'UTF-8' => true,
- 'CP866' => true, 'IBM866' => true, '866' => true,
- 'CP1251' => true, 'WINDOWS-1251' => true, 'WIN-1251' => true,
- '1251' => true,
- 'CP1252' => true, 'WINDOWS-1252' => true, '1252' => true,
- 'KOI8-R' => true, 'KOI8-RU' => true, 'KOI8R' => true,
- 'BIG5' => true, '950' => true,
- 'GB2312' => true, '936' => true,
- 'BIG5-HKSCS' => true,
- 'SHIFT_JIS' => true, 'SJIS' => true, '932' => true,
- 'EUC-JP' => true, 'EUCJP' => true,
- 'ISO8859-5' => true, 'ISO-8859-5' => true, 'MACROMAN' => true,
- );
-
- if (isset($htmlspecialcharsCharsets[$charset])) {
- return htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE, $charset);
- }
-
- if (isset($htmlspecialcharsCharsets[strtoupper($charset)])) {
- // cache the lowercase variant for future iterations
- $htmlspecialcharsCharsets[$charset] = true;
-
- return htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE, $charset);
- }
-
- $string = twig_convert_encoding($string, 'UTF-8', $charset);
- $string = htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
-
- return twig_convert_encoding($string, $charset, 'UTF-8');
-
- case 'js':
- // escape all non-alphanumeric characters
- // into their \x or \uHHHH representations
- if ('UTF-8' !== $charset) {
- $string = twig_convert_encoding($string, 'UTF-8', $charset);
- }
-
- if (0 == strlen($string) ? false : 1 !== preg_match('/^./su', $string)) {
- throw new Twig_Error_Runtime('The string to escape is not a valid UTF-8 string.');
- }
-
- $string = preg_replace_callback('#[^a-zA-Z0-9,\._]#Su', '_twig_escape_js_callback', $string);
-
- if ('UTF-8' !== $charset) {
- $string = twig_convert_encoding($string, $charset, 'UTF-8');
- }
-
- return $string;
-
- case 'css':
- if ('UTF-8' !== $charset) {
- $string = twig_convert_encoding($string, 'UTF-8', $charset);
- }
-
- if (0 == strlen($string) ? false : 1 !== preg_match('/^./su', $string)) {
- throw new Twig_Error_Runtime('The string to escape is not a valid UTF-8 string.');
- }
-
- $string = preg_replace_callback('#[^a-zA-Z0-9]#Su', '_twig_escape_css_callback', $string);
-
- if ('UTF-8' !== $charset) {
- $string = twig_convert_encoding($string, $charset, 'UTF-8');
- }
-
- return $string;
-
- case 'html_attr':
- if ('UTF-8' !== $charset) {
- $string = twig_convert_encoding($string, 'UTF-8', $charset);
- }
-
- if (0 == strlen($string) ? false : 1 !== preg_match('/^./su', $string)) {
- throw new Twig_Error_Runtime('The string to escape is not a valid UTF-8 string.');
- }
-
- $string = preg_replace_callback('#[^a-zA-Z0-9,\.\-_]#Su', '_twig_escape_html_attr_callback', $string);
-
- if ('UTF-8' !== $charset) {
- $string = twig_convert_encoding($string, $charset, 'UTF-8');
- }
-
- return $string;
-
- case 'url':
- if (PHP_VERSION_ID < 50300) {
- return str_replace('%7E', '~', rawurlencode($string));
- }
-
- return rawurlencode($string);
-
- default:
- static $escapers;
-
- if (null === $escapers) {
- $escapers = $env->getExtension('Twig_Extension_Core')->getEscapers();
- }
-
- if (isset($escapers[$strategy])) {
- return call_user_func($escapers[$strategy], $env, $string, $charset);
- }
-
- $validStrategies = implode(', ', array_merge(array('html', 'js', 'url', 'css', 'html_attr'), array_keys($escapers)));
-
- throw new Twig_Error_Runtime(sprintf('Invalid escaping strategy "%s" (valid ones: %s).', $strategy, $validStrategies));
- }
-}
-
-/**
- * @internal
- */
-function twig_escape_filter_is_safe(Twig_Node $filterArgs)
-{
- foreach ($filterArgs as $arg) {
- if ($arg instanceof Twig_Node_Expression_Constant) {
- return array($arg->getAttribute('value'));
- }
-
- return array();
- }
-
- return array('html');
-}
-
-if (function_exists('mb_convert_encoding')) {
- function twig_convert_encoding($string, $to, $from)
- {
- return mb_convert_encoding($string, $to, $from);
- }
-} elseif (function_exists('iconv')) {
- function twig_convert_encoding($string, $to, $from)
- {
- return iconv($from, $to, $string);
- }
-} else {
- function twig_convert_encoding($string, $to, $from)
- {
- throw new Twig_Error_Runtime('No suitable convert encoding function (use UTF-8 as your encoding or install the iconv or mbstring extension).');
- }
-}
-
-function _twig_escape_js_callback($matches)
-{
- $char = $matches[0];
-
- /*
- * A few characters have short escape sequences in JSON and JavaScript.
- * Escape sequences supported only by JavaScript, not JSON, are ommitted.
- * \" is also supported but omitted, because the resulting string is not HTML safe.
- */
- static $shortMap = array(
- '\\' => '\\\\',
- '/' => '\\/',
- "\x08" => '\b',
- "\x0C" => '\f',
- "\x0A" => '\n',
- "\x0D" => '\r',
- "\x09" => '\t',
- );
-
- if (isset($shortMap[$char])) {
- return $shortMap[$char];
- }
-
- // \uHHHH
- $char = twig_convert_encoding($char, 'UTF-16BE', 'UTF-8');
- $char = strtoupper(bin2hex($char));
-
- if (4 >= strlen($char)) {
- return sprintf('\u%04s', $char);
- }
-
- return sprintf('\u%04s\u%04s', substr($char, 0, -4), substr($char, -4));
-}
-
-function _twig_escape_css_callback($matches)
-{
- $char = $matches[0];
-
- // \xHH
- if (!isset($char[1])) {
- $hex = ltrim(strtoupper(bin2hex($char)), '0');
- if (0 === strlen($hex)) {
- $hex = '0';
- }
-
- return '\\'.$hex.' ';
- }
-
- // \uHHHH
- $char = twig_convert_encoding($char, 'UTF-16BE', 'UTF-8');
-
- return '\\'.ltrim(strtoupper(bin2hex($char)), '0').' ';
-}
-
-/**
- * This function is adapted from code coming from Zend Framework.
- *
- * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (https://www.zend.com)
- * @license https://framework.zend.com/license/new-bsd New BSD License
- */
-function _twig_escape_html_attr_callback($matches)
-{
- /*
- * While HTML supports far more named entities, the lowest common denominator
- * has become HTML5's XML Serialisation which is restricted to the those named
- * entities that XML supports. Using HTML entities would result in this error:
- * XML Parsing Error: undefined entity
- */
- static $entityMap = array(
- 34 => 'quot', /* quotation mark */
- 38 => 'amp', /* ampersand */
- 60 => 'lt', /* less-than sign */
- 62 => 'gt', /* greater-than sign */
- );
-
- $chr = $matches[0];
- $ord = ord($chr);
-
- /*
- * The following replaces characters undefined in HTML with the
- * hex entity for the Unicode replacement character.
- */
- if (($ord <= 0x1f && "\t" != $chr && "\n" != $chr && "\r" != $chr) || ($ord >= 0x7f && $ord <= 0x9f)) {
- return '�';
- }
-
- /*
- * Check if the current character to escape has a name entity we should
- * replace it with while grabbing the hex value of the character.
- */
- if (1 == strlen($chr)) {
- $hex = strtoupper(substr('00'.bin2hex($chr), -2));
- } else {
- $chr = twig_convert_encoding($chr, 'UTF-16BE', 'UTF-8');
- $hex = strtoupper(substr('0000'.bin2hex($chr), -4));
- }
-
- $int = hexdec($hex);
- if (array_key_exists($int, $entityMap)) {
- return sprintf('&%s;', $entityMap[$int]);
- }
-
- /*
- * Per OWASP recommendations, we'll use hex entities for any other
- * characters where a named entity does not exist.
- */
- return sprintf('%s;', $hex);
-}
-
-// add multibyte extensions if possible
-if (function_exists('mb_get_info')) {
- /**
- * Returns the length of a variable.
- *
- * @param Twig_Environment $env
- * @param mixed $thing A variable
- *
- * @return int The length of the value
- */
- function twig_length_filter(Twig_Environment $env, $thing)
- {
- if (null === $thing) {
- return 0;
- }
-
- if (is_scalar($thing)) {
- return mb_strlen($thing, $env->getCharset());
- }
-
- if ($thing instanceof \SimpleXMLElement) {
- return count($thing);
- }
-
- if (is_object($thing) && method_exists($thing, '__toString') && !$thing instanceof \Countable) {
- return mb_strlen((string) $thing, $env->getCharset());
- }
-
- if ($thing instanceof \Countable || is_array($thing)) {
- return count($thing);
- }
-
- if ($thing instanceof \IteratorAggregate) {
- return iterator_count($thing);
- }
-
- return 1;
- }
-
- /**
- * Converts a string to uppercase.
- *
- * @param Twig_Environment $env
- * @param string $string A string
- *
- * @return string The uppercased string
- */
- function twig_upper_filter(Twig_Environment $env, $string)
- {
- if (null !== $charset = $env->getCharset()) {
- return mb_strtoupper($string, $charset);
- }
-
- return strtoupper($string);
- }
-
- /**
- * Converts a string to lowercase.
- *
- * @param Twig_Environment $env
- * @param string $string A string
- *
- * @return string The lowercased string
- */
- function twig_lower_filter(Twig_Environment $env, $string)
- {
- if (null !== $charset = $env->getCharset()) {
- return mb_strtolower($string, $charset);
- }
-
- return strtolower($string);
- }
-
- /**
- * Returns a titlecased string.
- *
- * @param Twig_Environment $env
- * @param string $string A string
- *
- * @return string The titlecased string
- */
- function twig_title_string_filter(Twig_Environment $env, $string)
- {
- if (null !== $charset = $env->getCharset()) {
- return mb_convert_case($string, MB_CASE_TITLE, $charset);
- }
-
- return ucwords(strtolower($string));
- }
-
- /**
- * Returns a capitalized string.
- *
- * @param Twig_Environment $env
- * @param string $string A string
- *
- * @return string The capitalized string
- */
- function twig_capitalize_string_filter(Twig_Environment $env, $string)
- {
- if (null !== $charset = $env->getCharset()) {
- return mb_strtoupper(mb_substr($string, 0, 1, $charset), $charset).mb_strtolower(mb_substr($string, 1, mb_strlen($string, $charset), $charset), $charset);
- }
-
- return ucfirst(strtolower($string));
- }
-}
-// and byte fallback
-else {
- /**
- * Returns the length of a variable.
- *
- * @param Twig_Environment $env
- * @param mixed $thing A variable
- *
- * @return int The length of the value
- */
- function twig_length_filter(Twig_Environment $env, $thing)
- {
- if (null === $thing) {
- return 0;
- }
-
- if (is_scalar($thing)) {
- return strlen($thing);
- }
-
- if ($thing instanceof \SimpleXMLElement) {
- return count($thing);
- }
-
- if (is_object($thing) && method_exists($thing, '__toString') && !$thing instanceof \Countable) {
- return strlen((string) $thing);
- }
-
- if ($thing instanceof \Countable || is_array($thing)) {
- return count($thing);
- }
-
- if ($thing instanceof \IteratorAggregate) {
- return iterator_count($thing);
- }
-
- return 1;
- }
-
- /**
- * Returns a titlecased string.
- *
- * @param Twig_Environment $env
- * @param string $string A string
- *
- * @return string The titlecased string
- */
- function twig_title_string_filter(Twig_Environment $env, $string)
- {
- return ucwords(strtolower($string));
- }
-
- /**
- * Returns a capitalized string.
- *
- * @param Twig_Environment $env
- * @param string $string A string
- *
- * @return string The capitalized string
- */
- function twig_capitalize_string_filter(Twig_Environment $env, $string)
- {
- return ucfirst(strtolower($string));
- }
-}
-
-/**
- * @internal
- */
-function twig_ensure_traversable($seq)
-{
- if ($seq instanceof Traversable || is_array($seq)) {
- return $seq;
- }
-
- return array();
-}
-
-/**
- * Checks if a variable is empty.
- *
- *
- * {# evaluates to true if the foo variable is null, false, or the empty string #}
- * {% if foo is empty %}
- * {# ... #}
- * {% endif %}
- *
- *
- * @param mixed $value A variable
- *
- * @return bool true if the value is empty, false otherwise
- */
-function twig_test_empty($value)
-{
- if ($value instanceof Countable) {
- return 0 == count($value);
- }
-
- if (is_object($value) && method_exists($value, '__toString')) {
- return '' === (string) $value;
- }
-
- return '' === $value || false === $value || null === $value || array() === $value;
-}
-
-/**
- * Checks if a variable is traversable.
- *
- *
- * {# evaluates to true if the foo variable is an array or a traversable object #}
- * {% if foo is iterable %}
- * {# ... #}
- * {% endif %}
- *
- *
- * @param mixed $value A variable
- *
- * @return bool true if the value is traversable
- */
-function twig_test_iterable($value)
-{
- return $value instanceof Traversable || is_array($value);
-}
-
-/**
- * Renders a template.
- *
- * @param Twig_Environment $env
- * @param array $context
- * @param string|array $template The template to render or an array of templates to try consecutively
- * @param array $variables The variables to pass to the template
- * @param bool $withContext
- * @param bool $ignoreMissing Whether to ignore missing templates or not
- * @param bool $sandboxed Whether to sandbox the template or not
- *
- * @return string The rendered template
- */
-function twig_include(Twig_Environment $env, $context, $template, $variables = array(), $withContext = true, $ignoreMissing = false, $sandboxed = false)
-{
- $alreadySandboxed = false;
- $sandbox = null;
- if ($withContext) {
- $variables = array_merge($context, $variables);
- }
-
- if ($isSandboxed = $sandboxed && $env->hasExtension('Twig_Extension_Sandbox')) {
- $sandbox = $env->getExtension('Twig_Extension_Sandbox');
- if (!$alreadySandboxed = $sandbox->isSandboxed()) {
- $sandbox->enableSandbox();
- }
- }
-
- $result = null;
- try {
- $result = $env->resolveTemplate($template)->render($variables);
- } catch (Twig_Error_Loader $e) {
- if (!$ignoreMissing) {
- if ($isSandboxed && !$alreadySandboxed) {
- $sandbox->disableSandbox();
- }
-
- throw $e;
- }
- } catch (Throwable $e) {
- if ($isSandboxed && !$alreadySandboxed) {
- $sandbox->disableSandbox();
- }
-
- throw $e;
- } catch (Exception $e) {
- if ($isSandboxed && !$alreadySandboxed) {
- $sandbox->disableSandbox();
- }
-
- throw $e;
- }
-
- if ($isSandboxed && !$alreadySandboxed) {
- $sandbox->disableSandbox();
- }
-
- return $result;
-}
-
-/**
- * Returns a template content without rendering it.
- *
- * @param Twig_Environment $env
- * @param string $name The template name
- * @param bool $ignoreMissing Whether to ignore missing templates or not
- *
- * @return string The template source
- */
-function twig_source(Twig_Environment $env, $name, $ignoreMissing = false)
-{
- $loader = $env->getLoader();
- try {
- if (!$loader instanceof Twig_SourceContextLoaderInterface) {
- return $loader->getSource($name);
- } else {
- return $loader->getSourceContext($name)->getCode();
- }
- } catch (Twig_Error_Loader $e) {
- if (!$ignoreMissing) {
- throw $e;
- }
- }
-}
-
-/**
- * Provides the ability to get constants from instances as well as class/global constants.
- *
- * @param string $constant The name of the constant
- * @param null|object $object The object to get the constant from
- *
- * @return string
- */
-function twig_constant($constant, $object = null)
-{
- if (null !== $object) {
- $constant = get_class($object).'::'.$constant;
- }
-
- return constant($constant);
-}
-
-/**
- * Checks if a constant exists.
- *
- * @param string $constant The name of the constant
- * @param null|object $object The object to get the constant from
- *
- * @return bool
- */
-function twig_constant_is_defined($constant, $object = null)
-{
- if (null !== $object) {
- $constant = get_class($object).'::'.$constant;
- }
-
- return defined($constant);
-}
-
-/**
- * Batches item.
- *
- * @param array $items An array of items
- * @param int $size The size of the batch
- * @param mixed $fill A value used to fill missing items
- *
- * @return array
- */
-function twig_array_batch($items, $size, $fill = null)
-{
- if ($items instanceof Traversable) {
- $items = iterator_to_array($items, false);
- }
-
- $size = ceil($size);
-
- $result = array_chunk($items, $size, true);
-
- if (null !== $fill && !empty($result)) {
- $last = count($result) - 1;
- if ($fillCount = $size - count($result[$last])) {
- $result[$last] = array_merge(
- $result[$last],
- array_fill(0, $fillCount, $fill)
- );
- }
- }
-
- return $result;
-}
-
-class_alias('Twig_Extension_Core', 'Twig\Extension\CoreExtension', false);
diff --git a/inc/lib/Twig/Extension/Debug.php b/inc/lib/Twig/Extension/Debug.php
deleted file mode 100644
index d0cd1962..00000000
--- a/inc/lib/Twig/Extension/Debug.php
+++ /dev/null
@@ -1,67 +0,0 @@
- $isDumpOutputHtmlSafe ? array('html') : array(), 'needs_context' => true, 'needs_environment' => true)),
- );
- }
-
- public function getName()
- {
- return 'debug';
- }
-}
-
-function twig_var_dump(Twig_Environment $env, $context)
-{
- if (!$env->isDebug()) {
- return;
- }
-
- ob_start();
-
- $count = func_num_args();
- if (2 === $count) {
- $vars = array();
- foreach ($context as $key => $value) {
- if (!$value instanceof Twig_Template) {
- $vars[$key] = $value;
- }
- }
-
- var_dump($vars);
- } else {
- for ($i = 2; $i < $count; ++$i) {
- var_dump(func_get_arg($i));
- }
- }
-
- return ob_get_clean();
-}
-
-class_alias('Twig_Extension_Debug', 'Twig\Extension\DebugExtension', false);
diff --git a/inc/lib/Twig/Extension/Escaper.php b/inc/lib/Twig/Extension/Escaper.php
deleted file mode 100644
index 46c2d84b..00000000
--- a/inc/lib/Twig/Extension/Escaper.php
+++ /dev/null
@@ -1,112 +0,0 @@
-setDefaultStrategy($defaultStrategy);
- }
-
- public function getTokenParsers()
- {
- return array(new Twig_TokenParser_AutoEscape());
- }
-
- public function getNodeVisitors()
- {
- return array(new Twig_NodeVisitor_Escaper());
- }
-
- public function getFilters()
- {
- return array(
- new Twig_SimpleFilter('raw', 'twig_raw_filter', array('is_safe' => array('all'))),
- );
- }
-
- /**
- * Sets the default strategy to use when not defined by the user.
- *
- * The strategy can be a valid PHP callback that takes the template
- * name as an argument and returns the strategy to use.
- *
- * @param string|false|callable $defaultStrategy An escaping strategy
- */
- public function setDefaultStrategy($defaultStrategy)
- {
- // for BC
- if (true === $defaultStrategy) {
- @trigger_error('Using "true" as the default strategy is deprecated since version 1.21. Use "html" instead.', E_USER_DEPRECATED);
-
- $defaultStrategy = 'html';
- }
-
- if ('filename' === $defaultStrategy) {
- @trigger_error('Using "filename" as the default strategy is deprecated since version 1.27. Use "name" instead.', E_USER_DEPRECATED);
-
- $defaultStrategy = 'name';
- }
-
- if ('name' === $defaultStrategy) {
- $defaultStrategy = array('Twig_FileExtensionEscapingStrategy', 'guess');
- }
-
- $this->defaultStrategy = $defaultStrategy;
- }
-
- /**
- * Gets the default strategy to use when not defined by the user.
- *
- * @param string $name The template name
- *
- * @return string|false The default strategy to use for the template
- */
- public function getDefaultStrategy($name)
- {
- // disable string callables to avoid calling a function named html or js,
- // or any other upcoming escaping strategy
- if (!is_string($this->defaultStrategy) && false !== $this->defaultStrategy) {
- return call_user_func($this->defaultStrategy, $name);
- }
-
- return $this->defaultStrategy;
- }
-
- public function getName()
- {
- return 'escaper';
- }
-}
-
-/**
- * Marks a variable as being safe.
- *
- * @param string $string A PHP variable
- *
- * @return string
- */
-function twig_raw_filter($string)
-{
- return $string;
-}
-
-class_alias('Twig_Extension_Escaper', 'Twig\Extension\EscaperExtension', false);
diff --git a/inc/lib/Twig/Extension/GlobalsInterface.php b/inc/lib/Twig/Extension/GlobalsInterface.php
deleted file mode 100644
index 922cd2c9..00000000
--- a/inc/lib/Twig/Extension/GlobalsInterface.php
+++ /dev/null
@@ -1,24 +0,0 @@
-
- */
-interface Twig_Extension_GlobalsInterface
-{
-}
-
-class_alias('Twig_Extension_GlobalsInterface', 'Twig\Extension\GlobalsInterface', false);
diff --git a/inc/lib/Twig/Extension/InitRuntimeInterface.php b/inc/lib/Twig/Extension/InitRuntimeInterface.php
deleted file mode 100644
index 1549862f..00000000
--- a/inc/lib/Twig/Extension/InitRuntimeInterface.php
+++ /dev/null
@@ -1,24 +0,0 @@
-
- */
-interface Twig_Extension_InitRuntimeInterface
-{
-}
-
-class_alias('Twig_Extension_InitRuntimeInterface', 'Twig\Extension\InitRuntimeInterface', false);
diff --git a/inc/lib/Twig/Extension/Optimizer.php b/inc/lib/Twig/Extension/Optimizer.php
deleted file mode 100644
index 6c62e3ef..00000000
--- a/inc/lib/Twig/Extension/Optimizer.php
+++ /dev/null
@@ -1,35 +0,0 @@
-optimizers = $optimizers;
- }
-
- public function getNodeVisitors()
- {
- return array(new Twig_NodeVisitor_Optimizer($this->optimizers));
- }
-
- public function getName()
- {
- return 'optimizer';
- }
-}
-
-class_alias('Twig_Extension_Optimizer', 'Twig\Extension\OptimizerExtension', false);
diff --git a/inc/lib/Twig/Extension/Profiler.php b/inc/lib/Twig/Extension/Profiler.php
deleted file mode 100644
index fcfc002b..00000000
--- a/inc/lib/Twig/Extension/Profiler.php
+++ /dev/null
@@ -1,49 +0,0 @@
-actives[] = $profile;
- }
-
- public function enter(Twig_Profiler_Profile $profile)
- {
- $this->actives[0]->addProfile($profile);
- array_unshift($this->actives, $profile);
- }
-
- public function leave(Twig_Profiler_Profile $profile)
- {
- $profile->leave();
- array_shift($this->actives);
-
- if (1 === count($this->actives)) {
- $this->actives[0]->leave();
- }
- }
-
- public function getNodeVisitors()
- {
- return array(new Twig_Profiler_NodeVisitor_Profiler(get_class($this)));
- }
-
- public function getName()
- {
- return 'profiler';
- }
-}
-
-class_alias('Twig_Extension_Profiler', 'Twig\Extension\ProfilerExtension', false);
-class_exists('Twig_Profiler_Profile');
diff --git a/inc/lib/Twig/Extension/Sandbox.php b/inc/lib/Twig/Extension/Sandbox.php
deleted file mode 100644
index 5cb80a71..00000000
--- a/inc/lib/Twig/Extension/Sandbox.php
+++ /dev/null
@@ -1,103 +0,0 @@
-policy = $policy;
- $this->sandboxedGlobally = $sandboxed;
- }
-
- public function getTokenParsers()
- {
- return array(new Twig_TokenParser_Sandbox());
- }
-
- public function getNodeVisitors()
- {
- return array(new Twig_NodeVisitor_Sandbox());
- }
-
- public function enableSandbox()
- {
- $this->sandboxed = true;
- }
-
- public function disableSandbox()
- {
- $this->sandboxed = false;
- }
-
- public function isSandboxed()
- {
- return $this->sandboxedGlobally || $this->sandboxed;
- }
-
- public function isSandboxedGlobally()
- {
- return $this->sandboxedGlobally;
- }
-
- public function setSecurityPolicy(Twig_Sandbox_SecurityPolicyInterface $policy)
- {
- $this->policy = $policy;
- }
-
- public function getSecurityPolicy()
- {
- return $this->policy;
- }
-
- public function checkSecurity($tags, $filters, $functions)
- {
- if ($this->isSandboxed()) {
- $this->policy->checkSecurity($tags, $filters, $functions);
- }
- }
-
- public function checkMethodAllowed($obj, $method)
- {
- if ($this->isSandboxed()) {
- $this->policy->checkMethodAllowed($obj, $method);
- }
- }
-
- public function checkPropertyAllowed($obj, $method)
- {
- if ($this->isSandboxed()) {
- $this->policy->checkPropertyAllowed($obj, $method);
- }
- }
-
- public function ensureToStringAllowed($obj)
- {
- if ($this->isSandboxed() && is_object($obj)) {
- $this->policy->checkMethodAllowed($obj, '__toString');
- }
-
- return $obj;
- }
-
- public function getName()
- {
- return 'sandbox';
- }
-}
-
-class_alias('Twig_Extension_Sandbox', 'Twig\Extension\SandboxExtension', false);
diff --git a/inc/lib/Twig/Extension/Staging.php b/inc/lib/Twig/Extension/Staging.php
deleted file mode 100644
index d3a0f9c9..00000000
--- a/inc/lib/Twig/Extension/Staging.php
+++ /dev/null
@@ -1,112 +0,0 @@
-
- *
- * @internal
- */
-class Twig_Extension_Staging extends Twig_Extension
-{
- protected $functions = array();
- protected $filters = array();
- protected $visitors = array();
- protected $tokenParsers = array();
- protected $globals = array();
- protected $tests = array();
-
- public function addFunction($name, $function)
- {
- if (isset($this->functions[$name])) {
- @trigger_error(sprintf('Overriding function "%s" that is already registered is deprecated since version 1.30 and won\'t be possible anymore in 2.0.', $name), E_USER_DEPRECATED);
- }
-
- $this->functions[$name] = $function;
- }
-
- public function getFunctions()
- {
- return $this->functions;
- }
-
- public function addFilter($name, $filter)
- {
- if (isset($this->filters[$name])) {
- @trigger_error(sprintf('Overriding filter "%s" that is already registered is deprecated since version 1.30 and won\'t be possible anymore in 2.0.', $name), E_USER_DEPRECATED);
- }
-
- $this->filters[$name] = $filter;
- }
-
- public function getFilters()
- {
- return $this->filters;
- }
-
- public function addNodeVisitor(Twig_NodeVisitorInterface $visitor)
- {
- $this->visitors[] = $visitor;
- }
-
- public function getNodeVisitors()
- {
- return $this->visitors;
- }
-
- public function addTokenParser(Twig_TokenParserInterface $parser)
- {
- if (isset($this->tokenParsers[$parser->getTag()])) {
- @trigger_error(sprintf('Overriding tag "%s" that is already registered is deprecated since version 1.30 and won\'t be possible anymore in 2.0.', $parser->getTag()), E_USER_DEPRECATED);
- }
-
- $this->tokenParsers[$parser->getTag()] = $parser;
- }
-
- public function getTokenParsers()
- {
- return $this->tokenParsers;
- }
-
- public function addGlobal($name, $value)
- {
- $this->globals[$name] = $value;
- }
-
- public function getGlobals()
- {
- return $this->globals;
- }
-
- public function addTest($name, $test)
- {
- if (isset($this->tests[$name])) {
- @trigger_error(sprintf('Overriding test "%s" that is already registered is deprecated since version 1.30 and won\'t be possible anymore in 2.0.', $name), E_USER_DEPRECATED);
- }
-
- $this->tests[$name] = $test;
- }
-
- public function getTests()
- {
- return $this->tests;
- }
-
- public function getName()
- {
- return 'staging';
- }
-}
-
-class_alias('Twig_Extension_Staging', 'Twig\Extension\StagingExtension', false);
diff --git a/inc/lib/Twig/Extension/StringLoader.php b/inc/lib/Twig/Extension/StringLoader.php
deleted file mode 100644
index 2ce3c992..00000000
--- a/inc/lib/Twig/Extension/StringLoader.php
+++ /dev/null
@@ -1,47 +0,0 @@
- true)),
- );
- }
-
- public function getName()
- {
- return 'string_loader';
- }
-}
-
-/**
- * Loads a template from a string.
- *
- *
- * {{ include(template_from_string("Hello {{ name }}")) }}
- *
- *
- * @param Twig_Environment $env A Twig_Environment instance
- * @param string $template A template as a string or object implementing __toString()
- *
- * @return Twig_Template
- */
-function twig_template_from_string(Twig_Environment $env, $template)
-{
- return $env->createTemplate((string) $template);
-}
-
-class_alias('Twig_Extension_StringLoader', 'Twig\Extension\StringLoaderExtension', false);
diff --git a/inc/lib/Twig/ExtensionInterface.php b/inc/lib/Twig/ExtensionInterface.php
deleted file mode 100644
index 946df500..00000000
--- a/inc/lib/Twig/ExtensionInterface.php
+++ /dev/null
@@ -1,90 +0,0 @@
-
- */
-interface Twig_ExtensionInterface
-{
- /**
- * Initializes the runtime environment.
- *
- * This is where you can load some file that contains filter functions for instance.
- *
- * @deprecated since 1.23 (to be removed in 2.0), implement Twig_Extension_InitRuntimeInterface instead
- */
- public function initRuntime(Twig_Environment $environment);
-
- /**
- * Returns the token parser instances to add to the existing list.
- *
- * @return Twig_TokenParserInterface[]
- */
- public function getTokenParsers();
-
- /**
- * Returns the node visitor instances to add to the existing list.
- *
- * @return Twig_NodeVisitorInterface[]
- */
- public function getNodeVisitors();
-
- /**
- * Returns a list of filters to add to the existing list.
- *
- * @return Twig_SimpleFilter[]
- */
- public function getFilters();
-
- /**
- * Returns a list of tests to add to the existing list.
- *
- * @return Twig_SimpleTest[]
- */
- public function getTests();
-
- /**
- * Returns a list of functions to add to the existing list.
- *
- * @return Twig_SimpleFunction[]
- */
- public function getFunctions();
-
- /**
- * Returns a list of operators to add to the existing list.
- *
- * @return array First array of unary operators, second array of binary operators
- */
- public function getOperators();
-
- /**
- * Returns a list of global variables to add to the existing list.
- *
- * @return array An array of global variables
- *
- * @deprecated since 1.23 (to be removed in 2.0), implement Twig_Extension_GlobalsInterface instead
- */
- public function getGlobals();
-
- /**
- * Returns the name of the extension.
- *
- * @return string The extension name
- *
- * @deprecated since 1.26 (to be removed in 2.0), not used anymore internally
- */
- public function getName();
-}
-
-class_alias('Twig_ExtensionInterface', 'Twig\Extension\ExtensionInterface', false);
-class_exists('Twig_Environment');
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/lib/Twig/FactoryRuntimeLoader.php b/inc/lib/Twig/FactoryRuntimeLoader.php
deleted file mode 100644
index 2cdaded1..00000000
--- a/inc/lib/Twig/FactoryRuntimeLoader.php
+++ /dev/null
@@ -1,39 +0,0 @@
-
- */
-class Twig_FactoryRuntimeLoader implements Twig_RuntimeLoaderInterface
-{
- private $map;
-
- /**
- * @param array $map An array where keys are class names and values factory callables
- */
- public function __construct($map = array())
- {
- $this->map = $map;
- }
-
- public function load($class)
- {
- if (isset($this->map[$class])) {
- $runtimeFactory = $this->map[$class];
-
- return $runtimeFactory();
- }
- }
-}
-
-class_alias('Twig_FactoryRuntimeLoader', 'Twig\RuntimeLoader\FactoryRuntimeLoader', false);
diff --git a/inc/lib/Twig/FileExtensionEscapingStrategy.php b/inc/lib/Twig/FileExtensionEscapingStrategy.php
deleted file mode 100644
index 8f8cd2ee..00000000
--- a/inc/lib/Twig/FileExtensionEscapingStrategy.php
+++ /dev/null
@@ -1,60 +0,0 @@
-
- */
-class Twig_FileExtensionEscapingStrategy
-{
- /**
- * Guesses the best autoescaping strategy based on the file name.
- *
- * @param string $name The template name
- *
- * @return string|false The escaping strategy name to use or false to disable
- */
- public static function guess($name)
- {
- if (in_array(substr($name, -1), array('/', '\\'))) {
- return 'html'; // return html for directories
- }
-
- if ('.twig' === substr($name, -5)) {
- $name = substr($name, 0, -5);
- }
-
- $extension = pathinfo($name, PATHINFO_EXTENSION);
-
- switch ($extension) {
- case 'js':
- return 'js';
-
- case 'css':
- return 'css';
-
- case 'txt':
- return false;
-
- default:
- return 'html';
- }
- }
-}
-
-class_alias('Twig_FileExtensionEscapingStrategy', 'Twig\FileExtensionEscapingStrategy', false);
diff --git a/inc/lib/Twig/Filter.php b/inc/lib/Twig/Filter.php
deleted file mode 100644
index 893d75d1..00000000
--- a/inc/lib/Twig/Filter.php
+++ /dev/null
@@ -1,84 +0,0 @@
-
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-abstract class Twig_Filter implements Twig_FilterInterface, Twig_FilterCallableInterface
-{
- protected $options;
- protected $arguments = array();
-
- public function __construct(array $options = array())
- {
- $this->options = array_merge(array(
- 'needs_environment' => false,
- 'needs_context' => false,
- 'pre_escape' => null,
- 'preserves_safety' => null,
- 'callable' => null,
- ), $options);
- }
-
- public function setArguments($arguments)
- {
- $this->arguments = $arguments;
- }
-
- public function getArguments()
- {
- return $this->arguments;
- }
-
- public function needsEnvironment()
- {
- return $this->options['needs_environment'];
- }
-
- public function needsContext()
- {
- return $this->options['needs_context'];
- }
-
- public function getSafe(Twig_Node $filterArgs)
- {
- if (isset($this->options['is_safe'])) {
- return $this->options['is_safe'];
- }
-
- if (isset($this->options['is_safe_callback'])) {
- return call_user_func($this->options['is_safe_callback'], $filterArgs);
- }
- }
-
- public function getPreservesSafety()
- {
- return $this->options['preserves_safety'];
- }
-
- public function getPreEscape()
- {
- return $this->options['pre_escape'];
- }
-
- public function getCallable()
- {
- return $this->options['callable'];
- }
-}
diff --git a/inc/lib/Twig/Filter/Function.php b/inc/lib/Twig/Filter/Function.php
deleted file mode 100644
index 71b16554..00000000
--- a/inc/lib/Twig/Filter/Function.php
+++ /dev/null
@@ -1,40 +0,0 @@
-
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-class Twig_Filter_Function extends Twig_Filter
-{
- protected $function;
-
- public function __construct($function, array $options = array())
- {
- $options['callable'] = $function;
-
- parent::__construct($options);
-
- $this->function = $function;
- }
-
- public function compile()
- {
- return $this->function;
- }
-}
diff --git a/inc/lib/Twig/Filter/Method.php b/inc/lib/Twig/Filter/Method.php
deleted file mode 100644
index 1b75676c..00000000
--- a/inc/lib/Twig/Filter/Method.php
+++ /dev/null
@@ -1,42 +0,0 @@
-
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-class Twig_Filter_Method extends Twig_Filter
-{
- protected $extension;
- protected $method;
-
- public function __construct(Twig_ExtensionInterface $extension, $method, array $options = array())
- {
- $options['callable'] = array($extension, $method);
-
- parent::__construct($options);
-
- $this->extension = $extension;
- $this->method = $method;
- }
-
- public function compile()
- {
- return sprintf('$this->env->getExtension(\'%s\')->%s', get_class($this->extension), $this->method);
- }
-}
diff --git a/inc/lib/Twig/Filter/Node.php b/inc/lib/Twig/Filter/Node.php
deleted file mode 100644
index 3e6b12ef..00000000
--- a/inc/lib/Twig/Filter/Node.php
+++ /dev/null
@@ -1,42 +0,0 @@
-
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-class Twig_Filter_Node extends Twig_Filter
-{
- protected $class;
-
- public function __construct($class, array $options = array())
- {
- parent::__construct($options);
-
- $this->class = $class;
- }
-
- public function getClass()
- {
- return $this->class;
- }
-
- public function compile()
- {
- }
-}
diff --git a/inc/lib/Twig/FilterCallableInterface.php b/inc/lib/Twig/FilterCallableInterface.php
deleted file mode 100644
index 21b028c4..00000000
--- a/inc/lib/Twig/FilterCallableInterface.php
+++ /dev/null
@@ -1,24 +0,0 @@
-
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-interface Twig_FilterCallableInterface
-{
- public function getCallable();
-}
diff --git a/inc/lib/Twig/FilterInterface.php b/inc/lib/Twig/FilterInterface.php
deleted file mode 100644
index 9d7e9ab6..00000000
--- a/inc/lib/Twig/FilterInterface.php
+++ /dev/null
@@ -1,43 +0,0 @@
-
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-interface Twig_FilterInterface
-{
- /**
- * Compiles a filter.
- *
- * @return string The PHP code for the filter
- */
- public function compile();
-
- public function needsEnvironment();
-
- public function needsContext();
-
- public function getSafe(Twig_Node $filterArgs);
-
- public function getPreservesSafety();
-
- public function getPreEscape();
-
- public function setArguments($arguments);
-
- public function getArguments();
-}
diff --git a/inc/lib/Twig/Function.php b/inc/lib/Twig/Function.php
deleted file mode 100644
index 9dc16e90..00000000
--- a/inc/lib/Twig/Function.php
+++ /dev/null
@@ -1,74 +0,0 @@
-
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-abstract class Twig_Function implements Twig_FunctionInterface, Twig_FunctionCallableInterface
-{
- protected $options;
- protected $arguments = array();
-
- public function __construct(array $options = array())
- {
- $this->options = array_merge(array(
- 'needs_environment' => false,
- 'needs_context' => false,
- 'callable' => null,
- ), $options);
- }
-
- public function setArguments($arguments)
- {
- $this->arguments = $arguments;
- }
-
- public function getArguments()
- {
- return $this->arguments;
- }
-
- public function needsEnvironment()
- {
- return $this->options['needs_environment'];
- }
-
- public function needsContext()
- {
- return $this->options['needs_context'];
- }
-
- public function getSafe(Twig_Node $functionArgs)
- {
- if (isset($this->options['is_safe'])) {
- return $this->options['is_safe'];
- }
-
- if (isset($this->options['is_safe_callback'])) {
- return call_user_func($this->options['is_safe_callback'], $functionArgs);
- }
-
- return array();
- }
-
- public function getCallable()
- {
- return $this->options['callable'];
- }
-}
diff --git a/inc/lib/Twig/Function/Function.php b/inc/lib/Twig/Function/Function.php
deleted file mode 100644
index 97c0eb77..00000000
--- a/inc/lib/Twig/Function/Function.php
+++ /dev/null
@@ -1,41 +0,0 @@
-
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-class Twig_Function_Function extends Twig_Function
-{
- protected $function;
-
- public function __construct($function, array $options = array())
- {
- $options['callable'] = $function;
-
- parent::__construct($options);
-
- $this->function = $function;
- }
-
- public function compile()
- {
- return $this->function;
- }
-}
diff --git a/inc/lib/Twig/Function/Method.php b/inc/lib/Twig/Function/Method.php
deleted file mode 100644
index 4299e118..00000000
--- a/inc/lib/Twig/Function/Method.php
+++ /dev/null
@@ -1,43 +0,0 @@
-
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-class Twig_Function_Method extends Twig_Function
-{
- protected $extension;
- protected $method;
-
- public function __construct(Twig_ExtensionInterface $extension, $method, array $options = array())
- {
- $options['callable'] = array($extension, $method);
-
- parent::__construct($options);
-
- $this->extension = $extension;
- $this->method = $method;
- }
-
- public function compile()
- {
- return sprintf('$this->env->getExtension(\'%s\')->%s', get_class($this->extension), $this->method);
- }
-}
diff --git a/inc/lib/Twig/Function/Node.php b/inc/lib/Twig/Function/Node.php
deleted file mode 100644
index 0adc5d93..00000000
--- a/inc/lib/Twig/Function/Node.php
+++ /dev/null
@@ -1,42 +0,0 @@
-
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-class Twig_Function_Node extends Twig_Function
-{
- protected $class;
-
- public function __construct($class, array $options = array())
- {
- parent::__construct($options);
-
- $this->class = $class;
- }
-
- public function getClass()
- {
- return $this->class;
- }
-
- public function compile()
- {
- }
-}
diff --git a/inc/lib/Twig/FunctionCallableInterface.php b/inc/lib/Twig/FunctionCallableInterface.php
deleted file mode 100644
index d23d6917..00000000
--- a/inc/lib/Twig/FunctionCallableInterface.php
+++ /dev/null
@@ -1,24 +0,0 @@
-
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-interface Twig_FunctionCallableInterface
-{
- public function getCallable();
-}
diff --git a/inc/lib/Twig/FunctionInterface.php b/inc/lib/Twig/FunctionInterface.php
deleted file mode 100644
index 00d4f95c..00000000
--- a/inc/lib/Twig/FunctionInterface.php
+++ /dev/null
@@ -1,40 +0,0 @@
-
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-interface Twig_FunctionInterface
-{
- /**
- * Compiles a function.
- *
- * @return string The PHP code for the function
- */
- public function compile();
-
- public function needsEnvironment();
-
- public function needsContext();
-
- public function getSafe(Twig_Node $filterArgs);
-
- public function setArguments($arguments);
-
- public function getArguments();
-}
diff --git a/inc/lib/Twig/Lexer.php b/inc/lib/Twig/Lexer.php
deleted file mode 100644
index 41211eb2..00000000
--- a/inc/lib/Twig/Lexer.php
+++ /dev/null
@@ -1,427 +0,0 @@
-
- */
-class Twig_Lexer implements Twig_LexerInterface
-{
- protected $tokens;
- protected $code;
- protected $cursor;
- protected $lineno;
- protected $end;
- protected $state;
- protected $states;
- protected $brackets;
- protected $env;
- // to be renamed to $name in 2.0 (where it is private)
- protected $filename;
- protected $options;
- protected $regexes;
- protected $position;
- protected $positions;
- protected $currentVarBlockLine;
-
- private $source;
-
- const STATE_DATA = 0;
- const STATE_BLOCK = 1;
- const STATE_VAR = 2;
- const STATE_STRING = 3;
- const STATE_INTERPOLATION = 4;
-
- const REGEX_NAME = '/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/A';
- const REGEX_NUMBER = '/[0-9]+(?:\.[0-9]+)?/A';
- const REGEX_STRING = '/"([^#"\\\\]*(?:\\\\.[^#"\\\\]*)*)"|\'([^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\'/As';
- const REGEX_DQ_STRING_DELIM = '/"/A';
- const REGEX_DQ_STRING_PART = '/[^#"\\\\]*(?:(?:\\\\.|#(?!\{))[^#"\\\\]*)*/As';
- const PUNCTUATION = '()[]{}?:.,|';
-
- public function __construct(Twig_Environment $env, array $options = array())
- {
- $this->env = $env;
-
- $this->options = array_merge(array(
- 'tag_comment' => array('{#', '#}'),
- 'tag_block' => array('{%', '%}'),
- 'tag_variable' => array('{{', '}}'),
- 'whitespace_trim' => '-',
- 'interpolation' => array('#{', '}'),
- ), $options);
-
- $this->regexes = array(
- 'lex_var' => '/\s*'.preg_quote($this->options['whitespace_trim'].$this->options['tag_variable'][1], '/').'\s*|\s*'.preg_quote($this->options['tag_variable'][1], '/').'/A',
- 'lex_block' => '/\s*(?:'.preg_quote($this->options['whitespace_trim'].$this->options['tag_block'][1], '/').'\s*|\s*'.preg_quote($this->options['tag_block'][1], '/').')\n?/A',
- 'lex_raw_data' => '/('.preg_quote($this->options['tag_block'][0].$this->options['whitespace_trim'], '/').'|'.preg_quote($this->options['tag_block'][0], '/').')\s*(?:end%s)\s*(?:'.preg_quote($this->options['whitespace_trim'].$this->options['tag_block'][1], '/').'\s*|\s*'.preg_quote($this->options['tag_block'][1], '/').')/s',
- 'operator' => $this->getOperatorRegex(),
- 'lex_comment' => '/(?:'.preg_quote($this->options['whitespace_trim'], '/').preg_quote($this->options['tag_comment'][1], '/').'\s*|'.preg_quote($this->options['tag_comment'][1], '/').')\n?/s',
- 'lex_block_raw' => '/\s*(raw|verbatim)\s*(?:'.preg_quote($this->options['whitespace_trim'].$this->options['tag_block'][1], '/').'\s*|\s*'.preg_quote($this->options['tag_block'][1], '/').')/As',
- 'lex_block_line' => '/\s*line\s+(\d+)\s*'.preg_quote($this->options['tag_block'][1], '/').'/As',
- 'lex_tokens_start' => '/('.preg_quote($this->options['tag_variable'][0], '/').'|'.preg_quote($this->options['tag_block'][0], '/').'|'.preg_quote($this->options['tag_comment'][0], '/').')('.preg_quote($this->options['whitespace_trim'], '/').')?/s',
- 'interpolation_start' => '/'.preg_quote($this->options['interpolation'][0], '/').'\s*/A',
- 'interpolation_end' => '/\s*'.preg_quote($this->options['interpolation'][1], '/').'/A',
- );
- }
-
- public function tokenize($code, $name = null)
- {
- if (!$code instanceof Twig_Source) {
- @trigger_error(sprintf('Passing a string as the $code argument of %s() is deprecated since version 1.27 and will be removed in 2.0. Pass a Twig_Source instance instead.', __METHOD__), E_USER_DEPRECATED);
- $this->source = new Twig_Source($code, $name);
- } else {
- $this->source = $code;
- }
-
- if (((int) ini_get('mbstring.func_overload')) & 2) {
- @trigger_error('Support for having "mbstring.func_overload" different from 0 is deprecated version 1.29 and will be removed in 2.0.', E_USER_DEPRECATED);
- }
-
- if (function_exists('mb_internal_encoding') && ((int) ini_get('mbstring.func_overload')) & 2) {
- $mbEncoding = mb_internal_encoding();
- mb_internal_encoding('ASCII');
- } else {
- $mbEncoding = null;
- }
-
- $this->code = str_replace(array("\r\n", "\r"), "\n", $this->source->getCode());
- $this->filename = $this->source->getName();
- $this->cursor = 0;
- $this->lineno = 1;
- $this->end = strlen($this->code);
- $this->tokens = array();
- $this->state = self::STATE_DATA;
- $this->states = array();
- $this->brackets = array();
- $this->position = -1;
-
- // find all token starts in one go
- preg_match_all($this->regexes['lex_tokens_start'], $this->code, $matches, PREG_OFFSET_CAPTURE);
- $this->positions = $matches;
-
- while ($this->cursor < $this->end) {
- // dispatch to the lexing functions depending
- // on the current state
- switch ($this->state) {
- case self::STATE_DATA:
- $this->lexData();
- break;
-
- case self::STATE_BLOCK:
- $this->lexBlock();
- break;
-
- case self::STATE_VAR:
- $this->lexVar();
- break;
-
- case self::STATE_STRING:
- $this->lexString();
- break;
-
- case self::STATE_INTERPOLATION:
- $this->lexInterpolation();
- break;
- }
- }
-
- $this->pushToken(Twig_Token::EOF_TYPE);
-
- if (!empty($this->brackets)) {
- list($expect, $lineno) = array_pop($this->brackets);
- throw new Twig_Error_Syntax(sprintf('Unclosed "%s".', $expect), $lineno, $this->source);
- }
-
- if ($mbEncoding) {
- mb_internal_encoding($mbEncoding);
- }
-
- return new Twig_TokenStream($this->tokens, $this->source);
- }
-
- protected function lexData()
- {
- // if no matches are left we return the rest of the template as simple text token
- if ($this->position == count($this->positions[0]) - 1) {
- $this->pushToken(Twig_Token::TEXT_TYPE, substr($this->code, $this->cursor));
- $this->cursor = $this->end;
-
- return;
- }
-
- // Find the first token after the current cursor
- $position = $this->positions[0][++$this->position];
- while ($position[1] < $this->cursor) {
- if ($this->position == count($this->positions[0]) - 1) {
- return;
- }
- $position = $this->positions[0][++$this->position];
- }
-
- // push the template text first
- $text = $textContent = substr($this->code, $this->cursor, $position[1] - $this->cursor);
- if (isset($this->positions[2][$this->position][0])) {
- $text = rtrim($text);
- }
- $this->pushToken(Twig_Token::TEXT_TYPE, $text);
- $this->moveCursor($textContent.$position[0]);
-
- switch ($this->positions[1][$this->position][0]) {
- case $this->options['tag_comment'][0]:
- $this->lexComment();
- break;
-
- case $this->options['tag_block'][0]:
- // raw data?
- if (preg_match($this->regexes['lex_block_raw'], $this->code, $match, null, $this->cursor)) {
- $this->moveCursor($match[0]);
- $this->lexRawData($match[1]);
- // {% line \d+ %}
- } elseif (preg_match($this->regexes['lex_block_line'], $this->code, $match, null, $this->cursor)) {
- $this->moveCursor($match[0]);
- $this->lineno = (int) $match[1];
- } else {
- $this->pushToken(Twig_Token::BLOCK_START_TYPE);
- $this->pushState(self::STATE_BLOCK);
- $this->currentVarBlockLine = $this->lineno;
- }
- break;
-
- case $this->options['tag_variable'][0]:
- $this->pushToken(Twig_Token::VAR_START_TYPE);
- $this->pushState(self::STATE_VAR);
- $this->currentVarBlockLine = $this->lineno;
- break;
- }
- }
-
- protected function lexBlock()
- {
- if (empty($this->brackets) && preg_match($this->regexes['lex_block'], $this->code, $match, null, $this->cursor)) {
- $this->pushToken(Twig_Token::BLOCK_END_TYPE);
- $this->moveCursor($match[0]);
- $this->popState();
- } else {
- $this->lexExpression();
- }
- }
-
- protected function lexVar()
- {
- if (empty($this->brackets) && preg_match($this->regexes['lex_var'], $this->code, $match, null, $this->cursor)) {
- $this->pushToken(Twig_Token::VAR_END_TYPE);
- $this->moveCursor($match[0]);
- $this->popState();
- } else {
- $this->lexExpression();
- }
- }
-
- protected function lexExpression()
- {
- // whitespace
- if (preg_match('/\s+/A', $this->code, $match, null, $this->cursor)) {
- $this->moveCursor($match[0]);
-
- if ($this->cursor >= $this->end) {
- throw new Twig_Error_Syntax(sprintf('Unclosed "%s".', self::STATE_BLOCK === $this->state ? 'block' : 'variable'), $this->currentVarBlockLine, $this->source);
- }
- }
-
- // operators
- if (preg_match($this->regexes['operator'], $this->code, $match, null, $this->cursor)) {
- $this->pushToken(Twig_Token::OPERATOR_TYPE, preg_replace('/\s+/', ' ', $match[0]));
- $this->moveCursor($match[0]);
- }
- // names
- elseif (preg_match(self::REGEX_NAME, $this->code, $match, null, $this->cursor)) {
- $this->pushToken(Twig_Token::NAME_TYPE, $match[0]);
- $this->moveCursor($match[0]);
- }
- // numbers
- elseif (preg_match(self::REGEX_NUMBER, $this->code, $match, null, $this->cursor)) {
- $number = (float) $match[0]; // floats
- if (ctype_digit($match[0]) && $number <= PHP_INT_MAX) {
- $number = (int) $match[0]; // integers lower than the maximum
- }
- $this->pushToken(Twig_Token::NUMBER_TYPE, $number);
- $this->moveCursor($match[0]);
- }
- // punctuation
- elseif (false !== strpos(self::PUNCTUATION, $this->code[$this->cursor])) {
- // opening bracket
- if (false !== strpos('([{', $this->code[$this->cursor])) {
- $this->brackets[] = array($this->code[$this->cursor], $this->lineno);
- }
- // closing bracket
- elseif (false !== strpos(')]}', $this->code[$this->cursor])) {
- if (empty($this->brackets)) {
- throw new Twig_Error_Syntax(sprintf('Unexpected "%s".', $this->code[$this->cursor]), $this->lineno, $this->source);
- }
-
- list($expect, $lineno) = array_pop($this->brackets);
- if ($this->code[$this->cursor] != strtr($expect, '([{', ')]}')) {
- throw new Twig_Error_Syntax(sprintf('Unclosed "%s".', $expect), $lineno, $this->source);
- }
- }
-
- $this->pushToken(Twig_Token::PUNCTUATION_TYPE, $this->code[$this->cursor]);
- ++$this->cursor;
- }
- // strings
- elseif (preg_match(self::REGEX_STRING, $this->code, $match, null, $this->cursor)) {
- $this->pushToken(Twig_Token::STRING_TYPE, stripcslashes(substr($match[0], 1, -1)));
- $this->moveCursor($match[0]);
- }
- // opening double quoted string
- elseif (preg_match(self::REGEX_DQ_STRING_DELIM, $this->code, $match, null, $this->cursor)) {
- $this->brackets[] = array('"', $this->lineno);
- $this->pushState(self::STATE_STRING);
- $this->moveCursor($match[0]);
- }
- // unlexable
- else {
- throw new Twig_Error_Syntax(sprintf('Unexpected character "%s".', $this->code[$this->cursor]), $this->lineno, $this->source);
- }
- }
-
- protected function lexRawData($tag)
- {
- if ('raw' === $tag) {
- @trigger_error(sprintf('Twig Tag "raw" is deprecated since version 1.21. Use "verbatim" instead in %s at line %d.', $this->filename, $this->lineno), E_USER_DEPRECATED);
- }
-
- if (!preg_match(str_replace('%s', $tag, $this->regexes['lex_raw_data']), $this->code, $match, PREG_OFFSET_CAPTURE, $this->cursor)) {
- throw new Twig_Error_Syntax(sprintf('Unexpected end of file: Unclosed "%s" block.', $tag), $this->lineno, $this->source);
- }
-
- $text = substr($this->code, $this->cursor, $match[0][1] - $this->cursor);
- $this->moveCursor($text.$match[0][0]);
-
- if (false !== strpos($match[1][0], $this->options['whitespace_trim'])) {
- $text = rtrim($text);
- }
-
- $this->pushToken(Twig_Token::TEXT_TYPE, $text);
- }
-
- protected function lexComment()
- {
- if (!preg_match($this->regexes['lex_comment'], $this->code, $match, PREG_OFFSET_CAPTURE, $this->cursor)) {
- throw new Twig_Error_Syntax('Unclosed comment.', $this->lineno, $this->source);
- }
-
- $this->moveCursor(substr($this->code, $this->cursor, $match[0][1] - $this->cursor).$match[0][0]);
- }
-
- protected function lexString()
- {
- if (preg_match($this->regexes['interpolation_start'], $this->code, $match, null, $this->cursor)) {
- $this->brackets[] = array($this->options['interpolation'][0], $this->lineno);
- $this->pushToken(Twig_Token::INTERPOLATION_START_TYPE);
- $this->moveCursor($match[0]);
- $this->pushState(self::STATE_INTERPOLATION);
- } elseif (preg_match(self::REGEX_DQ_STRING_PART, $this->code, $match, null, $this->cursor) && strlen($match[0]) > 0) {
- $this->pushToken(Twig_Token::STRING_TYPE, stripcslashes($match[0]));
- $this->moveCursor($match[0]);
- } elseif (preg_match(self::REGEX_DQ_STRING_DELIM, $this->code, $match, null, $this->cursor)) {
- list($expect, $lineno) = array_pop($this->brackets);
- if ('"' != $this->code[$this->cursor]) {
- throw new Twig_Error_Syntax(sprintf('Unclosed "%s".', $expect), $lineno, $this->source);
- }
-
- $this->popState();
- ++$this->cursor;
- } else {
- // unlexable
- throw new Twig_Error_Syntax(sprintf('Unexpected character "%s".', $this->code[$this->cursor]), $this->lineno, $this->source);
- }
- }
-
- protected function lexInterpolation()
- {
- $bracket = end($this->brackets);
- if ($this->options['interpolation'][0] === $bracket[0] && preg_match($this->regexes['interpolation_end'], $this->code, $match, null, $this->cursor)) {
- array_pop($this->brackets);
- $this->pushToken(Twig_Token::INTERPOLATION_END_TYPE);
- $this->moveCursor($match[0]);
- $this->popState();
- } else {
- $this->lexExpression();
- }
- }
-
- protected function pushToken($type, $value = '')
- {
- // do not push empty text tokens
- if (Twig_Token::TEXT_TYPE === $type && '' === $value) {
- return;
- }
-
- $this->tokens[] = new Twig_Token($type, $value, $this->lineno);
- }
-
- protected function moveCursor($text)
- {
- $this->cursor += strlen($text);
- $this->lineno += substr_count($text, "\n");
- }
-
- protected function getOperatorRegex()
- {
- $operators = array_merge(
- array('='),
- array_keys($this->env->getUnaryOperators()),
- array_keys($this->env->getBinaryOperators())
- );
-
- $operators = array_combine($operators, array_map('strlen', $operators));
- arsort($operators);
-
- $regex = array();
- foreach ($operators as $operator => $length) {
- // an operator that ends with a character must be followed by
- // a whitespace or a parenthesis
- if (ctype_alpha($operator[$length - 1])) {
- $r = preg_quote($operator, '/').'(?=[\s()])';
- } else {
- $r = preg_quote($operator, '/');
- }
-
- // an operator with a space can be any amount of whitespaces
- $r = preg_replace('/\s+/', '\s+', $r);
-
- $regex[] = $r;
- }
-
- return '/'.implode('|', $regex).'/A';
- }
-
- protected function pushState($state)
- {
- $this->states[] = $this->state;
- $this->state = $state;
- }
-
- protected function popState()
- {
- if (0 === count($this->states)) {
- throw new Exception('Cannot pop state without a previous state.');
- }
-
- $this->state = array_pop($this->states);
- }
-}
-
-class_alias('Twig_Lexer', 'Twig\Lexer', false);
diff --git a/inc/lib/Twig/LexerInterface.php b/inc/lib/Twig/LexerInterface.php
deleted file mode 100644
index c10bbfec..00000000
--- a/inc/lib/Twig/LexerInterface.php
+++ /dev/null
@@ -1,32 +0,0 @@
-
- *
- * @deprecated since 1.12 (to be removed in 3.0)
- */
-interface Twig_LexerInterface
-{
- /**
- * Tokenizes a source code.
- *
- * @param string|Twig_Source $code The source code
- * @param string $name A unique identifier for the source code
- *
- * @return Twig_TokenStream
- *
- * @throws Twig_Error_Syntax When the code is syntactically wrong
- */
- public function tokenize($code, $name = null);
-}
diff --git a/inc/lib/Twig/Loader/Array.php b/inc/lib/Twig/Loader/Array.php
deleted file mode 100644
index 0aac7690..00000000
--- a/inc/lib/Twig/Loader/Array.php
+++ /dev/null
@@ -1,97 +0,0 @@
-
- */
-class Twig_Loader_Array implements Twig_LoaderInterface, Twig_ExistsLoaderInterface, Twig_SourceContextLoaderInterface
-{
- protected $templates = array();
-
- /**
- * @param array $templates An array of templates (keys are the names, and values are the source code)
- */
- public function __construct(array $templates = array())
- {
- $this->templates = $templates;
- }
-
- /**
- * Adds or overrides a template.
- *
- * @param string $name The template name
- * @param string $template The template source
- */
- public function setTemplate($name, $template)
- {
- $this->templates[(string) $name] = $template;
- }
-
- public function getSource($name)
- {
- @trigger_error(sprintf('Calling "getSource" on "%s" is deprecated since 1.27. Use getSourceContext() instead.', get_class($this)), E_USER_DEPRECATED);
-
- $name = (string) $name;
- if (!isset($this->templates[$name])) {
- throw new Twig_Error_Loader(sprintf('Template "%s" is not defined.', $name));
- }
-
- return $this->templates[$name];
- }
-
- public function getSourceContext($name)
- {
- $name = (string) $name;
- if (!isset($this->templates[$name])) {
- throw new Twig_Error_Loader(sprintf('Template "%s" is not defined.', $name));
- }
-
- return new Twig_Source($this->templates[$name], $name);
- }
-
- public function exists($name)
- {
- return isset($this->templates[(string) $name]);
- }
-
- public function getCacheKey($name)
- {
- $name = (string) $name;
- if (!isset($this->templates[$name])) {
- throw new Twig_Error_Loader(sprintf('Template "%s" is not defined.', $name));
- }
-
- return $name.':'.$this->templates[$name];
- }
-
- public function isFresh($name, $time)
- {
- $name = (string) $name;
- if (!isset($this->templates[$name])) {
- throw new Twig_Error_Loader(sprintf('Template "%s" is not defined.', $name));
- }
-
- return true;
- }
-}
-
-class_alias('Twig_Loader_Array', 'Twig\Loader\ArrayLoader', false);
diff --git a/inc/lib/Twig/Loader/Chain.php b/inc/lib/Twig/Loader/Chain.php
deleted file mode 100644
index 59a33796..00000000
--- a/inc/lib/Twig/Loader/Chain.php
+++ /dev/null
@@ -1,151 +0,0 @@
-
- */
-class Twig_Loader_Chain implements Twig_LoaderInterface, Twig_ExistsLoaderInterface, Twig_SourceContextLoaderInterface
-{
- private $hasSourceCache = array();
- protected $loaders = array();
-
- /**
- * @param Twig_LoaderInterface[] $loaders
- */
- public function __construct(array $loaders = array())
- {
- foreach ($loaders as $loader) {
- $this->addLoader($loader);
- }
- }
-
- public function addLoader(Twig_LoaderInterface $loader)
- {
- $this->loaders[] = $loader;
- $this->hasSourceCache = array();
- }
-
- public function getSource($name)
- {
- @trigger_error(sprintf('Calling "getSource" on "%s" is deprecated since 1.27. Use getSourceContext() instead.', get_class($this)), E_USER_DEPRECATED);
-
- $exceptions = array();
- foreach ($this->loaders as $loader) {
- if ($loader instanceof Twig_ExistsLoaderInterface && !$loader->exists($name)) {
- continue;
- }
-
- try {
- return $loader->getSource($name);
- } catch (Twig_Error_Loader $e) {
- $exceptions[] = $e->getMessage();
- }
- }
-
- throw new Twig_Error_Loader(sprintf('Template "%s" is not defined%s.', $name, $exceptions ? ' ('.implode(', ', $exceptions).')' : ''));
- }
-
- public function getSourceContext($name)
- {
- $exceptions = array();
- foreach ($this->loaders as $loader) {
- if ($loader instanceof Twig_ExistsLoaderInterface && !$loader->exists($name)) {
- continue;
- }
-
- try {
- if ($loader instanceof Twig_SourceContextLoaderInterface) {
- return $loader->getSourceContext($name);
- }
-
- return new Twig_Source($loader->getSource($name), $name);
- } catch (Twig_Error_Loader $e) {
- $exceptions[] = $e->getMessage();
- }
- }
-
- throw new Twig_Error_Loader(sprintf('Template "%s" is not defined%s.', $name, $exceptions ? ' ('.implode(', ', $exceptions).')' : ''));
- }
-
- public function exists($name)
- {
- $name = (string) $name;
-
- if (isset($this->hasSourceCache[$name])) {
- return $this->hasSourceCache[$name];
- }
-
- foreach ($this->loaders as $loader) {
- if ($loader instanceof Twig_ExistsLoaderInterface) {
- if ($loader->exists($name)) {
- return $this->hasSourceCache[$name] = true;
- }
-
- continue;
- }
-
- try {
- if ($loader instanceof Twig_SourceContextLoaderInterface) {
- $loader->getSourceContext($name);
- } else {
- $loader->getSource($name);
- }
-
- return $this->hasSourceCache[$name] = true;
- } catch (Twig_Error_Loader $e) {
- }
- }
-
- return $this->hasSourceCache[$name] = false;
- }
-
- public function getCacheKey($name)
- {
- $exceptions = array();
- foreach ($this->loaders as $loader) {
- if ($loader instanceof Twig_ExistsLoaderInterface && !$loader->exists($name)) {
- continue;
- }
-
- try {
- return $loader->getCacheKey($name);
- } catch (Twig_Error_Loader $e) {
- $exceptions[] = get_class($loader).': '.$e->getMessage();
- }
- }
-
- throw new Twig_Error_Loader(sprintf('Template "%s" is not defined%s.', $name, $exceptions ? ' ('.implode(', ', $exceptions).')' : ''));
- }
-
- public function isFresh($name, $time)
- {
- $exceptions = array();
- foreach ($this->loaders as $loader) {
- if ($loader instanceof Twig_ExistsLoaderInterface && !$loader->exists($name)) {
- continue;
- }
-
- try {
- return $loader->isFresh($name, $time);
- } catch (Twig_Error_Loader $e) {
- $exceptions[] = get_class($loader).': '.$e->getMessage();
- }
- }
-
- throw new Twig_Error_Loader(sprintf('Template "%s" is not defined%s.', $name, $exceptions ? ' ('.implode(', ', $exceptions).')' : ''));
- }
-}
-
-class_alias('Twig_Loader_Chain', 'Twig\Loader\ChainLoader', false);
diff --git a/inc/lib/Twig/Loader/Filesystem.php b/inc/lib/Twig/Loader/Filesystem.php
deleted file mode 100644
index 4e8be0d5..00000000
--- a/inc/lib/Twig/Loader/Filesystem.php
+++ /dev/null
@@ -1,290 +0,0 @@
-
- */
-class Twig_Loader_Filesystem implements Twig_LoaderInterface, Twig_ExistsLoaderInterface, Twig_SourceContextLoaderInterface
-{
- /** Identifier of the main namespace. */
- const MAIN_NAMESPACE = '__main__';
-
- protected $paths = array();
- protected $cache = array();
- protected $errorCache = array();
-
- private $rootPath;
-
- /**
- * @param string|array $paths A path or an array of paths where to look for templates
- * @param string|null $rootPath The root path common to all relative paths (null for getcwd())
- */
- public function __construct($paths = array(), $rootPath = null)
- {
- $this->rootPath = (null === $rootPath ? getcwd() : $rootPath).DIRECTORY_SEPARATOR;
- if (false !== $realPath = realpath($rootPath)) {
- $this->rootPath = $realPath.DIRECTORY_SEPARATOR;
- }
-
- if ($paths) {
- $this->setPaths($paths);
- }
- }
-
- /**
- * Returns the paths to the templates.
- *
- * @param string $namespace A path namespace
- *
- * @return array The array of paths where to look for templates
- */
- public function getPaths($namespace = self::MAIN_NAMESPACE)
- {
- return isset($this->paths[$namespace]) ? $this->paths[$namespace] : array();
- }
-
- /**
- * Returns the path namespaces.
- *
- * The main namespace is always defined.
- *
- * @return array The array of defined namespaces
- */
- public function getNamespaces()
- {
- return array_keys($this->paths);
- }
-
- /**
- * Sets the paths where templates are stored.
- *
- * @param string|array $paths A path or an array of paths where to look for templates
- * @param string $namespace A path namespace
- */
- public function setPaths($paths, $namespace = self::MAIN_NAMESPACE)
- {
- if (!is_array($paths)) {
- $paths = array($paths);
- }
-
- $this->paths[$namespace] = array();
- foreach ($paths as $path) {
- $this->addPath($path, $namespace);
- }
- }
-
- /**
- * Adds a path where templates are stored.
- *
- * @param string $path A path where to look for templates
- * @param string $namespace A path namespace
- *
- * @throws Twig_Error_Loader
- */
- public function addPath($path, $namespace = self::MAIN_NAMESPACE)
- {
- // invalidate the cache
- $this->cache = $this->errorCache = array();
-
- $checkPath = $this->isAbsolutePath($path) ? $path : $this->rootPath.$path;
- if (!is_dir($checkPath)) {
- throw new Twig_Error_Loader(sprintf('The "%s" directory does not exist ("%s").', $path, $checkPath));
- }
-
- $this->paths[$namespace][] = rtrim($path, '/\\');
- }
-
- /**
- * Prepends a path where templates are stored.
- *
- * @param string $path A path where to look for templates
- * @param string $namespace A path namespace
- *
- * @throws Twig_Error_Loader
- */
- public function prependPath($path, $namespace = self::MAIN_NAMESPACE)
- {
- // invalidate the cache
- $this->cache = $this->errorCache = array();
-
- $checkPath = $this->isAbsolutePath($path) ? $path : $this->rootPath.$path;
- if (!is_dir($checkPath)) {
- throw new Twig_Error_Loader(sprintf('The "%s" directory does not exist ("%s").', $path, $checkPath));
- }
-
- $path = rtrim($path, '/\\');
-
- if (!isset($this->paths[$namespace])) {
- $this->paths[$namespace][] = $path;
- } else {
- array_unshift($this->paths[$namespace], $path);
- }
- }
-
- public function getSource($name)
- {
- @trigger_error(sprintf('Calling "getSource" on "%s" is deprecated since 1.27. Use getSourceContext() instead.', get_class($this)), E_USER_DEPRECATED);
-
- return file_get_contents($this->findTemplate($name));
- }
-
- public function getSourceContext($name)
- {
- $path = $this->findTemplate($name);
-
- return new Twig_Source(file_get_contents($path), $name, $path);
- }
-
- public function getCacheKey($name)
- {
- $path = $this->findTemplate($name);
- $len = strlen($this->rootPath);
- if (0 === strncmp($this->rootPath, $path, $len)) {
- return substr($path, $len);
- }
-
- return $path;
- }
-
- public function exists($name)
- {
- $name = $this->normalizeName($name);
-
- if (isset($this->cache[$name])) {
- return true;
- }
-
- try {
- return false !== $this->findTemplate($name, false);
- } catch (Twig_Error_Loader $exception) {
- @trigger_error(sprintf('In %s::findTemplate(), you must accept a second argument that when set to "false" returns "false" instead of throwing an exception. Not supporting this argument is deprecated since version 1.27.', get_class($this)), E_USER_DEPRECATED);
-
- return false;
- }
- }
-
- public function isFresh($name, $time)
- {
- return filemtime($this->findTemplate($name)) < $time;
- }
-
- protected function findTemplate($name)
- {
- $throw = func_num_args() > 1 ? func_get_arg(1) : true;
- $name = $this->normalizeName($name);
-
- if (isset($this->cache[$name])) {
- return $this->cache[$name];
- }
-
- if (isset($this->errorCache[$name])) {
- if (!$throw) {
- return false;
- }
-
- throw new Twig_Error_Loader($this->errorCache[$name]);
- }
-
- $this->validateName($name);
-
- list($namespace, $shortname) = $this->parseName($name);
-
- if (!isset($this->paths[$namespace])) {
- $this->errorCache[$name] = sprintf('There are no registered paths for namespace "%s".', $namespace);
-
- if (!$throw) {
- return false;
- }
-
- throw new Twig_Error_Loader($this->errorCache[$name]);
- }
-
- foreach ($this->paths[$namespace] as $path) {
- if (!$this->isAbsolutePath($path)) {
- $path = $this->rootPath.'/'.$path;
- }
-
- if (is_file($path.'/'.$shortname)) {
- if (false !== $realpath = realpath($path.'/'.$shortname)) {
- return $this->cache[$name] = $realpath;
- }
-
- return $this->cache[$name] = $path.'/'.$shortname;
- }
- }
-
- $this->errorCache[$name] = sprintf('Unable to find template "%s" (looked into: %s).', $name, implode(', ', $this->paths[$namespace]));
-
- if (!$throw) {
- return false;
- }
-
- throw new Twig_Error_Loader($this->errorCache[$name]);
- }
-
- protected function parseName($name, $default = self::MAIN_NAMESPACE)
- {
- if (isset($name[0]) && '@' == $name[0]) {
- if (false === $pos = strpos($name, '/')) {
- throw new Twig_Error_Loader(sprintf('Malformed namespaced template name "%s" (expecting "@namespace/template_name").', $name));
- }
-
- $namespace = substr($name, 1, $pos - 1);
- $shortname = substr($name, $pos + 1);
-
- return array($namespace, $shortname);
- }
-
- return array($default, $name);
- }
-
- protected function normalizeName($name)
- {
- return preg_replace('#/{2,}#', '/', str_replace('\\', '/', (string) $name));
- }
-
- protected function validateName($name)
- {
- if (false !== strpos($name, "\0")) {
- throw new Twig_Error_Loader('A template name cannot contain NUL bytes.');
- }
-
- $name = ltrim($name, '/');
- $parts = explode('/', $name);
- $level = 0;
- foreach ($parts as $part) {
- if ('..' === $part) {
- --$level;
- } elseif ('.' !== $part) {
- ++$level;
- }
-
- if ($level < 0) {
- throw new Twig_Error_Loader(sprintf('Looks like you try to load a template outside configured directories (%s).', $name));
- }
- }
- }
-
- private function isAbsolutePath($file)
- {
- return strspn($file, '/\\', 0, 1)
- || (strlen($file) > 3 && ctype_alpha($file[0])
- && ':' === substr($file, 1, 1)
- && strspn($file, '/\\', 2, 1)
- )
- || null !== parse_url($file, PHP_URL_SCHEME)
- ;
- }
-}
-
-class_alias('Twig_Loader_Filesystem', 'Twig\Loader\FilesystemLoader', false);
diff --git a/inc/lib/Twig/Loader/String.php b/inc/lib/Twig/Loader/String.php
deleted file mode 100644
index 950bd35b..00000000
--- a/inc/lib/Twig/Loader/String.php
+++ /dev/null
@@ -1,58 +0,0 @@
-
- */
-class Twig_Loader_String implements Twig_LoaderInterface, Twig_ExistsLoaderInterface, Twig_SourceContextLoaderInterface
-{
- public function getSource($name)
- {
- @trigger_error(sprintf('Calling "getSource" on "%s" is deprecated since 1.27. Use getSourceContext() instead.', get_class($this)), E_USER_DEPRECATED);
-
- return $name;
- }
-
- public function getSourceContext($name)
- {
- return new Twig_Source($name, $name);
- }
-
- public function exists($name)
- {
- return true;
- }
-
- public function getCacheKey($name)
- {
- return $name;
- }
-
- public function isFresh($name, $time)
- {
- return true;
- }
-}
diff --git a/inc/lib/Twig/LoaderInterface.php b/inc/lib/Twig/LoaderInterface.php
deleted file mode 100644
index 459a70ab..00000000
--- a/inc/lib/Twig/LoaderInterface.php
+++ /dev/null
@@ -1,57 +0,0 @@
-
- */
-interface Twig_LoaderInterface
-{
- /**
- * Gets the source code of a template, given its name.
- *
- * @param string $name The name of the template to load
- *
- * @return string The template source code
- *
- * @throws Twig_Error_Loader When $name is not found
- *
- * @deprecated since 1.27 (to be removed in 2.0), implement Twig_SourceContextLoaderInterface
- */
- public function getSource($name);
-
- /**
- * Gets the cache key to use for the cache for a given template name.
- *
- * @param string $name The name of the template to load
- *
- * @return string The cache key
- *
- * @throws Twig_Error_Loader When $name is not found
- */
- public function getCacheKey($name);
-
- /**
- * Returns true if the template is still fresh.
- *
- * @param string $name The template name
- * @param int $time Timestamp of the last modification time of the
- * cached template
- *
- * @return bool true if the template is fresh, false otherwise
- *
- * @throws Twig_Error_Loader When $name is not found
- */
- public function isFresh($name, $time);
-}
-
-class_alias('Twig_LoaderInterface', 'Twig\Loader\LoaderInterface', false);
diff --git a/inc/lib/Twig/Markup.php b/inc/lib/Twig/Markup.php
deleted file mode 100644
index 8591d1f9..00000000
--- a/inc/lib/Twig/Markup.php
+++ /dev/null
@@ -1,39 +0,0 @@
-
- */
-class Twig_Markup implements Countable
-{
- protected $content;
- protected $charset;
-
- public function __construct($content, $charset)
- {
- $this->content = (string) $content;
- $this->charset = $charset;
- }
-
- public function __toString()
- {
- return $this->content;
- }
-
- public function count()
- {
- return function_exists('mb_get_info') ? mb_strlen($this->content, $this->charset) : strlen($this->content);
- }
-}
-
-class_alias('Twig_Markup', 'Twig\Markup', false);
diff --git a/inc/lib/Twig/Node.php b/inc/lib/Twig/Node.php
deleted file mode 100644
index 89ada144..00000000
--- a/inc/lib/Twig/Node.php
+++ /dev/null
@@ -1,256 +0,0 @@
-
- */
-class Twig_Node implements Twig_NodeInterface
-{
- protected $nodes;
- protected $attributes;
- protected $lineno;
- protected $tag;
-
- private $name;
-
- /**
- * Constructor.
- *
- * The nodes are automatically made available as properties ($this->node).
- * The attributes are automatically made available as array items ($this['name']).
- *
- * @param array $nodes An array of named nodes
- * @param array $attributes An array of attributes (should not be nodes)
- * @param int $lineno The line number
- * @param string $tag The tag name associated with the Node
- */
- public function __construct(array $nodes = array(), array $attributes = array(), $lineno = 0, $tag = null)
- {
- foreach ($nodes as $name => $node) {
- if (!$node instanceof Twig_NodeInterface) {
- @trigger_error(sprintf('Using "%s" for the value of node "%s" of "%s" is deprecated since version 1.25 and will be removed in 2.0.', is_object($node) ? get_class($node) : null === $node ? 'null' : gettype($node), $name, get_class($this)), E_USER_DEPRECATED);
- }
- }
- $this->nodes = $nodes;
- $this->attributes = $attributes;
- $this->lineno = $lineno;
- $this->tag = $tag;
- }
-
- public function __toString()
- {
- $attributes = array();
- foreach ($this->attributes as $name => $value) {
- $attributes[] = sprintf('%s: %s', $name, str_replace("\n", '', var_export($value, true)));
- }
-
- $repr = array(get_class($this).'('.implode(', ', $attributes));
-
- if (count($this->nodes)) {
- foreach ($this->nodes as $name => $node) {
- $len = strlen($name) + 4;
- $noderepr = array();
- foreach (explode("\n", (string) $node) as $line) {
- $noderepr[] = str_repeat(' ', $len).$line;
- }
-
- $repr[] = sprintf(' %s: %s', $name, ltrim(implode("\n", $noderepr)));
- }
-
- $repr[] = ')';
- } else {
- $repr[0] .= ')';
- }
-
- return implode("\n", $repr);
- }
-
- /**
- * @deprecated since 1.16.1 (to be removed in 2.0)
- */
- public function toXml($asDom = false)
- {
- @trigger_error(sprintf('%s is deprecated since version 1.16.1 and will be removed in 2.0.', __METHOD__), E_USER_DEPRECATED);
-
- $dom = new DOMDocument('1.0', 'UTF-8');
- $dom->formatOutput = true;
- $dom->appendChild($xml = $dom->createElement('twig'));
-
- $xml->appendChild($node = $dom->createElement('node'));
- $node->setAttribute('class', get_class($this));
-
- foreach ($this->attributes as $name => $value) {
- $node->appendChild($attribute = $dom->createElement('attribute'));
- $attribute->setAttribute('name', $name);
- $attribute->appendChild($dom->createTextNode($value));
- }
-
- foreach ($this->nodes as $name => $n) {
- if (null === $n) {
- continue;
- }
-
- $child = $n->toXml(true)->getElementsByTagName('node')->item(0);
- $child = $dom->importNode($child, true);
- $child->setAttribute('name', $name);
-
- $node->appendChild($child);
- }
-
- return $asDom ? $dom : $dom->saveXML();
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- foreach ($this->nodes as $node) {
- $node->compile($compiler);
- }
- }
-
- public function getTemplateLine()
- {
- return $this->lineno;
- }
-
- /**
- * @deprecated since 1.27 (to be removed in 2.0)
- */
- public function getLine()
- {
- @trigger_error('The '.__METHOD__.' method is deprecated since version 1.27 and will be removed in 2.0. Use getTemplateLine() instead.', E_USER_DEPRECATED);
-
- return $this->lineno;
- }
-
- public function getNodeTag()
- {
- return $this->tag;
- }
-
- /**
- * @return bool
- */
- public function hasAttribute($name)
- {
- return array_key_exists($name, $this->attributes);
- }
-
- /**
- * @return mixed
- */
- public function getAttribute($name)
- {
- if (!array_key_exists($name, $this->attributes)) {
- throw new LogicException(sprintf('Attribute "%s" does not exist for Node "%s".', $name, get_class($this)));
- }
-
- return $this->attributes[$name];
- }
-
- /**
- * @param string $name
- * @param mixed $value
- */
- public function setAttribute($name, $value)
- {
- $this->attributes[$name] = $value;
- }
-
- public function removeAttribute($name)
- {
- unset($this->attributes[$name]);
- }
-
- /**
- * @return bool
- */
- public function hasNode($name)
- {
- return array_key_exists($name, $this->nodes);
- }
-
- /**
- * @return Twig_Node
- */
- public function getNode($name)
- {
- if (!array_key_exists($name, $this->nodes)) {
- throw new LogicException(sprintf('Node "%s" does not exist for Node "%s".', $name, get_class($this)));
- }
-
- return $this->nodes[$name];
- }
-
- public function setNode($name, $node = null)
- {
- if (!$node instanceof Twig_NodeInterface) {
- @trigger_error(sprintf('Using "%s" for the value of node "%s" of "%s" is deprecated since version 1.25 and will be removed in 2.0.', is_object($node) ? get_class($node) : null === $node ? 'null' : gettype($node), $name, get_class($this)), E_USER_DEPRECATED);
- }
-
- $this->nodes[$name] = $node;
- }
-
- public function removeNode($name)
- {
- unset($this->nodes[$name]);
- }
-
- public function count()
- {
- return count($this->nodes);
- }
-
- public function getIterator()
- {
- return new ArrayIterator($this->nodes);
- }
-
- public function setTemplateName($name)
- {
- $this->name = $name;
- foreach ($this->nodes as $node) {
- if (null !== $node) {
- $node->setTemplateName($name);
- }
- }
- }
-
- public function getTemplateName()
- {
- return $this->name;
- }
-
- /**
- * @deprecated since 1.27 (to be removed in 2.0)
- */
- public function setFilename($name)
- {
- @trigger_error('The '.__METHOD__.' method is deprecated since version 1.27 and will be removed in 2.0. Use setTemplateName() instead.', E_USER_DEPRECATED);
-
- $this->setTemplateName($name);
- }
-
- /**
- * @deprecated since 1.27 (to be removed in 2.0)
- */
- public function getFilename()
- {
- @trigger_error('The '.__METHOD__.' method is deprecated since version 1.27 and will be removed in 2.0. Use getTemplateName() instead.', E_USER_DEPRECATED);
-
- return $this->name;
- }
-}
-
-class_alias('Twig_Node', 'Twig\Node\Node', false);
-class_exists('Twig_Compiler');
diff --git a/inc/lib/Twig/Node/AutoEscape.php b/inc/lib/Twig/Node/AutoEscape.php
deleted file mode 100644
index 17e4e381..00000000
--- a/inc/lib/Twig/Node/AutoEscape.php
+++ /dev/null
@@ -1,36 +0,0 @@
-
- */
-class Twig_Node_AutoEscape extends Twig_Node
-{
- public function __construct($value, Twig_NodeInterface $body, $lineno, $tag = 'autoescape')
- {
- parent::__construct(array('body' => $body), array('value' => $value), $lineno, $tag);
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- $compiler->subcompile($this->getNode('body'));
- }
-}
-
-class_alias('Twig_Node_AutoEscape', 'Twig\Node\AutoEscapeNode', false);
diff --git a/inc/lib/Twig/Node/Block.php b/inc/lib/Twig/Node/Block.php
deleted file mode 100644
index 91752ad2..00000000
--- a/inc/lib/Twig/Node/Block.php
+++ /dev/null
@@ -1,41 +0,0 @@
-
- */
-class Twig_Node_Block extends Twig_Node
-{
- public function __construct($name, Twig_NodeInterface $body, $lineno, $tag = null)
- {
- parent::__construct(array('body' => $body), array('name' => $name), $lineno, $tag);
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- $compiler
- ->addDebugInfo($this)
- ->write(sprintf("public function block_%s(\$context, array \$blocks = array())\n", $this->getAttribute('name')), "{\n")
- ->indent()
- ;
-
- $compiler
- ->subcompile($this->getNode('body'))
- ->outdent()
- ->write("}\n\n")
- ;
- }
-}
-
-class_alias('Twig_Node_Block', 'Twig\Node\BlockNode', false);
diff --git a/inc/lib/Twig/Node/BlockReference.php b/inc/lib/Twig/Node/BlockReference.php
deleted file mode 100644
index 92a9f398..00000000
--- a/inc/lib/Twig/Node/BlockReference.php
+++ /dev/null
@@ -1,34 +0,0 @@
-
- */
-class Twig_Node_BlockReference extends Twig_Node implements Twig_NodeOutputInterface
-{
- public function __construct($name, $lineno, $tag = null)
- {
- parent::__construct(array(), array('name' => $name), $lineno, $tag);
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- $compiler
- ->addDebugInfo($this)
- ->write(sprintf("\$this->displayBlock('%s', \$context, \$blocks);\n", $this->getAttribute('name')))
- ;
- }
-}
-
-class_alias('Twig_Node_BlockReference', 'Twig\Node\BlockReferenceNode', false);
diff --git a/inc/lib/Twig/Node/Body.php b/inc/lib/Twig/Node/Body.php
deleted file mode 100644
index 07dfef8b..00000000
--- a/inc/lib/Twig/Node/Body.php
+++ /dev/null
@@ -1,21 +0,0 @@
-
- */
-class Twig_Node_Body extends Twig_Node
-{
-}
-
-class_alias('Twig_Node_Body', 'Twig\Node\BodyNode', false);
diff --git a/inc/lib/Twig/Node/CheckSecurity.php b/inc/lib/Twig/Node/CheckSecurity.php
deleted file mode 100644
index 7258acb6..00000000
--- a/inc/lib/Twig/Node/CheckSecurity.php
+++ /dev/null
@@ -1,80 +0,0 @@
-
- */
-class Twig_Node_CheckSecurity extends Twig_Node
-{
- protected $usedFilters;
- protected $usedTags;
- protected $usedFunctions;
-
- public function __construct(array $usedFilters, array $usedTags, array $usedFunctions)
- {
- $this->usedFilters = $usedFilters;
- $this->usedTags = $usedTags;
- $this->usedFunctions = $usedFunctions;
-
- parent::__construct();
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- $tags = $filters = $functions = array();
- foreach (array('tags', 'filters', 'functions') as $type) {
- foreach ($this->{'used'.ucfirst($type)} as $name => $node) {
- if ($node instanceof Twig_Node) {
- ${$type}[$name] = $node->getTemplateLine();
- } else {
- ${$type}[$node] = null;
- }
- }
- }
-
- $compiler
- ->write('$tags = ')->repr(array_filter($tags))->raw(";\n")
- ->write('$filters = ')->repr(array_filter($filters))->raw(";\n")
- ->write('$functions = ')->repr(array_filter($functions))->raw(";\n\n")
- ->write("try {\n")
- ->indent()
- ->write("\$this->env->getExtension('Twig_Extension_Sandbox')->checkSecurity(\n")
- ->indent()
- ->write(!$tags ? "array(),\n" : "array('".implode("', '", array_keys($tags))."'),\n")
- ->write(!$filters ? "array(),\n" : "array('".implode("', '", array_keys($filters))."'),\n")
- ->write(!$functions ? "array()\n" : "array('".implode("', '", array_keys($functions))."')\n")
- ->outdent()
- ->write(");\n")
- ->outdent()
- ->write("} catch (Twig_Sandbox_SecurityError \$e) {\n")
- ->indent()
- ->write("\$e->setSourceContext(\$this->getSourceContext());\n\n")
- ->write("if (\$e instanceof Twig_Sandbox_SecurityNotAllowedTagError && isset(\$tags[\$e->getTagName()])) {\n")
- ->indent()
- ->write("\$e->setTemplateLine(\$tags[\$e->getTagName()]);\n")
- ->outdent()
- ->write("} elseif (\$e instanceof Twig_Sandbox_SecurityNotAllowedFilterError && isset(\$filters[\$e->getFilterName()])) {\n")
- ->indent()
- ->write("\$e->setTemplateLine(\$filters[\$e->getFilterName()]);\n")
- ->outdent()
- ->write("} elseif (\$e instanceof Twig_Sandbox_SecurityNotAllowedFunctionError && isset(\$functions[\$e->getFunctionName()])) {\n")
- ->indent()
- ->write("\$e->setTemplateLine(\$functions[\$e->getFunctionName()]);\n")
- ->outdent()
- ->write("}\n\n")
- ->write("throw \$e;\n")
- ->outdent()
- ->write("}\n\n")
- ;
- }
-}
-
-class_alias('Twig_Node_CheckSecurity', 'Twig\Node\CheckSecurityNode', false);
diff --git a/inc/lib/Twig/Node/Do.php b/inc/lib/Twig/Node/Do.php
deleted file mode 100644
index cdd7e77a..00000000
--- a/inc/lib/Twig/Node/Do.php
+++ /dev/null
@@ -1,35 +0,0 @@
-
- */
-class Twig_Node_Do extends Twig_Node
-{
- public function __construct(Twig_Node_Expression $expr, $lineno, $tag = null)
- {
- parent::__construct(array('expr' => $expr), array(), $lineno, $tag);
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- $compiler
- ->addDebugInfo($this)
- ->write('')
- ->subcompile($this->getNode('expr'))
- ->raw(";\n")
- ;
- }
-}
-
-class_alias('Twig_Node_Do', 'Twig\Node\DoNode', false);
diff --git a/inc/lib/Twig/Node/Embed.php b/inc/lib/Twig/Node/Embed.php
deleted file mode 100644
index 3785d3a9..00000000
--- a/inc/lib/Twig/Node/Embed.php
+++ /dev/null
@@ -1,46 +0,0 @@
-
- */
-class Twig_Node_Embed extends Twig_Node_Include
-{
- // we don't inject the module to avoid node visitors to traverse it twice (as it will be already visited in the main module)
- public function __construct($name, $index, Twig_Node_Expression $variables = null, $only = false, $ignoreMissing = false, $lineno, $tag = null)
- {
- parent::__construct(new Twig_Node_Expression_Constant('not_used', $lineno), $variables, $only, $ignoreMissing, $lineno, $tag);
-
- $this->setAttribute('name', $name);
- // to be removed in 2.0, used name instead
- $this->setAttribute('filename', $name);
- $this->setAttribute('index', $index);
- }
-
- protected function addGetTemplate(Twig_Compiler $compiler)
- {
- $compiler
- ->write('$this->loadTemplate(')
- ->string($this->getAttribute('name'))
- ->raw(', ')
- ->repr($this->getTemplateName())
- ->raw(', ')
- ->repr($this->getTemplateLine())
- ->raw(', ')
- ->string($this->getAttribute('index'))
- ->raw(')')
- ;
- }
-}
-
-class_alias('Twig_Node_Embed', 'Twig\Node\EmbedNode', false);
diff --git a/inc/lib/Twig/Node/Expression.php b/inc/lib/Twig/Node/Expression.php
deleted file mode 100644
index a99c4e63..00000000
--- a/inc/lib/Twig/Node/Expression.php
+++ /dev/null
@@ -1,22 +0,0 @@
-
- */
-abstract class Twig_Node_Expression extends Twig_Node
-{
-}
-
-class_alias('Twig_Node_Expression', 'Twig\Node\Expression\AbstractExpression', false);
diff --git a/inc/lib/Twig/Node/Expression/Array.php b/inc/lib/Twig/Node/Expression/Array.php
deleted file mode 100644
index 0e77bb08..00000000
--- a/inc/lib/Twig/Node/Expression/Array.php
+++ /dev/null
@@ -1,83 +0,0 @@
-index = -1;
- foreach ($this->getKeyValuePairs() as $pair) {
- if ($pair['key'] instanceof Twig_Node_Expression_Constant && ctype_digit((string) $pair['key']->getAttribute('value')) && $pair['key']->getAttribute('value') > $this->index) {
- $this->index = $pair['key']->getAttribute('value');
- }
- }
- }
-
- public function getKeyValuePairs()
- {
- $pairs = array();
-
- foreach (array_chunk($this->nodes, 2) as $pair) {
- $pairs[] = array(
- 'key' => $pair[0],
- 'value' => $pair[1],
- );
- }
-
- return $pairs;
- }
-
- public function hasElement(Twig_Node_Expression $key)
- {
- foreach ($this->getKeyValuePairs() as $pair) {
- // we compare the string representation of the keys
- // to avoid comparing the line numbers which are not relevant here.
- if ((string) $key === (string) $pair['key']) {
- return true;
- }
- }
-
- return false;
- }
-
- public function addElement(Twig_Node_Expression $value, Twig_Node_Expression $key = null)
- {
- if (null === $key) {
- $key = new Twig_Node_Expression_Constant(++$this->index, $value->getTemplateLine());
- }
-
- array_push($this->nodes, $key, $value);
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- $compiler->raw('array(');
- $first = true;
- foreach ($this->getKeyValuePairs() as $pair) {
- if (!$first) {
- $compiler->raw(', ');
- }
- $first = false;
-
- $compiler
- ->subcompile($pair['key'])
- ->raw(' => ')
- ->subcompile($pair['value'])
- ;
- }
- $compiler->raw(')');
- }
-}
-
-class_alias('Twig_Node_Expression_Array', 'Twig\Node\Expression\ArrayExpression', false);
diff --git a/inc/lib/Twig/Node/Expression/AssignName.php b/inc/lib/Twig/Node/Expression/AssignName.php
deleted file mode 100644
index 2e6b4c7c..00000000
--- a/inc/lib/Twig/Node/Expression/AssignName.php
+++ /dev/null
@@ -1,25 +0,0 @@
-raw('$context[')
- ->string($this->getAttribute('name'))
- ->raw(']')
- ;
- }
-}
-
-class_alias('Twig_Node_Expression_AssignName', 'Twig\Node\Expression\AssignNameExpression', false);
diff --git a/inc/lib/Twig/Node/Expression/Binary.php b/inc/lib/Twig/Node/Expression/Binary.php
deleted file mode 100644
index 2b545d98..00000000
--- a/inc/lib/Twig/Node/Expression/Binary.php
+++ /dev/null
@@ -1,37 +0,0 @@
- $left, 'right' => $right), array(), $lineno);
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- $compiler
- ->raw('(')
- ->subcompile($this->getNode('left'))
- ->raw(' ')
- ;
- $this->operator($compiler);
- $compiler
- ->raw(' ')
- ->subcompile($this->getNode('right'))
- ->raw(')')
- ;
- }
-
- abstract public function operator(Twig_Compiler $compiler);
-}
-
-class_alias('Twig_Node_Expression_Binary', 'Twig\Node\Expression\Binary\AbstractBinary', false);
diff --git a/inc/lib/Twig/Node/Expression/Binary/Add.php b/inc/lib/Twig/Node/Expression/Binary/Add.php
deleted file mode 100644
index 5a09d836..00000000
--- a/inc/lib/Twig/Node/Expression/Binary/Add.php
+++ /dev/null
@@ -1,20 +0,0 @@
-raw('+');
- }
-}
-
-class_alias('Twig_Node_Expression_Binary_Add', 'Twig\Node\Expression\Binary\AddBinary', false);
diff --git a/inc/lib/Twig/Node/Expression/Binary/And.php b/inc/lib/Twig/Node/Expression/Binary/And.php
deleted file mode 100644
index 9ffddce6..00000000
--- a/inc/lib/Twig/Node/Expression/Binary/And.php
+++ /dev/null
@@ -1,20 +0,0 @@
-raw('&&');
- }
-}
-
-class_alias('Twig_Node_Expression_Binary_And', 'Twig\Node\Expression\Binary\AndBinary', false);
diff --git a/inc/lib/Twig/Node/Expression/Binary/BitwiseAnd.php b/inc/lib/Twig/Node/Expression/Binary/BitwiseAnd.php
deleted file mode 100644
index e46e9ebf..00000000
--- a/inc/lib/Twig/Node/Expression/Binary/BitwiseAnd.php
+++ /dev/null
@@ -1,20 +0,0 @@
-raw('&');
- }
-}
-
-class_alias('Twig_Node_Expression_Binary_BitwiseAnd', 'Twig\Node\Expression\Binary\BitwiseAndBinary', false);
diff --git a/inc/lib/Twig/Node/Expression/Binary/BitwiseOr.php b/inc/lib/Twig/Node/Expression/Binary/BitwiseOr.php
deleted file mode 100644
index 5d7f1b7c..00000000
--- a/inc/lib/Twig/Node/Expression/Binary/BitwiseOr.php
+++ /dev/null
@@ -1,20 +0,0 @@
-raw('|');
- }
-}
-
-class_alias('Twig_Node_Expression_Binary_BitwiseOr', 'Twig\Node\Expression\Binary\BitwiseOrBinary', false);
diff --git a/inc/lib/Twig/Node/Expression/Binary/BitwiseXor.php b/inc/lib/Twig/Node/Expression/Binary/BitwiseXor.php
deleted file mode 100644
index 82edf516..00000000
--- a/inc/lib/Twig/Node/Expression/Binary/BitwiseXor.php
+++ /dev/null
@@ -1,20 +0,0 @@
-raw('^');
- }
-}
-
-class_alias('Twig_Node_Expression_Binary_BitwiseXor', 'Twig\Node\Expression\Binary\BitwiseXorBinary', false);
diff --git a/inc/lib/Twig/Node/Expression/Binary/Concat.php b/inc/lib/Twig/Node/Expression/Binary/Concat.php
deleted file mode 100644
index 91abca60..00000000
--- a/inc/lib/Twig/Node/Expression/Binary/Concat.php
+++ /dev/null
@@ -1,20 +0,0 @@
-raw('.');
- }
-}
-
-class_alias('Twig_Node_Expression_Binary_Concat', 'Twig\Node\Expression\Binary\ConcatBinary', false);
diff --git a/inc/lib/Twig/Node/Expression/Binary/Div.php b/inc/lib/Twig/Node/Expression/Binary/Div.php
deleted file mode 100644
index 38ffa30c..00000000
--- a/inc/lib/Twig/Node/Expression/Binary/Div.php
+++ /dev/null
@@ -1,20 +0,0 @@
-raw('/');
- }
-}
-
-class_alias('Twig_Node_Expression_Binary_Div', 'Twig\Node\Expression\Binary\DivBinary', false);
diff --git a/inc/lib/Twig/Node/Expression/Binary/EndsWith.php b/inc/lib/Twig/Node/Expression/Binary/EndsWith.php
deleted file mode 100644
index 85c52937..00000000
--- a/inc/lib/Twig/Node/Expression/Binary/EndsWith.php
+++ /dev/null
@@ -1,32 +0,0 @@
-getVarName();
- $right = $compiler->getVarName();
- $compiler
- ->raw(sprintf('(is_string($%s = ', $left))
- ->subcompile($this->getNode('left'))
- ->raw(sprintf(') && is_string($%s = ', $right))
- ->subcompile($this->getNode('right'))
- ->raw(sprintf(') && (\'\' === $%2$s || $%2$s === substr($%1$s, -strlen($%2$s))))', $left, $right))
- ;
- }
-
- public function operator(Twig_Compiler $compiler)
- {
- return $compiler->raw('');
- }
-}
-
-class_alias('Twig_Node_Expression_Binary_EndsWith', 'Twig\Node\Expression\Binary\EndsWithBinary', false);
diff --git a/inc/lib/Twig/Node/Expression/Binary/Equal.php b/inc/lib/Twig/Node/Expression/Binary/Equal.php
deleted file mode 100644
index a6a6946b..00000000
--- a/inc/lib/Twig/Node/Expression/Binary/Equal.php
+++ /dev/null
@@ -1,19 +0,0 @@
-raw('==');
- }
-}
-
-class_alias('Twig_Node_Expression_Binary_Equal', 'Twig\Node\Expression\Binary\EqualBinary', false);
diff --git a/inc/lib/Twig/Node/Expression/Binary/FloorDiv.php b/inc/lib/Twig/Node/Expression/Binary/FloorDiv.php
deleted file mode 100644
index 7393bcb8..00000000
--- a/inc/lib/Twig/Node/Expression/Binary/FloorDiv.php
+++ /dev/null
@@ -1,26 +0,0 @@
-raw('(int) floor(');
- parent::compile($compiler);
- $compiler->raw(')');
- }
-
- public function operator(Twig_Compiler $compiler)
- {
- return $compiler->raw('/');
- }
-}
-
-class_alias('Twig_Node_Expression_Binary_FloorDiv', 'Twig\Node\Expression\Binary\FloorDivBinary', false);
diff --git a/inc/lib/Twig/Node/Expression/Binary/Greater.php b/inc/lib/Twig/Node/Expression/Binary/Greater.php
deleted file mode 100644
index 832f9797..00000000
--- a/inc/lib/Twig/Node/Expression/Binary/Greater.php
+++ /dev/null
@@ -1,19 +0,0 @@
-raw('>');
- }
-}
-
-class_alias('Twig_Node_Expression_Binary_Greater', 'Twig\Node\Expression\Binary\GreaterBinary', false);
diff --git a/inc/lib/Twig/Node/Expression/Binary/GreaterEqual.php b/inc/lib/Twig/Node/Expression/Binary/GreaterEqual.php
deleted file mode 100644
index c5f76245..00000000
--- a/inc/lib/Twig/Node/Expression/Binary/GreaterEqual.php
+++ /dev/null
@@ -1,19 +0,0 @@
-raw('>=');
- }
-}
-
-class_alias('Twig_Node_Expression_Binary_GreaterEqual', 'Twig\Node\Expression\Binary\GreaterEqualBinary', false);
diff --git a/inc/lib/Twig/Node/Expression/Binary/In.php b/inc/lib/Twig/Node/Expression/Binary/In.php
deleted file mode 100644
index af112448..00000000
--- a/inc/lib/Twig/Node/Expression/Binary/In.php
+++ /dev/null
@@ -1,30 +0,0 @@
-raw('twig_in_filter(')
- ->subcompile($this->getNode('left'))
- ->raw(', ')
- ->subcompile($this->getNode('right'))
- ->raw(')')
- ;
- }
-
- public function operator(Twig_Compiler $compiler)
- {
- return $compiler->raw('in');
- }
-}
-
-class_alias('Twig_Node_Expression_Binary_In', 'Twig\Node\Expression\Binary\InBinary', false);
diff --git a/inc/lib/Twig/Node/Expression/Binary/Less.php b/inc/lib/Twig/Node/Expression/Binary/Less.php
deleted file mode 100644
index ab8fc1f9..00000000
--- a/inc/lib/Twig/Node/Expression/Binary/Less.php
+++ /dev/null
@@ -1,19 +0,0 @@
-raw('<');
- }
-}
-
-class_alias('Twig_Node_Expression_Binary_Less', 'Twig\Node\Expression\Binary\LessBinary', false);
diff --git a/inc/lib/Twig/Node/Expression/Binary/LessEqual.php b/inc/lib/Twig/Node/Expression/Binary/LessEqual.php
deleted file mode 100644
index 71a279e9..00000000
--- a/inc/lib/Twig/Node/Expression/Binary/LessEqual.php
+++ /dev/null
@@ -1,19 +0,0 @@
-raw('<=');
- }
-}
-
-class_alias('Twig_Node_Expression_Binary_LessEqual', 'Twig\Node\Expression\Binary\LessEqualBinary', false);
diff --git a/inc/lib/Twig/Node/Expression/Binary/Matches.php b/inc/lib/Twig/Node/Expression/Binary/Matches.php
deleted file mode 100644
index 5cb85584..00000000
--- a/inc/lib/Twig/Node/Expression/Binary/Matches.php
+++ /dev/null
@@ -1,30 +0,0 @@
-raw('preg_match(')
- ->subcompile($this->getNode('right'))
- ->raw(', ')
- ->subcompile($this->getNode('left'))
- ->raw(')')
- ;
- }
-
- public function operator(Twig_Compiler $compiler)
- {
- return $compiler->raw('');
- }
-}
-
-class_alias('Twig_Node_Expression_Binary_Matches', 'Twig\Node\Expression\Binary\MatchesBinary', false);
diff --git a/inc/lib/Twig/Node/Expression/Binary/Mod.php b/inc/lib/Twig/Node/Expression/Binary/Mod.php
deleted file mode 100644
index 28109633..00000000
--- a/inc/lib/Twig/Node/Expression/Binary/Mod.php
+++ /dev/null
@@ -1,20 +0,0 @@
-raw('%');
- }
-}
-
-class_alias('Twig_Node_Expression_Binary_Mod', 'Twig\Node\Expression\Binary\ModBinary', false);
diff --git a/inc/lib/Twig/Node/Expression/Binary/Mul.php b/inc/lib/Twig/Node/Expression/Binary/Mul.php
deleted file mode 100644
index 790c6a22..00000000
--- a/inc/lib/Twig/Node/Expression/Binary/Mul.php
+++ /dev/null
@@ -1,20 +0,0 @@
-raw('*');
- }
-}
-
-class_alias('Twig_Node_Expression_Binary_Mul', 'Twig\Node\Expression\Binary\MulBinary', false);
diff --git a/inc/lib/Twig/Node/Expression/Binary/NotEqual.php b/inc/lib/Twig/Node/Expression/Binary/NotEqual.php
deleted file mode 100644
index bb45c9ed..00000000
--- a/inc/lib/Twig/Node/Expression/Binary/NotEqual.php
+++ /dev/null
@@ -1,19 +0,0 @@
-raw('!=');
- }
-}
-
-class_alias('Twig_Node_Expression_Binary_NotEqual', 'Twig\Node\Expression\Binary\NotEqualBinary', false);
diff --git a/inc/lib/Twig/Node/Expression/Binary/NotIn.php b/inc/lib/Twig/Node/Expression/Binary/NotIn.php
deleted file mode 100644
index 9dedf92f..00000000
--- a/inc/lib/Twig/Node/Expression/Binary/NotIn.php
+++ /dev/null
@@ -1,30 +0,0 @@
-raw('!twig_in_filter(')
- ->subcompile($this->getNode('left'))
- ->raw(', ')
- ->subcompile($this->getNode('right'))
- ->raw(')')
- ;
- }
-
- public function operator(Twig_Compiler $compiler)
- {
- return $compiler->raw('not in');
- }
-}
-
-class_alias('Twig_Node_Expression_Binary_NotIn', 'Twig\Node\Expression\Binary\NotInBinary', false);
diff --git a/inc/lib/Twig/Node/Expression/Binary/Or.php b/inc/lib/Twig/Node/Expression/Binary/Or.php
deleted file mode 100644
index dc9eece1..00000000
--- a/inc/lib/Twig/Node/Expression/Binary/Or.php
+++ /dev/null
@@ -1,20 +0,0 @@
-raw('||');
- }
-}
-
-class_alias('Twig_Node_Expression_Binary_Or', 'Twig\Node\Expression\Binary\OrBinary', false);
diff --git a/inc/lib/Twig/Node/Expression/Binary/Power.php b/inc/lib/Twig/Node/Expression/Binary/Power.php
deleted file mode 100644
index d24777bd..00000000
--- a/inc/lib/Twig/Node/Expression/Binary/Power.php
+++ /dev/null
@@ -1,34 +0,0 @@
-= 50600) {
- return parent::compile($compiler);
- }
-
- $compiler
- ->raw('pow(')
- ->subcompile($this->getNode('left'))
- ->raw(', ')
- ->subcompile($this->getNode('right'))
- ->raw(')')
- ;
- }
-
- public function operator(Twig_Compiler $compiler)
- {
- return $compiler->raw('**');
- }
-}
-
-class_alias('Twig_Node_Expression_Binary_Power', 'Twig\Node\Expression\Binary\PowerBinary', false);
diff --git a/inc/lib/Twig/Node/Expression/Binary/Range.php b/inc/lib/Twig/Node/Expression/Binary/Range.php
deleted file mode 100644
index 187f6765..00000000
--- a/inc/lib/Twig/Node/Expression/Binary/Range.php
+++ /dev/null
@@ -1,30 +0,0 @@
-raw('range(')
- ->subcompile($this->getNode('left'))
- ->raw(', ')
- ->subcompile($this->getNode('right'))
- ->raw(')')
- ;
- }
-
- public function operator(Twig_Compiler $compiler)
- {
- return $compiler->raw('..');
- }
-}
-
-class_alias('Twig_Node_Expression_Binary_Range', 'Twig\Node\Expression\Binary\RangeBinary', false);
diff --git a/inc/lib/Twig/Node/Expression/Binary/StartsWith.php b/inc/lib/Twig/Node/Expression/Binary/StartsWith.php
deleted file mode 100644
index 7e43b8de..00000000
--- a/inc/lib/Twig/Node/Expression/Binary/StartsWith.php
+++ /dev/null
@@ -1,32 +0,0 @@
-getVarName();
- $right = $compiler->getVarName();
- $compiler
- ->raw(sprintf('(is_string($%s = ', $left))
- ->subcompile($this->getNode('left'))
- ->raw(sprintf(') && is_string($%s = ', $right))
- ->subcompile($this->getNode('right'))
- ->raw(sprintf(') && (\'\' === $%2$s || 0 === strpos($%1$s, $%2$s)))', $left, $right))
- ;
- }
-
- public function operator(Twig_Compiler $compiler)
- {
- return $compiler->raw('');
- }
-}
-
-class_alias('Twig_Node_Expression_Binary_StartsWith', 'Twig\Node\Expression\Binary\StartsWithBinary', false);
diff --git a/inc/lib/Twig/Node/Expression/Binary/Sub.php b/inc/lib/Twig/Node/Expression/Binary/Sub.php
deleted file mode 100644
index cff8ed07..00000000
--- a/inc/lib/Twig/Node/Expression/Binary/Sub.php
+++ /dev/null
@@ -1,20 +0,0 @@
-raw('-');
- }
-}
-
-class_alias('Twig_Node_Expression_Binary_Sub', 'Twig\Node\Expression\Binary\SubBinary', false);
diff --git a/inc/lib/Twig/Node/Expression/BlockReference.php b/inc/lib/Twig/Node/Expression/BlockReference.php
deleted file mode 100644
index 37a3983d..00000000
--- a/inc/lib/Twig/Node/Expression/BlockReference.php
+++ /dev/null
@@ -1,93 +0,0 @@
-
- */
-class Twig_Node_Expression_BlockReference extends Twig_Node_Expression
-{
- /**
- * @param Twig_Node|null $template
- */
- public function __construct(Twig_NodeInterface $name, $template = null, $lineno, $tag = null)
- {
- if (is_bool($template)) {
- @trigger_error(sprintf('The %s method "$asString" argument is deprecated since version 1.28 and will be removed in 2.0.', __METHOD__), E_USER_DEPRECATED);
-
- $template = null;
- }
-
- $nodes = array('name' => $name);
- if (null !== $template) {
- $nodes['template'] = $template;
- }
-
- parent::__construct($nodes, array('is_defined_test' => false, 'output' => false), $lineno, $tag);
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- if ($this->getAttribute('is_defined_test')) {
- $this->compileTemplateCall($compiler, 'hasBlock');
- } else {
- if ($this->getAttribute('output')) {
- $compiler->addDebugInfo($this);
-
- $this
- ->compileTemplateCall($compiler, 'displayBlock')
- ->raw(";\n");
- } else {
- $this->compileTemplateCall($compiler, 'renderBlock');
- }
- }
- }
-
- private function compileTemplateCall(Twig_Compiler $compiler, $method)
- {
- if (!$this->hasNode('template')) {
- $compiler->write('$this');
- } else {
- $compiler
- ->write('$this->loadTemplate(')
- ->subcompile($this->getNode('template'))
- ->raw(', ')
- ->repr($this->getTemplateName())
- ->raw(', ')
- ->repr($this->getTemplateLine())
- ->raw(')')
- ;
- }
-
- $compiler->raw(sprintf('->%s', $method));
- $this->compileBlockArguments($compiler);
-
- return $compiler;
- }
-
- private function compileBlockArguments(Twig_Compiler $compiler)
- {
- $compiler
- ->raw('(')
- ->subcompile($this->getNode('name'))
- ->raw(', $context');
-
- if (!$this->hasNode('template')) {
- $compiler->raw(', $blocks');
- }
-
- return $compiler->raw(')');
- }
-}
-
-class_alias('Twig_Node_Expression_BlockReference', 'Twig\Node\Expression\BlockReferenceExpression', false);
diff --git a/inc/lib/Twig/Node/Expression/Call.php b/inc/lib/Twig/Node/Expression/Call.php
deleted file mode 100644
index d962b6a5..00000000
--- a/inc/lib/Twig/Node/Expression/Call.php
+++ /dev/null
@@ -1,291 +0,0 @@
-hasAttribute('callable') && $callable = $this->getAttribute('callable')) {
- if (is_string($callable) && false === strpos($callable, '::')) {
- $compiler->raw($callable);
- } else {
- list($r, $callable) = $this->reflectCallable($callable);
- if ($r instanceof ReflectionMethod && is_string($callable[0])) {
- if ($r->isStatic()) {
- $compiler->raw(sprintf('%s::%s', $callable[0], $callable[1]));
- } else {
- $compiler->raw(sprintf('$this->env->getRuntime(\'%s\')->%s', $callable[0], $callable[1]));
- }
- } elseif ($r instanceof ReflectionMethod && $callable[0] instanceof Twig_ExtensionInterface) {
- $compiler->raw(sprintf('$this->env->getExtension(\'%s\')->%s', get_class($callable[0]), $callable[1]));
- } else {
- $type = ucfirst($this->getAttribute('type'));
- $compiler->raw(sprintf('call_user_func_array($this->env->get%s(\'%s\')->getCallable(), array', $type, $this->getAttribute('name')));
- $closingParenthesis = true;
- }
- }
- } else {
- $compiler->raw($this->getAttribute('thing')->compile());
- }
-
- $this->compileArguments($compiler);
-
- if ($closingParenthesis) {
- $compiler->raw(')');
- }
- }
-
- protected function compileArguments(Twig_Compiler $compiler)
- {
- $compiler->raw('(');
-
- $first = true;
-
- if ($this->hasAttribute('needs_environment') && $this->getAttribute('needs_environment')) {
- $compiler->raw('$this->env');
- $first = false;
- }
-
- if ($this->hasAttribute('needs_context') && $this->getAttribute('needs_context')) {
- if (!$first) {
- $compiler->raw(', ');
- }
- $compiler->raw('$context');
- $first = false;
- }
-
- if ($this->hasAttribute('arguments')) {
- foreach ($this->getAttribute('arguments') as $argument) {
- if (!$first) {
- $compiler->raw(', ');
- }
- $compiler->string($argument);
- $first = false;
- }
- }
-
- if ($this->hasNode('node')) {
- if (!$first) {
- $compiler->raw(', ');
- }
- $compiler->subcompile($this->getNode('node'));
- $first = false;
- }
-
- if ($this->hasNode('arguments')) {
- $callable = $this->hasAttribute('callable') ? $this->getAttribute('callable') : null;
-
- $arguments = $this->getArguments($callable, $this->getNode('arguments'));
-
- foreach ($arguments as $node) {
- if (!$first) {
- $compiler->raw(', ');
- }
- $compiler->subcompile($node);
- $first = false;
- }
- }
-
- $compiler->raw(')');
- }
-
- protected function getArguments($callable, $arguments)
- {
- $callType = $this->getAttribute('type');
- $callName = $this->getAttribute('name');
-
- $parameters = array();
- $named = false;
- foreach ($arguments as $name => $node) {
- if (!is_int($name)) {
- $named = true;
- $name = $this->normalizeName($name);
- } elseif ($named) {
- throw new Twig_Error_Syntax(sprintf('Positional arguments cannot be used after named arguments for %s "%s".', $callType, $callName));
- }
-
- $parameters[$name] = $node;
- }
-
- $isVariadic = $this->hasAttribute('is_variadic') && $this->getAttribute('is_variadic');
- if (!$named && !$isVariadic) {
- return $parameters;
- }
-
- if (!$callable) {
- if ($named) {
- $message = sprintf('Named arguments are not supported for %s "%s".', $callType, $callName);
- } else {
- $message = sprintf('Arbitrary positional arguments are not supported for %s "%s".', $callType, $callName);
- }
-
- throw new LogicException($message);
- }
-
- $callableParameters = $this->getCallableParameters($callable, $isVariadic);
- $arguments = array();
- $names = array();
- $missingArguments = array();
- $optionalArguments = array();
- $pos = 0;
- foreach ($callableParameters as $callableParameter) {
- $names[] = $name = $this->normalizeName($callableParameter->name);
-
- if (array_key_exists($name, $parameters)) {
- if (array_key_exists($pos, $parameters)) {
- throw new Twig_Error_Syntax(sprintf('Argument "%s" is defined twice for %s "%s".', $name, $callType, $callName));
- }
-
- if (count($missingArguments)) {
- throw new Twig_Error_Syntax(sprintf(
- 'Argument "%s" could not be assigned for %s "%s(%s)" because it is mapped to an internal PHP function which cannot determine default value for optional argument%s "%s".',
- $name, $callType, $callName, implode(', ', $names), count($missingArguments) > 1 ? 's' : '', implode('", "', $missingArguments))
- );
- }
-
- $arguments = array_merge($arguments, $optionalArguments);
- $arguments[] = $parameters[$name];
- unset($parameters[$name]);
- $optionalArguments = array();
- } elseif (array_key_exists($pos, $parameters)) {
- $arguments = array_merge($arguments, $optionalArguments);
- $arguments[] = $parameters[$pos];
- unset($parameters[$pos]);
- $optionalArguments = array();
- ++$pos;
- } elseif ($callableParameter->isDefaultValueAvailable()) {
- $optionalArguments[] = new Twig_Node_Expression_Constant($callableParameter->getDefaultValue(), -1);
- } elseif ($callableParameter->isOptional()) {
- if (empty($parameters)) {
- break;
- } else {
- $missingArguments[] = $name;
- }
- } else {
- throw new Twig_Error_Syntax(sprintf('Value for argument "%s" is required for %s "%s".', $name, $callType, $callName));
- }
- }
-
- if ($isVariadic) {
- $arbitraryArguments = new Twig_Node_Expression_Array(array(), -1);
- foreach ($parameters as $key => $value) {
- if (is_int($key)) {
- $arbitraryArguments->addElement($value);
- } else {
- $arbitraryArguments->addElement($value, new Twig_Node_Expression_Constant($key, -1));
- }
- unset($parameters[$key]);
- }
-
- if ($arbitraryArguments->count()) {
- $arguments = array_merge($arguments, $optionalArguments);
- $arguments[] = $arbitraryArguments;
- }
- }
-
- if (!empty($parameters)) {
- $unknownParameter = null;
- foreach ($parameters as $parameter) {
- if ($parameter instanceof Twig_Node) {
- $unknownParameter = $parameter;
- break;
- }
- }
-
- throw new Twig_Error_Syntax(sprintf(
- 'Unknown argument%s "%s" for %s "%s(%s)".',
- count($parameters) > 1 ? 's' : '', implode('", "', array_keys($parameters)), $callType, $callName, implode(', ', $names)
- ), $unknownParameter ? $unknownParameter->getTemplateLine() : -1);
- }
-
- return $arguments;
- }
-
- protected function normalizeName($name)
- {
- return strtolower(preg_replace(array('/([A-Z]+)([A-Z][a-z])/', '/([a-z\d])([A-Z])/'), array('\\1_\\2', '\\1_\\2'), $name));
- }
-
- private function getCallableParameters($callable, $isVariadic)
- {
- list($r) = $this->reflectCallable($callable);
- if (null === $r) {
- return array();
- }
-
- $parameters = $r->getParameters();
- if ($this->hasNode('node')) {
- array_shift($parameters);
- }
- if ($this->hasAttribute('needs_environment') && $this->getAttribute('needs_environment')) {
- array_shift($parameters);
- }
- if ($this->hasAttribute('needs_context') && $this->getAttribute('needs_context')) {
- array_shift($parameters);
- }
- if ($this->hasAttribute('arguments') && null !== $this->getAttribute('arguments')) {
- foreach ($this->getAttribute('arguments') as $argument) {
- array_shift($parameters);
- }
- }
- if ($isVariadic) {
- $argument = end($parameters);
- if ($argument && $argument->isArray() && $argument->isDefaultValueAvailable() && array() === $argument->getDefaultValue()) {
- array_pop($parameters);
- } else {
- $callableName = $r->name;
- if ($r instanceof ReflectionMethod) {
- $callableName = $r->getDeclaringClass()->name.'::'.$callableName;
- }
-
- throw new LogicException(sprintf('The last parameter of "%s" for %s "%s" must be an array with default value, eg. "array $arg = array()".', $callableName, $this->getAttribute('type'), $this->getAttribute('name')));
- }
- }
-
- return $parameters;
- }
-
- private function reflectCallable($callable)
- {
- if (null !== $this->reflector) {
- return $this->reflector;
- }
-
- if (is_array($callable)) {
- if (!method_exists($callable[0], $callable[1])) {
- // __call()
- return array(null, array());
- }
- $r = new ReflectionMethod($callable[0], $callable[1]);
- } elseif (is_object($callable) && !$callable instanceof Closure) {
- $r = new ReflectionObject($callable);
- $r = $r->getMethod('__invoke');
- $callable = array($callable, '__invoke');
- } elseif (is_string($callable) && false !== $pos = strpos($callable, '::')) {
- $class = substr($callable, 0, $pos);
- $method = substr($callable, $pos + 2);
- if (!method_exists($class, $method)) {
- // __staticCall()
- return array(null, array());
- }
- $r = new ReflectionMethod($callable);
- $callable = array($class, $method);
- } else {
- $r = new ReflectionFunction($callable);
- }
-
- return $this->reflector = array($r, $callable);
- }
-}
-
-class_alias('Twig_Node_Expression_Call', 'Twig\Node\Expression\CallExpression', false);
diff --git a/inc/lib/Twig/Node/Expression/Conditional.php b/inc/lib/Twig/Node/Expression/Conditional.php
deleted file mode 100644
index c339d773..00000000
--- a/inc/lib/Twig/Node/Expression/Conditional.php
+++ /dev/null
@@ -1,33 +0,0 @@
- $expr1, 'expr2' => $expr2, 'expr3' => $expr3), array(), $lineno);
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- $compiler
- ->raw('((')
- ->subcompile($this->getNode('expr1'))
- ->raw(') ? (')
- ->subcompile($this->getNode('expr2'))
- ->raw(') : (')
- ->subcompile($this->getNode('expr3'))
- ->raw('))')
- ;
- }
-}
-
-class_alias('Twig_Node_Expression_Conditional', 'Twig\Node\Expression\ConditionalExpression', false);
diff --git a/inc/lib/Twig/Node/Expression/Constant.php b/inc/lib/Twig/Node/Expression/Constant.php
deleted file mode 100644
index bf4d031c..00000000
--- a/inc/lib/Twig/Node/Expression/Constant.php
+++ /dev/null
@@ -1,25 +0,0 @@
- $value), $lineno);
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- $compiler->repr($this->getAttribute('value'));
- }
-}
-
-class_alias('Twig_Node_Expression_Constant', 'Twig\Node\Expression\ConstantExpression', false);
diff --git a/inc/lib/Twig/Node/Expression/ExtensionReference.php b/inc/lib/Twig/Node/Expression/ExtensionReference.php
deleted file mode 100644
index 114b5cd9..00000000
--- a/inc/lib/Twig/Node/Expression/ExtensionReference.php
+++ /dev/null
@@ -1,32 +0,0 @@
-
- *
- * @deprecated since 1.23 and will be removed in 2.0.
- */
-class Twig_Node_Expression_ExtensionReference extends Twig_Node_Expression
-{
- public function __construct($name, $lineno, $tag = null)
- {
- parent::__construct(array(), array('name' => $name), $lineno, $tag);
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- $compiler->raw(sprintf("\$this->env->getExtension('%s')", $this->getAttribute('name')));
- }
-}
diff --git a/inc/lib/Twig/Node/Expression/Filter.php b/inc/lib/Twig/Node/Expression/Filter.php
deleted file mode 100644
index 12da1d67..00000000
--- a/inc/lib/Twig/Node/Expression/Filter.php
+++ /dev/null
@@ -1,41 +0,0 @@
- $node, 'filter' => $filterName, 'arguments' => $arguments), array(), $lineno, $tag);
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- $name = $this->getNode('filter')->getAttribute('value');
- $filter = $compiler->getEnvironment()->getFilter($name);
-
- $this->setAttribute('name', $name);
- $this->setAttribute('type', 'filter');
- $this->setAttribute('thing', $filter);
- $this->setAttribute('needs_environment', $filter->needsEnvironment());
- $this->setAttribute('needs_context', $filter->needsContext());
- $this->setAttribute('arguments', $filter->getArguments());
- if ($filter instanceof Twig_FilterCallableInterface || $filter instanceof Twig_SimpleFilter) {
- $this->setAttribute('callable', $filter->getCallable());
- }
- if ($filter instanceof Twig_SimpleFilter) {
- $this->setAttribute('is_variadic', $filter->isVariadic());
- }
-
- $this->compileCallable($compiler);
- }
-}
-
-class_alias('Twig_Node_Expression_Filter', 'Twig\Node\Expression\FilterExpression', false);
diff --git a/inc/lib/Twig/Node/Expression/Filter/Default.php b/inc/lib/Twig/Node/Expression/Filter/Default.php
deleted file mode 100644
index d2e19d54..00000000
--- a/inc/lib/Twig/Node/Expression/Filter/Default.php
+++ /dev/null
@@ -1,45 +0,0 @@
-
- * {{ var.foo|default('foo item on var is not defined') }}
- *
- *
- * @author Fabien Potencier
- */
-class Twig_Node_Expression_Filter_Default extends Twig_Node_Expression_Filter
-{
- public function __construct(Twig_NodeInterface $node, Twig_Node_Expression_Constant $filterName, Twig_NodeInterface $arguments, $lineno, $tag = null)
- {
- $default = new Twig_Node_Expression_Filter($node, new Twig_Node_Expression_Constant('default', $node->getTemplateLine()), $arguments, $node->getTemplateLine());
-
- if ('default' === $filterName->getAttribute('value') && ($node instanceof Twig_Node_Expression_Name || $node instanceof Twig_Node_Expression_GetAttr)) {
- $test = new Twig_Node_Expression_Test_Defined(clone $node, 'defined', new Twig_Node(), $node->getTemplateLine());
- $false = count($arguments) ? $arguments->getNode(0) : new Twig_Node_Expression_Constant('', $node->getTemplateLine());
-
- $node = new Twig_Node_Expression_Conditional($test, $default, $false, $node->getTemplateLine());
- } else {
- $node = $default;
- }
-
- parent::__construct($node, $filterName, $arguments, $lineno, $tag);
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- $compiler->subcompile($this->getNode('node'));
- }
-}
-
-class_alias('Twig_Node_Expression_Filter_Default', 'Twig\Node\Expression\Filter\DefaultFilter', false);
diff --git a/inc/lib/Twig/Node/Expression/Function.php b/inc/lib/Twig/Node/Expression/Function.php
deleted file mode 100644
index cdee7c97..00000000
--- a/inc/lib/Twig/Node/Expression/Function.php
+++ /dev/null
@@ -1,45 +0,0 @@
- $arguments), array('name' => $name, 'is_defined_test' => false), $lineno);
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- $name = $this->getAttribute('name');
- $function = $compiler->getEnvironment()->getFunction($name);
-
- $this->setAttribute('name', $name);
- $this->setAttribute('type', 'function');
- $this->setAttribute('thing', $function);
- $this->setAttribute('needs_environment', $function->needsEnvironment());
- $this->setAttribute('needs_context', $function->needsContext());
- $this->setAttribute('arguments', $function->getArguments());
- if ($function instanceof Twig_FunctionCallableInterface || $function instanceof Twig_SimpleFunction) {
- $callable = $function->getCallable();
- if ('constant' === $name && $this->getAttribute('is_defined_test')) {
- $callable = 'twig_constant_is_defined';
- }
-
- $this->setAttribute('callable', $callable);
- }
- if ($function instanceof Twig_SimpleFunction) {
- $this->setAttribute('is_variadic', $function->isVariadic());
- }
-
- $this->compileCallable($compiler);
- }
-}
-
-class_alias('Twig_Node_Expression_Function', 'Twig\Node\Expression\FunctionExpression', false);
diff --git a/inc/lib/Twig/Node/Expression/GetAttr.php b/inc/lib/Twig/Node/Expression/GetAttr.php
deleted file mode 100644
index b7823acc..00000000
--- a/inc/lib/Twig/Node/Expression/GetAttr.php
+++ /dev/null
@@ -1,74 +0,0 @@
- $node, 'attribute' => $attribute);
- if (null !== $arguments) {
- $nodes['arguments'] = $arguments;
- }
-
- parent::__construct($nodes, array('type' => $type, 'is_defined_test' => false, 'ignore_strict_check' => false, 'disable_c_ext' => false), $lineno);
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- if ($this->getAttribute('disable_c_ext')) {
- @trigger_error(sprintf('Using the "disable_c_ext" attribute on %s is deprecated since version 1.30 and will be removed in 2.0.', __CLASS__), E_USER_DEPRECATED);
- }
-
- if (function_exists('twig_template_get_attributes') && !$this->getAttribute('disable_c_ext')) {
- $compiler->raw('twig_template_get_attributes($this, ');
- } else {
- $compiler->raw('$this->getAttribute(');
- }
-
- if ($this->getAttribute('ignore_strict_check')) {
- $this->getNode('node')->setAttribute('ignore_strict_check', true);
- }
-
- $compiler->subcompile($this->getNode('node'));
-
- $compiler->raw(', ')->subcompile($this->getNode('attribute'));
-
- // only generate optional arguments when needed (to make generated code more readable)
- $needFourth = $this->getAttribute('ignore_strict_check');
- $needThird = $needFourth || $this->getAttribute('is_defined_test');
- $needSecond = $needThird || Twig_Template::ANY_CALL !== $this->getAttribute('type');
- $needFirst = $needSecond || $this->hasNode('arguments');
-
- if ($needFirst) {
- if ($this->hasNode('arguments')) {
- $compiler->raw(', ')->subcompile($this->getNode('arguments'));
- } else {
- $compiler->raw(', array()');
- }
- }
-
- if ($needSecond) {
- $compiler->raw(', ')->repr($this->getAttribute('type'));
- }
-
- if ($needThird) {
- $compiler->raw(', ')->repr($this->getAttribute('is_defined_test'));
- }
-
- if ($needFourth) {
- $compiler->raw(', ')->repr($this->getAttribute('ignore_strict_check'));
- }
-
- $compiler->raw(')');
- }
-}
-
-class_alias('Twig_Node_Expression_GetAttr', 'Twig\Node\Expression\GetAttrExpression', false);
diff --git a/inc/lib/Twig/Node/Expression/MacroCall.php b/inc/lib/Twig/Node/Expression/MacroCall.php
deleted file mode 100644
index 3e6b8c12..00000000
--- a/inc/lib/Twig/Node/Expression/MacroCall.php
+++ /dev/null
@@ -1,60 +0,0 @@
-
- */
-class Twig_Node_Expression_MacroCall extends Twig_Node_Expression
-{
- public function __construct(Twig_Node_Expression $template, $name, Twig_Node_Expression_Array $arguments, $lineno)
- {
- parent::__construct(array('template' => $template, 'arguments' => $arguments), array('name' => $name), $lineno);
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- $namedNames = array();
- $namedCount = 0;
- $positionalCount = 0;
- foreach ($this->getNode('arguments')->getKeyValuePairs() as $pair) {
- $name = $pair['key']->getAttribute('value');
- if (!is_int($name)) {
- $namedCount++;
- $namedNames[$name] = 1;
- } elseif ($namedCount > 0) {
- throw new Twig_Error_Syntax(sprintf('Positional arguments cannot be used after named arguments for macro "%s".', $this->getAttribute('name')), $this->lineno);
- } else {
- $positionalCount++;
- }
- }
-
- $compiler
- ->raw('$this->callMacro(')
- ->subcompile($this->getNode('template'))
- ->raw(', ')->repr($this->getAttribute('name'))
- ->raw(', ')->subcompile($this->getNode('arguments'))
- ;
-
- if ($namedCount > 0) {
- $compiler
- ->raw(', ')->repr($namedNames)
- ->raw(', ')->repr($namedCount)
- ->raw(', ')->repr($positionalCount)
- ;
- }
-
- $compiler
- ->raw(')')
- ;
- }
-}
diff --git a/inc/lib/Twig/Node/Expression/MethodCall.php b/inc/lib/Twig/Node/Expression/MethodCall.php
deleted file mode 100644
index 709016eb..00000000
--- a/inc/lib/Twig/Node/Expression/MethodCall.php
+++ /dev/null
@@ -1,43 +0,0 @@
- $node, 'arguments' => $arguments), array('method' => $method, 'safe' => false), $lineno);
-
- if ($node instanceof Twig_Node_Expression_Name) {
- $node->setAttribute('always_defined', true);
- }
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- $compiler
- ->subcompile($this->getNode('node'))
- ->raw('->')
- ->raw($this->getAttribute('method'))
- ->raw('(')
- ;
- $first = true;
- foreach ($this->getNode('arguments')->getKeyValuePairs() as $pair) {
- if (!$first) {
- $compiler->raw(', ');
- }
- $first = false;
-
- $compiler->subcompile($pair['value']);
- }
- $compiler->raw(')');
- }
-}
-
-class_alias('Twig_Node_Expression_MethodCall', 'Twig\Node\Expression\MethodCallExpression', false);
diff --git a/inc/lib/Twig/Node/Expression/Name.php b/inc/lib/Twig/Node/Expression/Name.php
deleted file mode 100644
index 9d5a21f8..00000000
--- a/inc/lib/Twig/Node/Expression/Name.php
+++ /dev/null
@@ -1,102 +0,0 @@
- '$this',
- '_context' => '$context',
- '_charset' => '$this->env->getCharset()',
- );
-
- public function __construct($name, $lineno)
- {
- parent::__construct(array(), array('name' => $name, 'is_defined_test' => false, 'ignore_strict_check' => false, 'always_defined' => false), $lineno);
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- $name = $this->getAttribute('name');
-
- $compiler->addDebugInfo($this);
-
- if ($this->getAttribute('is_defined_test')) {
- if ($this->isSpecial()) {
- $compiler->repr(true);
- } else {
- $compiler->raw('array_key_exists(')->repr($name)->raw(', $context)');
- }
- } elseif ($this->isSpecial()) {
- $compiler->raw($this->specialVars[$name]);
- } elseif ($this->getAttribute('always_defined')) {
- $compiler
- ->raw('$context[')
- ->string($name)
- ->raw(']')
- ;
- } else {
- if (PHP_VERSION_ID >= 70000) {
- // use PHP 7 null coalescing operator
- $compiler
- ->raw('($context[')
- ->string($name)
- ->raw('] ?? ')
- ;
-
- if ($this->getAttribute('ignore_strict_check') || !$compiler->getEnvironment()->isStrictVariables()) {
- $compiler->raw('null)');
- } else {
- $compiler->raw('$this->getContext($context, ')->string($name)->raw('))');
- }
- } elseif (PHP_VERSION_ID >= 50400) {
- // PHP 5.4 ternary operator performance was optimized
- $compiler
- ->raw('(isset($context[')
- ->string($name)
- ->raw(']) ? $context[')
- ->string($name)
- ->raw('] : ')
- ;
-
- if ($this->getAttribute('ignore_strict_check') || !$compiler->getEnvironment()->isStrictVariables()) {
- $compiler->raw('null)');
- } else {
- $compiler->raw('$this->getContext($context, ')->string($name)->raw('))');
- }
- } else {
- $compiler
- ->raw('$this->getContext($context, ')
- ->string($name)
- ;
-
- if ($this->getAttribute('ignore_strict_check')) {
- $compiler->raw(', true');
- }
-
- $compiler
- ->raw(')')
- ;
- }
- }
- }
-
- public function isSpecial()
- {
- return isset($this->specialVars[$this->getAttribute('name')]);
- }
-
- public function isSimple()
- {
- return !$this->isSpecial() && !$this->getAttribute('is_defined_test');
- }
-}
-
-class_alias('Twig_Node_Expression_Name', 'Twig\Node\Expression\NameExpression', false);
diff --git a/inc/lib/Twig/Node/Expression/NullCoalesce.php b/inc/lib/Twig/Node/Expression/NullCoalesce.php
deleted file mode 100644
index eaafa4c9..00000000
--- a/inc/lib/Twig/Node/Expression/NullCoalesce.php
+++ /dev/null
@@ -1,48 +0,0 @@
-getTemplateLine()),
- new Twig_Node_Expression_Unary_Not(new Twig_Node_Expression_Test_Null($left, 'null', new Twig_Node(), $left->getTemplateLine()), $left->getTemplateLine()),
- $left->getTemplateLine()
- );
-
- parent::__construct($test, $left, $right, $lineno);
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- /*
- * This optimizes only one case. PHP 7 also supports more complex expressions
- * that can return null. So, for instance, if log is defined, log("foo") ?? "..." works,
- * but log($a["foo"]) ?? "..." does not if $a["foo"] is not defined. More advanced
- * cases might be implemented as an optimizer node visitor, but has not been done
- * as benefits are probably not worth the added complexity.
- */
- if (PHP_VERSION_ID >= 70000 && $this->getNode('expr2') instanceof Twig_Node_Expression_Name) {
- $this->getNode('expr2')->setAttribute('always_defined', true);
- $compiler
- ->raw('((')
- ->subcompile($this->getNode('expr2'))
- ->raw(') ?? (')
- ->subcompile($this->getNode('expr3'))
- ->raw('))')
- ;
- } else {
- parent::compile($compiler);
- }
- }
-}
-
-class_alias('Twig_Node_Expression_NullCoalesce', 'Twig\Node\Expression\NullCoalesceExpression', false);
diff --git a/inc/lib/Twig/Node/Expression/Parent.php b/inc/lib/Twig/Node/Expression/Parent.php
deleted file mode 100644
index 78692db2..00000000
--- a/inc/lib/Twig/Node/Expression/Parent.php
+++ /dev/null
@@ -1,44 +0,0 @@
-
- */
-class Twig_Node_Expression_Parent extends Twig_Node_Expression
-{
- public function __construct($name, $lineno, $tag = null)
- {
- parent::__construct(array(), array('output' => false, 'name' => $name), $lineno, $tag);
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- if ($this->getAttribute('output')) {
- $compiler
- ->addDebugInfo($this)
- ->write('$this->displayParentBlock(')
- ->string($this->getAttribute('name'))
- ->raw(", \$context, \$blocks);\n")
- ;
- } else {
- $compiler
- ->raw('$this->renderParentBlock(')
- ->string($this->getAttribute('name'))
- ->raw(', $context, $blocks)')
- ;
- }
- }
-}
-
-class_alias('Twig_Node_Expression_Parent', 'Twig\Node\Expression\ParentExpression', false);
diff --git a/inc/lib/Twig/Node/Expression/TempName.php b/inc/lib/Twig/Node/Expression/TempName.php
deleted file mode 100644
index 0a86e003..00000000
--- a/inc/lib/Twig/Node/Expression/TempName.php
+++ /dev/null
@@ -1,28 +0,0 @@
- $name), $lineno);
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- $compiler
- ->raw('$_')
- ->raw($this->getAttribute('name'))
- ->raw('_')
- ;
- }
-}
-
-class_alias('Twig_Node_Expression_TempName', 'Twig\Node\Expression\TempNameExpression', false);
diff --git a/inc/lib/Twig/Node/Expression/Test.php b/inc/lib/Twig/Node/Expression/Test.php
deleted file mode 100644
index ad102ba6..00000000
--- a/inc/lib/Twig/Node/Expression/Test.php
+++ /dev/null
@@ -1,42 +0,0 @@
- $node);
- if (null !== $arguments) {
- $nodes['arguments'] = $arguments;
- }
-
- parent::__construct($nodes, array('name' => $name), $lineno);
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- $name = $this->getAttribute('name');
- $test = $compiler->getEnvironment()->getTest($name);
-
- $this->setAttribute('name', $name);
- $this->setAttribute('type', 'test');
- $this->setAttribute('thing', $test);
- if ($test instanceof Twig_TestCallableInterface || $test instanceof Twig_SimpleTest) {
- $this->setAttribute('callable', $test->getCallable());
- }
- if ($test instanceof Twig_SimpleTest) {
- $this->setAttribute('is_variadic', $test->isVariadic());
- }
-
- $this->compileCallable($compiler);
- }
-}
-
-class_alias('Twig_Node_Expression_Test', 'Twig\Node\Expression\TestExpression', false);
diff --git a/inc/lib/Twig/Node/Expression/Test/Constant.php b/inc/lib/Twig/Node/Expression/Test/Constant.php
deleted file mode 100644
index a51a4ba1..00000000
--- a/inc/lib/Twig/Node/Expression/Test/Constant.php
+++ /dev/null
@@ -1,48 +0,0 @@
-
- * {% if post.status is constant('Post::PUBLISHED') %}
- * the status attribute is exactly the same as Post::PUBLISHED
- * {% endif %}
- *
- *
- * @author Fabien Potencier
- */
-class Twig_Node_Expression_Test_Constant extends Twig_Node_Expression_Test
-{
- public function compile(Twig_Compiler $compiler)
- {
- $compiler
- ->raw('(')
- ->subcompile($this->getNode('node'))
- ->raw(' === constant(')
- ;
-
- if ($this->getNode('arguments')->hasNode(1)) {
- $compiler
- ->raw('get_class(')
- ->subcompile($this->getNode('arguments')->getNode(1))
- ->raw(')."::".')
- ;
- }
-
- $compiler
- ->subcompile($this->getNode('arguments')->getNode(0))
- ->raw('))')
- ;
- }
-}
-
-class_alias('Twig_Node_Expression_Test_Constant', 'Twig\Node\Expression\Test\ConstantTest', false);
diff --git a/inc/lib/Twig/Node/Expression/Test/Defined.php b/inc/lib/Twig/Node/Expression/Test/Defined.php
deleted file mode 100644
index 2136c390..00000000
--- a/inc/lib/Twig/Node/Expression/Test/Defined.php
+++ /dev/null
@@ -1,61 +0,0 @@
-
- * {# defined works with variable names and variable attributes #}
- * {% if foo is defined %}
- * {# ... #}
- * {% endif %}
- *
- *
- * @author Fabien Potencier
- */
-class Twig_Node_Expression_Test_Defined extends Twig_Node_Expression_Test
-{
- public function __construct(Twig_NodeInterface $node, $name, Twig_NodeInterface $arguments = null, $lineno)
- {
- if ($node instanceof Twig_Node_Expression_Name) {
- $node->setAttribute('is_defined_test', true);
- } elseif ($node instanceof Twig_Node_Expression_GetAttr) {
- $node->setAttribute('is_defined_test', true);
- $this->changeIgnoreStrictCheck($node);
- } elseif ($node instanceof Twig_Node_Expression_BlockReference) {
- $node->setAttribute('is_defined_test', true);
- } elseif ($node instanceof Twig_Node_Expression_Function && 'constant' === $node->getAttribute('name')) {
- $node->setAttribute('is_defined_test', true);
- } elseif ($node instanceof Twig_Node_Expression_Constant || $node instanceof Twig_Node_Expression_Array) {
- $node = new Twig_Node_Expression_Constant(true, $node->getTemplateLine());
- } else {
- throw new Twig_Error_Syntax('The "defined" test only works with simple variables.', $this->getTemplateLine());
- }
-
- parent::__construct($node, $name, $arguments, $lineno);
- }
-
- protected function changeIgnoreStrictCheck(Twig_Node_Expression_GetAttr $node)
- {
- $node->setAttribute('ignore_strict_check', true);
-
- if ($node->getNode('node') instanceof Twig_Node_Expression_GetAttr) {
- $this->changeIgnoreStrictCheck($node->getNode('node'));
- }
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- $compiler->subcompile($this->getNode('node'));
- }
-}
-
-class_alias('Twig_Node_Expression_Test_Defined', 'Twig\Node\Expression\Test\DefinedTest', false);
diff --git a/inc/lib/Twig/Node/Expression/Test/Divisibleby.php b/inc/lib/Twig/Node/Expression/Test/Divisibleby.php
deleted file mode 100644
index a5d71961..00000000
--- a/inc/lib/Twig/Node/Expression/Test/Divisibleby.php
+++ /dev/null
@@ -1,35 +0,0 @@
-
- * {% if loop.index is divisible by(3) %}
- *
- *
- * @author Fabien Potencier
- */
-class Twig_Node_Expression_Test_Divisibleby extends Twig_Node_Expression_Test
-{
- public function compile(Twig_Compiler $compiler)
- {
- $compiler
- ->raw('(0 == ')
- ->subcompile($this->getNode('node'))
- ->raw(' % ')
- ->subcompile($this->getNode('arguments')->getNode(0))
- ->raw(')')
- ;
- }
-}
-
-class_alias('Twig_Node_Expression_Test_Divisibleby', 'Twig\Node\Expression\Test\DivisiblebyTest', false);
diff --git a/inc/lib/Twig/Node/Expression/Test/Even.php b/inc/lib/Twig/Node/Expression/Test/Even.php
deleted file mode 100644
index 7e198bea..00000000
--- a/inc/lib/Twig/Node/Expression/Test/Even.php
+++ /dev/null
@@ -1,34 +0,0 @@
-
- * {{ var is even }}
- *
- *
- * @author Fabien Potencier
- */
-class Twig_Node_Expression_Test_Even extends Twig_Node_Expression_Test
-{
- public function compile(Twig_Compiler $compiler)
- {
- $compiler
- ->raw('(')
- ->subcompile($this->getNode('node'))
- ->raw(' % 2 == 0')
- ->raw(')')
- ;
- }
-}
-
-class_alias('Twig_Node_Expression_Test_Even', 'Twig\Node\Expression\Test\EvenTest', false);
diff --git a/inc/lib/Twig/Node/Expression/Test/Null.php b/inc/lib/Twig/Node/Expression/Test/Null.php
deleted file mode 100644
index 3746e4cb..00000000
--- a/inc/lib/Twig/Node/Expression/Test/Null.php
+++ /dev/null
@@ -1,33 +0,0 @@
-
- * {{ var is none }}
- *
- *
- * @author Fabien Potencier
- */
-class Twig_Node_Expression_Test_Null extends Twig_Node_Expression_Test
-{
- public function compile(Twig_Compiler $compiler)
- {
- $compiler
- ->raw('(null === ')
- ->subcompile($this->getNode('node'))
- ->raw(')')
- ;
- }
-}
-
-class_alias('Twig_Node_Expression_Test_Null', 'Twig\Node\Expression\Test\NullTest', false);
diff --git a/inc/lib/Twig/Node/Expression/Test/Odd.php b/inc/lib/Twig/Node/Expression/Test/Odd.php
deleted file mode 100644
index 0c6c099b..00000000
--- a/inc/lib/Twig/Node/Expression/Test/Odd.php
+++ /dev/null
@@ -1,34 +0,0 @@
-
- * {{ var is odd }}
- *
- *
- * @author Fabien Potencier
- */
-class Twig_Node_Expression_Test_Odd extends Twig_Node_Expression_Test
-{
- public function compile(Twig_Compiler $compiler)
- {
- $compiler
- ->raw('(')
- ->subcompile($this->getNode('node'))
- ->raw(' % 2 == 1')
- ->raw(')')
- ;
- }
-}
-
-class_alias('Twig_Node_Expression_Test_Odd', 'Twig\Node\Expression\Test\OddTest', false);
diff --git a/inc/lib/Twig/Node/Expression/Test/Sameas.php b/inc/lib/Twig/Node/Expression/Test/Sameas.php
deleted file mode 100644
index e95ff1f2..00000000
--- a/inc/lib/Twig/Node/Expression/Test/Sameas.php
+++ /dev/null
@@ -1,31 +0,0 @@
-
- */
-class Twig_Node_Expression_Test_Sameas extends Twig_Node_Expression_Test
-{
- public function compile(Twig_Compiler $compiler)
- {
- $compiler
- ->raw('(')
- ->subcompile($this->getNode('node'))
- ->raw(' === ')
- ->subcompile($this->getNode('arguments')->getNode(0))
- ->raw(')')
- ;
- }
-}
-
-class_alias('Twig_Node_Expression_Test_Sameas', 'Twig\Node\Expression\Test\SameasTest', false);
diff --git a/inc/lib/Twig/Node/Expression/Unary.php b/inc/lib/Twig/Node/Expression/Unary.php
deleted file mode 100644
index 5804485e..00000000
--- a/inc/lib/Twig/Node/Expression/Unary.php
+++ /dev/null
@@ -1,29 +0,0 @@
- $node), array(), $lineno);
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- $compiler->raw(' ');
- $this->operator($compiler);
- $compiler->subcompile($this->getNode('node'));
- }
-
- abstract public function operator(Twig_Compiler $compiler);
-}
-
-class_alias('Twig_Node_Expression_Unary', 'Twig\Node\Expression\Unary\AbstractUnary', false);
diff --git a/inc/lib/Twig/Node/Expression/Unary/Neg.php b/inc/lib/Twig/Node/Expression/Unary/Neg.php
deleted file mode 100644
index 039d933d..00000000
--- a/inc/lib/Twig/Node/Expression/Unary/Neg.php
+++ /dev/null
@@ -1,20 +0,0 @@
-raw('-');
- }
-}
-
-class_alias('Twig_Node_Expression_Unary_Neg', 'Twig\Node\Expression\Unary\NegUnary', false);
diff --git a/inc/lib/Twig/Node/Expression/Unary/Not.php b/inc/lib/Twig/Node/Expression/Unary/Not.php
deleted file mode 100644
index a0860b18..00000000
--- a/inc/lib/Twig/Node/Expression/Unary/Not.php
+++ /dev/null
@@ -1,20 +0,0 @@
-raw('!');
- }
-}
-
-class_alias('Twig_Node_Expression_Unary_Not', 'Twig\Node\Expression\Unary\NotUnary', false);
diff --git a/inc/lib/Twig/Node/Expression/Unary/Pos.php b/inc/lib/Twig/Node/Expression/Unary/Pos.php
deleted file mode 100644
index eeff5452..00000000
--- a/inc/lib/Twig/Node/Expression/Unary/Pos.php
+++ /dev/null
@@ -1,20 +0,0 @@
-raw('+');
- }
-}
-
-class_alias('Twig_Node_Expression_Unary_Pos', 'Twig\Node\Expression\Unary\PosUnary', false);
diff --git a/inc/lib/Twig/Node/Flush.php b/inc/lib/Twig/Node/Flush.php
deleted file mode 100644
index fcc461ac..00000000
--- a/inc/lib/Twig/Node/Flush.php
+++ /dev/null
@@ -1,33 +0,0 @@
-
- */
-class Twig_Node_Flush extends Twig_Node
-{
- public function __construct($lineno, $tag)
- {
- parent::__construct(array(), array(), $lineno, $tag);
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- $compiler
- ->addDebugInfo($this)
- ->write("flush();\n")
- ;
- }
-}
-
-class_alias('Twig_Node_Flush', 'Twig\Node\FlushNode', false);
diff --git a/inc/lib/Twig/Node/For.php b/inc/lib/Twig/Node/For.php
deleted file mode 100644
index 914b70c9..00000000
--- a/inc/lib/Twig/Node/For.php
+++ /dev/null
@@ -1,113 +0,0 @@
-
- */
-class Twig_Node_For extends Twig_Node
-{
- protected $loop;
-
- public function __construct(Twig_Node_Expression_AssignName $keyTarget, Twig_Node_Expression_AssignName $valueTarget, Twig_Node_Expression $seq, Twig_Node_Expression $ifexpr = null, Twig_NodeInterface $body, Twig_NodeInterface $else = null, $lineno, $tag = null)
- {
- $body = new Twig_Node(array($body, $this->loop = new Twig_Node_ForLoop($lineno, $tag)));
-
- if (null !== $ifexpr) {
- $body = new Twig_Node_If(new Twig_Node(array($ifexpr, $body)), null, $lineno, $tag);
- }
-
- $nodes = array('key_target' => $keyTarget, 'value_target' => $valueTarget, 'seq' => $seq, 'body' => $body);
- if (null !== $else) {
- $nodes['else'] = $else;
- }
-
- parent::__construct($nodes, array('with_loop' => true, 'ifexpr' => null !== $ifexpr), $lineno, $tag);
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- $compiler
- ->addDebugInfo($this)
- ->write("\$context['_parent'] = \$context;\n")
- ->write("\$context['_seq'] = twig_ensure_traversable(")
- ->subcompile($this->getNode('seq'))
- ->raw(");\n")
- ;
-
- if ($this->hasNode('else')) {
- $compiler->write("\$context['_iterated'] = false;\n");
- }
-
- if ($this->getAttribute('with_loop')) {
- $compiler
- ->write("\$context['loop'] = array(\n")
- ->write(" 'parent' => \$context['_parent'],\n")
- ->write(" 'index0' => 0,\n")
- ->write(" 'index' => 1,\n")
- ->write(" 'first' => true,\n")
- ->write(");\n")
- ;
-
- if (!$this->getAttribute('ifexpr')) {
- $compiler
- ->write("if (is_array(\$context['_seq']) || (is_object(\$context['_seq']) && \$context['_seq'] instanceof Countable)) {\n")
- ->indent()
- ->write("\$length = count(\$context['_seq']);\n")
- ->write("\$context['loop']['revindex0'] = \$length - 1;\n")
- ->write("\$context['loop']['revindex'] = \$length;\n")
- ->write("\$context['loop']['length'] = \$length;\n")
- ->write("\$context['loop']['last'] = 1 === \$length;\n")
- ->outdent()
- ->write("}\n")
- ;
- }
- }
-
- $this->loop->setAttribute('else', $this->hasNode('else'));
- $this->loop->setAttribute('with_loop', $this->getAttribute('with_loop'));
- $this->loop->setAttribute('ifexpr', $this->getAttribute('ifexpr'));
-
- $compiler
- ->write("foreach (\$context['_seq'] as ")
- ->subcompile($this->getNode('key_target'))
- ->raw(' => ')
- ->subcompile($this->getNode('value_target'))
- ->raw(") {\n")
- ->indent()
- ->subcompile($this->getNode('body'))
- ->outdent()
- ->write("}\n")
- ;
-
- if ($this->hasNode('else')) {
- $compiler
- ->write("if (!\$context['_iterated']) {\n")
- ->indent()
- ->subcompile($this->getNode('else'))
- ->outdent()
- ->write("}\n")
- ;
- }
-
- $compiler->write("\$_parent = \$context['_parent'];\n");
-
- // remove some "private" loop variables (needed for nested loops)
- $compiler->write('unset($context[\'_seq\'], $context[\'_iterated\'], $context[\''.$this->getNode('key_target')->getAttribute('name').'\'], $context[\''.$this->getNode('value_target')->getAttribute('name').'\'], $context[\'_parent\'], $context[\'loop\']);'."\n");
-
- // keep the values set in the inner context for variables defined in the outer context
- $compiler->write("\$context = array_intersect_key(\$context, \$_parent) + \$_parent;\n");
- }
-}
-
-class_alias('Twig_Node_For', 'Twig\Node\ForNode', false);
diff --git a/inc/lib/Twig/Node/ForLoop.php b/inc/lib/Twig/Node/ForLoop.php
deleted file mode 100644
index 06477cf1..00000000
--- a/inc/lib/Twig/Node/ForLoop.php
+++ /dev/null
@@ -1,52 +0,0 @@
-
- */
-class Twig_Node_ForLoop extends Twig_Node
-{
- public function __construct($lineno, $tag = null)
- {
- parent::__construct(array(), array('with_loop' => false, 'ifexpr' => false, 'else' => false), $lineno, $tag);
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- if ($this->getAttribute('else')) {
- $compiler->write("\$context['_iterated'] = true;\n");
- }
-
- if ($this->getAttribute('with_loop')) {
- $compiler
- ->write("++\$context['loop']['index0'];\n")
- ->write("++\$context['loop']['index'];\n")
- ->write("\$context['loop']['first'] = false;\n")
- ;
-
- if (!$this->getAttribute('ifexpr')) {
- $compiler
- ->write("if (isset(\$context['loop']['length'])) {\n")
- ->indent()
- ->write("--\$context['loop']['revindex0'];\n")
- ->write("--\$context['loop']['revindex'];\n")
- ->write("\$context['loop']['last'] = 0 === \$context['loop']['revindex0'];\n")
- ->outdent()
- ->write("}\n")
- ;
- }
- }
- }
-}
-
-class_alias('Twig_Node_ForLoop', 'Twig\Node\ForLoopNode', false);
diff --git a/inc/lib/Twig/Node/If.php b/inc/lib/Twig/Node/If.php
deleted file mode 100644
index d82edec7..00000000
--- a/inc/lib/Twig/Node/If.php
+++ /dev/null
@@ -1,68 +0,0 @@
-
- */
-class Twig_Node_If extends Twig_Node
-{
- public function __construct(Twig_NodeInterface $tests, Twig_NodeInterface $else = null, $lineno, $tag = null)
- {
- $nodes = array('tests' => $tests);
- if (null !== $else) {
- $nodes['else'] = $else;
- }
-
- parent::__construct($nodes, array(), $lineno, $tag);
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- $compiler->addDebugInfo($this);
- for ($i = 0, $count = count($this->getNode('tests')); $i < $count; $i += 2) {
- if ($i > 0) {
- $compiler
- ->outdent()
- ->write('} elseif (')
- ;
- } else {
- $compiler
- ->write('if (')
- ;
- }
-
- $compiler
- ->subcompile($this->getNode('tests')->getNode($i))
- ->raw(") {\n")
- ->indent()
- ->subcompile($this->getNode('tests')->getNode($i + 1))
- ;
- }
-
- if ($this->hasNode('else')) {
- $compiler
- ->outdent()
- ->write("} else {\n")
- ->indent()
- ->subcompile($this->getNode('else'))
- ;
- }
-
- $compiler
- ->outdent()
- ->write("}\n");
- }
-}
-
-class_alias('Twig_Node_If', 'Twig\Node\IfNode', false);
diff --git a/inc/lib/Twig/Node/Import.php b/inc/lib/Twig/Node/Import.php
deleted file mode 100644
index c77e320b..00000000
--- a/inc/lib/Twig/Node/Import.php
+++ /dev/null
@@ -1,51 +0,0 @@
-
- */
-class Twig_Node_Import extends Twig_Node
-{
- public function __construct(Twig_Node_Expression $expr, Twig_Node_Expression $var, $lineno, $tag = null)
- {
- parent::__construct(array('expr' => $expr, 'var' => $var), array(), $lineno, $tag);
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- $compiler
- ->addDebugInfo($this)
- ->write('')
- ->subcompile($this->getNode('var'))
- ->raw(' = ')
- ;
-
- if ($this->getNode('expr') instanceof Twig_Node_Expression_Name && '_self' === $this->getNode('expr')->getAttribute('name')) {
- $compiler->raw('$this');
- } else {
- $compiler
- ->raw('$this->loadTemplate(')
- ->subcompile($this->getNode('expr'))
- ->raw(', ')
- ->repr($this->getTemplateName())
- ->raw(', ')
- ->repr($this->getTemplateLine())
- ->raw(')')
- ;
- }
-
- $compiler->raw(";\n");
- }
-}
-
-class_alias('Twig_Node_Import', 'Twig\Node\ImportNode', false);
diff --git a/inc/lib/Twig/Node/Include.php b/inc/lib/Twig/Node/Include.php
deleted file mode 100644
index 2a5114cb..00000000
--- a/inc/lib/Twig/Node/Include.php
+++ /dev/null
@@ -1,90 +0,0 @@
-
- */
-class Twig_Node_Include extends Twig_Node implements Twig_NodeOutputInterface
-{
- public function __construct(Twig_Node_Expression $expr, Twig_Node_Expression $variables = null, $only = false, $ignoreMissing = false, $lineno, $tag = null)
- {
- $nodes = array('expr' => $expr);
- if (null !== $variables) {
- $nodes['variables'] = $variables;
- }
-
- parent::__construct($nodes, array('only' => (bool) $only, 'ignore_missing' => (bool) $ignoreMissing), $lineno, $tag);
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- $compiler->addDebugInfo($this);
-
- if ($this->getAttribute('ignore_missing')) {
- $compiler
- ->write("try {\n")
- ->indent()
- ;
- }
-
- $this->addGetTemplate($compiler);
-
- $compiler->raw('->display(');
-
- $this->addTemplateArguments($compiler);
-
- $compiler->raw(");\n");
-
- if ($this->getAttribute('ignore_missing')) {
- $compiler
- ->outdent()
- ->write("} catch (Twig_Error_Loader \$e) {\n")
- ->indent()
- ->write("// ignore missing template\n")
- ->outdent()
- ->write("}\n\n")
- ;
- }
- }
-
- protected function addGetTemplate(Twig_Compiler $compiler)
- {
- $compiler
- ->write('$this->loadTemplate(')
- ->subcompile($this->getNode('expr'))
- ->raw(', ')
- ->repr($this->getTemplateName())
- ->raw(', ')
- ->repr($this->getTemplateLine())
- ->raw(')')
- ;
- }
-
- protected function addTemplateArguments(Twig_Compiler $compiler)
- {
- if (!$this->hasNode('variables')) {
- $compiler->raw(false === $this->getAttribute('only') ? '$context' : 'array()');
- } elseif (false === $this->getAttribute('only')) {
- $compiler
- ->raw('array_merge($context, ')
- ->subcompile($this->getNode('variables'))
- ->raw(')')
- ;
- } else {
- $compiler->subcompile($this->getNode('variables'));
- }
- }
-}
-
-class_alias('Twig_Node_Include', 'Twig\Node\IncludeNode', false);
diff --git a/inc/lib/Twig/Node/Macro.php b/inc/lib/Twig/Node/Macro.php
deleted file mode 100644
index 3cf54977..00000000
--- a/inc/lib/Twig/Node/Macro.php
+++ /dev/null
@@ -1,125 +0,0 @@
-
- */
-class Twig_Node_Macro extends Twig_Node
-{
- const VARARGS_NAME = 'varargs';
-
- public function __construct($name, Twig_NodeInterface $body, Twig_NodeInterface $arguments, $lineno, $tag = null)
- {
- foreach ($arguments as $argumentName => $argument) {
- if (self::VARARGS_NAME === $argumentName) {
- throw new Twig_Error_Syntax(sprintf('The argument "%s" in macro "%s" cannot be defined because the variable "%s" is reserved for arbitrary arguments.', self::VARARGS_NAME, $name, self::VARARGS_NAME), $argument->getTemplateLine());
- }
- }
-
- parent::__construct(array('body' => $body, 'arguments' => $arguments), array('name' => $name), $lineno, $tag);
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- $compiler
- ->addDebugInfo($this)
- ->write(sprintf('public function get%s(', $this->getAttribute('name')))
- ;
-
- $count = count($this->getNode('arguments'));
- $pos = 0;
- foreach ($this->getNode('arguments') as $name => $default) {
- $compiler
- ->raw('$__'.$name.'__ = ')
- ->subcompile($default)
- ;
-
- if (++$pos < $count) {
- $compiler->raw(', ');
- }
- }
-
- if (PHP_VERSION_ID >= 50600) {
- if ($count) {
- $compiler->raw(', ');
- }
-
- $compiler->raw('...$__varargs__');
- }
-
- $compiler
- ->raw(")\n")
- ->write("{\n")
- ->indent()
- ;
-
- $compiler
- ->write("\$context = \$this->env->mergeGlobals(array(\n")
- ->indent()
- ;
-
- foreach ($this->getNode('arguments') as $name => $default) {
- $compiler
- ->write('')
- ->string($name)
- ->raw(' => $__'.$name.'__')
- ->raw(",\n")
- ;
- }
-
- $compiler
- ->write('')
- ->string(self::VARARGS_NAME)
- ->raw(' => ')
- ;
-
- if (PHP_VERSION_ID >= 50600) {
- $compiler->raw("\$__varargs__,\n");
- } else {
- $compiler
- ->raw('func_num_args() > ')
- ->repr($count)
- ->raw(' ? array_slice(func_get_args(), ')
- ->repr($count)
- ->raw(") : array(),\n")
- ;
- }
-
- $compiler
- ->outdent()
- ->write("));\n\n")
- ->write("\$blocks = array();\n\n")
- ->write("ob_start();\n")
- ->write("try {\n")
- ->indent()
- ->subcompile($this->getNode('body'))
- ->outdent()
- ->write("} catch (Exception \$e) {\n")
- ->indent()
- ->write("ob_end_clean();\n\n")
- ->write("throw \$e;\n")
- ->outdent()
- ->write("} catch (Throwable \$e) {\n")
- ->indent()
- ->write("ob_end_clean();\n\n")
- ->write("throw \$e;\n")
- ->outdent()
- ->write("}\n\n")
- ->write("return ('' === \$tmp = ob_get_clean()) ? '' : new Twig_Markup(\$tmp, \$this->env->getCharset());\n")
- ->outdent()
- ->write("}\n\n")
- ;
- }
-}
-
-class_alias('Twig_Node_Macro', 'Twig\Node\MacroNode', false);
diff --git a/inc/lib/Twig/Node/Module.php b/inc/lib/Twig/Node/Module.php
deleted file mode 100644
index 5cd8d050..00000000
--- a/inc/lib/Twig/Node/Module.php
+++ /dev/null
@@ -1,461 +0,0 @@
-
- */
-class Twig_Node_Module extends Twig_Node
-{
- private $source;
-
- public function __construct(Twig_NodeInterface $body, Twig_Node_Expression $parent = null, Twig_NodeInterface $blocks, Twig_NodeInterface $macros, Twig_NodeInterface $traits, $embeddedTemplates, $name, $source = '')
- {
- if (!$name instanceof Twig_Source) {
- @trigger_error(sprintf('Passing a string as the $name argument of %s() is deprecated since version 1.27. Pass a Twig_Source instance instead.', __METHOD__), E_USER_DEPRECATED);
- $this->source = new Twig_Source($source, $name);
- } else {
- $this->source = $name;
- }
-
- $nodes = array(
- 'body' => $body,
- 'blocks' => $blocks,
- 'macros' => $macros,
- 'traits' => $traits,
- 'display_start' => new Twig_Node(),
- 'display_end' => new Twig_Node(),
- 'constructor_start' => new Twig_Node(),
- 'constructor_end' => new Twig_Node(),
- 'class_end' => new Twig_Node(),
- );
- if (null !== $parent) {
- $nodes['parent'] = $parent;
- }
-
- // embedded templates are set as attributes so that they are only visited once by the visitors
- parent::__construct($nodes, array(
- // source to be remove in 2.0
- 'source' => $this->source->getCode(),
- // filename to be remove in 2.0 (use getTemplateName() instead)
- 'filename' => $this->source->getName(),
- 'index' => null,
- 'embedded_templates' => $embeddedTemplates,
- ), 1);
-
- // populate the template name of all node children
- $this->setTemplateName($this->source->getName());
- }
-
- public function setIndex($index)
- {
- $this->setAttribute('index', $index);
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- $this->compileTemplate($compiler);
-
- foreach ($this->getAttribute('embedded_templates') as $template) {
- $compiler->subcompile($template);
- }
- }
-
- protected function compileTemplate(Twig_Compiler $compiler)
- {
- if (!$this->getAttribute('index')) {
- $compiler->write('compileClassHeader($compiler);
-
- if (
- count($this->getNode('blocks'))
- || count($this->getNode('traits'))
- || !$this->hasNode('parent')
- || $this->getNode('parent') instanceof Twig_Node_Expression_Constant
- || count($this->getNode('constructor_start'))
- || count($this->getNode('constructor_end'))
- ) {
- $this->compileConstructor($compiler);
- }
-
- $this->compileGetParent($compiler);
-
- $this->compileDisplay($compiler);
-
- $compiler->subcompile($this->getNode('blocks'));
-
- $this->compileMacros($compiler);
-
- $this->compileGetTemplateName($compiler);
-
- $this->compileIsTraitable($compiler);
-
- $this->compileDebugInfo($compiler);
-
- $this->compileGetSource($compiler);
-
- $this->compileGetSourceContext($compiler);
-
- $this->compileClassFooter($compiler);
- }
-
- protected function compileGetParent(Twig_Compiler $compiler)
- {
- if (!$this->hasNode('parent')) {
- return;
- }
- $parent = $this->getNode('parent');
-
- $compiler
- ->write("protected function doGetParent(array \$context)\n", "{\n")
- ->indent()
- ->addDebugInfo($parent)
- ->write('return ')
- ;
-
- if ($parent instanceof Twig_Node_Expression_Constant) {
- $compiler->subcompile($parent);
- } else {
- $compiler
- ->raw('$this->loadTemplate(')
- ->subcompile($parent)
- ->raw(', ')
- ->repr($this->source->getName())
- ->raw(', ')
- ->repr($parent->getTemplateLine())
- ->raw(')')
- ;
- }
-
- $compiler
- ->raw(";\n")
- ->outdent()
- ->write("}\n\n")
- ;
- }
-
- protected function compileClassHeader(Twig_Compiler $compiler)
- {
- $compiler
- ->write("\n\n")
- // if the template name contains */, add a blank to avoid a PHP parse error
- ->write('/* '.str_replace('*/', '* /', $this->source->getName())." */\n")
- ->write('class '.$compiler->getEnvironment()->getTemplateClass($this->source->getName(), $this->getAttribute('index')))
- ->raw(sprintf(" extends %s\n", $compiler->getEnvironment()->getBaseTemplateClass()))
- ->write("{\n")
- ->indent()
- ;
- }
-
- protected function compileConstructor(Twig_Compiler $compiler)
- {
- $compiler
- ->write("public function __construct(Twig_Environment \$env)\n", "{\n")
- ->indent()
- ->subcompile($this->getNode('constructor_start'))
- ->write("parent::__construct(\$env);\n\n")
- ;
-
- // parent
- if (!$this->hasNode('parent')) {
- $compiler->write("\$this->parent = false;\n\n");
- } elseif (($parent = $this->getNode('parent')) && $parent instanceof Twig_Node_Expression_Constant) {
- $compiler
- ->addDebugInfo($parent)
- ->write('$this->parent = $this->loadTemplate(')
- ->subcompile($parent)
- ->raw(', ')
- ->repr($this->source->getName())
- ->raw(', ')
- ->repr($parent->getTemplateLine())
- ->raw(");\n")
- ;
- }
-
- $countTraits = count($this->getNode('traits'));
- if ($countTraits) {
- // traits
- foreach ($this->getNode('traits') as $i => $trait) {
- $this->compileLoadTemplate($compiler, $trait->getNode('template'), sprintf('$_trait_%s', $i));
-
- $compiler
- ->addDebugInfo($trait->getNode('template'))
- ->write(sprintf("if (!\$_trait_%s->isTraitable()) {\n", $i))
- ->indent()
- ->write("throw new Twig_Error_Runtime('Template \"'.")
- ->subcompile($trait->getNode('template'))
- ->raw(".'\" cannot be used as a trait.');\n")
- ->outdent()
- ->write("}\n")
- ->write(sprintf("\$_trait_%s_blocks = \$_trait_%s->getBlocks();\n\n", $i, $i))
- ;
-
- foreach ($trait->getNode('targets') as $key => $value) {
- $compiler
- ->write(sprintf('if (!isset($_trait_%s_blocks[', $i))
- ->string($key)
- ->raw("])) {\n")
- ->indent()
- ->write("throw new Twig_Error_Runtime(sprintf('Block ")
- ->string($key)
- ->raw(' is not defined in trait ')
- ->subcompile($trait->getNode('template'))
- ->raw(".'));\n")
- ->outdent()
- ->write("}\n\n")
-
- ->write(sprintf('$_trait_%s_blocks[', $i))
- ->subcompile($value)
- ->raw(sprintf('] = $_trait_%s_blocks[', $i))
- ->string($key)
- ->raw(sprintf(']; unset($_trait_%s_blocks[', $i))
- ->string($key)
- ->raw("]);\n\n")
- ;
- }
- }
-
- if ($countTraits > 1) {
- $compiler
- ->write("\$this->traits = array_merge(\n")
- ->indent()
- ;
-
- for ($i = 0; $i < $countTraits; ++$i) {
- $compiler
- ->write(sprintf('$_trait_%s_blocks'.($i == $countTraits - 1 ? '' : ',')."\n", $i))
- ;
- }
-
- $compiler
- ->outdent()
- ->write(");\n\n")
- ;
- } else {
- $compiler
- ->write("\$this->traits = \$_trait_0_blocks;\n\n")
- ;
- }
-
- $compiler
- ->write("\$this->blocks = array_merge(\n")
- ->indent()
- ->write("\$this->traits,\n")
- ->write("array(\n")
- ;
- } else {
- $compiler
- ->write("\$this->blocks = array(\n")
- ;
- }
-
- // blocks
- $compiler
- ->indent()
- ;
-
- foreach ($this->getNode('blocks') as $name => $node) {
- $compiler
- ->write(sprintf("'%s' => array(\$this, 'block_%s'),\n", $name, $name))
- ;
- }
-
- if ($countTraits) {
- $compiler
- ->outdent()
- ->write(")\n")
- ;
- }
-
- $compiler
- ->outdent()
- ->write(");\n")
- ->outdent()
- ->subcompile($this->getNode('constructor_end'))
- ->write("}\n\n")
- ;
- }
-
- protected function compileDisplay(Twig_Compiler $compiler)
- {
- $compiler
- ->write("protected function doDisplay(array \$context, array \$blocks = array())\n", "{\n")
- ->indent()
- ->subcompile($this->getNode('display_start'))
- ->subcompile($this->getNode('body'))
- ;
-
- if ($this->hasNode('parent')) {
- $parent = $this->getNode('parent');
- $compiler->addDebugInfo($parent);
- if ($parent instanceof Twig_Node_Expression_Constant) {
- $compiler->write('$this->parent');
- } else {
- $compiler->write('$this->getParent($context)');
- }
- $compiler->raw("->display(\$context, array_merge(\$this->blocks, \$blocks));\n");
- }
-
- $compiler
- ->subcompile($this->getNode('display_end'))
- ->outdent()
- ->write("}\n\n")
- ;
- }
-
- protected function compileClassFooter(Twig_Compiler $compiler)
- {
- $compiler
- ->subcompile($this->getNode('class_end'))
- ->outdent()
- ->write("}\n")
- ;
- }
-
- protected function compileMacros(Twig_Compiler $compiler)
- {
- $compiler->subcompile($this->getNode('macros'));
- }
-
- protected function compileGetTemplateName(Twig_Compiler $compiler)
- {
- $compiler
- ->write("public function getTemplateName()\n", "{\n")
- ->indent()
- ->write('return ')
- ->repr($this->source->getName())
- ->raw(";\n")
- ->outdent()
- ->write("}\n\n")
- ;
- }
-
- protected function compileIsTraitable(Twig_Compiler $compiler)
- {
- // A template can be used as a trait if:
- // * it has no parent
- // * it has no macros
- // * it has no body
- //
- // Put another way, a template can be used as a trait if it
- // only contains blocks and use statements.
- $traitable = !$this->hasNode('parent') && 0 === count($this->getNode('macros'));
- if ($traitable) {
- if ($this->getNode('body') instanceof Twig_Node_Body) {
- $nodes = $this->getNode('body')->getNode(0);
- } else {
- $nodes = $this->getNode('body');
- }
-
- if (!count($nodes)) {
- $nodes = new Twig_Node(array($nodes));
- }
-
- foreach ($nodes as $node) {
- if (!count($node)) {
- continue;
- }
-
- if ($node instanceof Twig_Node_Text && ctype_space($node->getAttribute('data'))) {
- continue;
- }
-
- if ($node instanceof Twig_Node_BlockReference) {
- continue;
- }
-
- $traitable = false;
- break;
- }
- }
-
- if ($traitable) {
- return;
- }
-
- $compiler
- ->write("public function isTraitable()\n", "{\n")
- ->indent()
- ->write(sprintf("return %s;\n", $traitable ? 'true' : 'false'))
- ->outdent()
- ->write("}\n\n")
- ;
- }
-
- protected function compileDebugInfo(Twig_Compiler $compiler)
- {
- $compiler
- ->write("public function getDebugInfo()\n", "{\n")
- ->indent()
- ->write(sprintf("return %s;\n", str_replace("\n", '', var_export(array_reverse($compiler->getDebugInfo(), true), true))))
- ->outdent()
- ->write("}\n\n")
- ;
- }
-
- protected function compileGetSource(Twig_Compiler $compiler)
- {
- $compiler
- ->write("/** @deprecated since 1.27 (to be removed in 2.0). Use getSourceContext() instead */\n")
- ->write("public function getSource()\n", "{\n")
- ->indent()
- ->write("@trigger_error('The '.__METHOD__.' method is deprecated since version 1.27 and will be removed in 2.0. Use getSourceContext() instead.', E_USER_DEPRECATED);\n\n")
- ->write('return $this->getSourceContext()->getCode();')
- ->raw("\n")
- ->outdent()
- ->write("}\n\n")
- ;
- }
-
- protected function compileGetSourceContext(Twig_Compiler $compiler)
- {
- $compiler
- ->write("public function getSourceContext()\n", "{\n")
- ->indent()
- ->write('return new Twig_Source(')
- ->string($compiler->getEnvironment()->isDebug() ? $this->source->getCode() : '')
- ->raw(', ')
- ->string($this->source->getName())
- ->raw(', ')
- ->string($this->source->getPath())
- ->raw(");\n")
- ->outdent()
- ->write("}\n")
- ;
- }
-
- protected function compileLoadTemplate(Twig_Compiler $compiler, $node, $var)
- {
- if ($node instanceof Twig_Node_Expression_Constant) {
- $compiler
- ->write(sprintf('%s = $this->loadTemplate(', $var))
- ->subcompile($node)
- ->raw(', ')
- ->repr($node->getTemplateName())
- ->raw(', ')
- ->repr($node->getTemplateLine())
- ->raw(");\n")
- ;
- } else {
- throw new LogicException('Trait templates can only be constant nodes.');
- }
- }
-}
-
-class_alias('Twig_Node_Module', 'Twig\Node\ModuleNode', false);
diff --git a/inc/lib/Twig/Node/Print.php b/inc/lib/Twig/Node/Print.php
deleted file mode 100644
index 374db89b..00000000
--- a/inc/lib/Twig/Node/Print.php
+++ /dev/null
@@ -1,36 +0,0 @@
-
- */
-class Twig_Node_Print extends Twig_Node implements Twig_NodeOutputInterface
-{
- public function __construct(Twig_Node_Expression $expr, $lineno, $tag = null)
- {
- parent::__construct(array('expr' => $expr), array(), $lineno, $tag);
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- $compiler
- ->addDebugInfo($this)
- ->write('echo ')
- ->subcompile($this->getNode('expr'))
- ->raw(";\n")
- ;
- }
-}
-
-class_alias('Twig_Node_Print', 'Twig\Node\PrintNode', false);
diff --git a/inc/lib/Twig/Node/Sandbox.php b/inc/lib/Twig/Node/Sandbox.php
deleted file mode 100644
index 44b30ab9..00000000
--- a/inc/lib/Twig/Node/Sandbox.php
+++ /dev/null
@@ -1,44 +0,0 @@
-
- */
-class Twig_Node_Sandbox extends Twig_Node
-{
- public function __construct(Twig_NodeInterface $body, $lineno, $tag = null)
- {
- parent::__construct(array('body' => $body), array(), $lineno, $tag);
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- $compiler
- ->addDebugInfo($this)
- ->write("\$sandbox = \$this->env->getExtension('Twig_Extension_Sandbox');\n")
- ->write("if (!\$alreadySandboxed = \$sandbox->isSandboxed()) {\n")
- ->indent()
- ->write("\$sandbox->enableSandbox();\n")
- ->outdent()
- ->write("}\n")
- ->subcompile($this->getNode('body'))
- ->write("if (!\$alreadySandboxed) {\n")
- ->indent()
- ->write("\$sandbox->disableSandbox();\n")
- ->outdent()
- ->write("}\n")
- ;
- }
-}
-
-class_alias('Twig_Node_Sandbox', 'Twig\Node\SandboxNode', false);
diff --git a/inc/lib/Twig/Node/SandboxedModule.php b/inc/lib/Twig/Node/SandboxedModule.php
deleted file mode 100644
index be1f5daa..00000000
--- a/inc/lib/Twig/Node/SandboxedModule.php
+++ /dev/null
@@ -1,60 +0,0 @@
-
- */
-class Twig_Node_SandboxedModule extends Twig_Node_Module
-{
- protected $usedFilters;
- protected $usedTags;
- protected $usedFunctions;
-
- public function __construct(Twig_Node_Module $node, array $usedFilters, array $usedTags, array $usedFunctions)
- {
- parent::__construct($node->getNode('body'), $node->getNode('parent'), $node->getNode('blocks'), $node->getNode('macros'), $node->getNode('traits'), $node->getAttribute('embedded_templates'), $node->getAttribute('filename'), $node->getLine(), $node->getNodeTag());
-
- $this->setAttribute('index', $node->getAttribute('index'));
-
- $this->usedFilters = $usedFilters;
- $this->usedTags = $usedTags;
- $this->usedFunctions = $usedFunctions;
- }
-
- protected function compileDisplayBody(Twig_Compiler $compiler)
- {
- $compiler->write("\$this->checkSecurity();\n");
-
- parent::compileDisplayBody($compiler);
- }
-
- protected function compileDisplayFooter(Twig_Compiler $compiler)
- {
- parent::compileDisplayFooter($compiler);
-
- $compiler
- ->write("protected function checkSecurity()\n", "{\n")
- ->indent()
- ->write("\$this->env->getExtension('sandbox')->checkSecurity(\n")
- ->indent()
- ->write(!$this->usedTags ? "array(),\n" : "array('".implode('\', \'', $this->usedTags)."'),\n")
- ->write(!$this->usedFilters ? "array(),\n" : "array('".implode('\', \'', $this->usedFilters)."'),\n")
- ->write(!$this->usedFunctions ? "array()\n" : "array('".implode('\', \'', $this->usedFunctions)."')\n")
- ->outdent()
- ->write(");\n")
- ->outdent()
- ->write("}\n\n")
- ;
- }
-}
diff --git a/inc/lib/Twig/Node/SandboxedPrint.php b/inc/lib/Twig/Node/SandboxedPrint.php
deleted file mode 100644
index a08f21f5..00000000
--- a/inc/lib/Twig/Node/SandboxedPrint.php
+++ /dev/null
@@ -1,51 +0,0 @@
-
- */
-class Twig_Node_SandboxedPrint extends Twig_Node_Print
-{
- public function compile(Twig_Compiler $compiler)
- {
- $compiler
- ->addDebugInfo($this)
- ->write('echo $this->env->getExtension(\'Twig_Extension_Sandbox\')->ensureToStringAllowed(')
- ->subcompile($this->getNode('expr'))
- ->raw(");\n")
- ;
- }
-
- /**
- * Removes node filters.
- *
- * This is mostly needed when another visitor adds filters (like the escaper one).
- *
- * @return Twig_Node
- */
- protected function removeNodeFilter(Twig_Node $node)
- {
- if ($node instanceof Twig_Node_Expression_Filter) {
- return $this->removeNodeFilter($node->getNode('node'));
- }
-
- return $node;
- }
-}
-
-class_alias('Twig_Node_SandboxedPrint', 'Twig\Node\SandboxedPrintNode', false);
diff --git a/inc/lib/Twig/Node/Set.php b/inc/lib/Twig/Node/Set.php
deleted file mode 100644
index 6c6743ee..00000000
--- a/inc/lib/Twig/Node/Set.php
+++ /dev/null
@@ -1,98 +0,0 @@
-
- */
-class Twig_Node_Set extends Twig_Node implements Twig_NodeCaptureInterface
-{
- public function __construct($capture, Twig_NodeInterface $names, Twig_NodeInterface $values, $lineno, $tag = null)
- {
- parent::__construct(array('names' => $names, 'values' => $values), array('capture' => $capture, 'safe' => false), $lineno, $tag);
-
- /*
- * Optimizes the node when capture is used for a large block of text.
- *
- * {% set foo %}foo{% endset %} is compiled to $context['foo'] = new Twig_Markup("foo");
- */
- if ($this->getAttribute('capture')) {
- $this->setAttribute('safe', true);
-
- $values = $this->getNode('values');
- if ($values instanceof Twig_Node_Text) {
- $this->setNode('values', new Twig_Node_Expression_Constant($values->getAttribute('data'), $values->getTemplateLine()));
- $this->setAttribute('capture', false);
- }
- }
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- $compiler->addDebugInfo($this);
-
- if (count($this->getNode('names')) > 1) {
- $compiler->write('list(');
- foreach ($this->getNode('names') as $idx => $node) {
- if ($idx) {
- $compiler->raw(', ');
- }
-
- $compiler->subcompile($node);
- }
- $compiler->raw(')');
- } else {
- if ($this->getAttribute('capture')) {
- $compiler
- ->write("ob_start();\n")
- ->subcompile($this->getNode('values'))
- ;
- }
-
- $compiler->subcompile($this->getNode('names'), false);
-
- if ($this->getAttribute('capture')) {
- $compiler->raw(" = ('' === \$tmp = ob_get_clean()) ? '' : new Twig_Markup(\$tmp, \$this->env->getCharset())");
- }
- }
-
- if (!$this->getAttribute('capture')) {
- $compiler->raw(' = ');
-
- if (count($this->getNode('names')) > 1) {
- $compiler->write('array(');
- foreach ($this->getNode('values') as $idx => $value) {
- if ($idx) {
- $compiler->raw(', ');
- }
-
- $compiler->subcompile($value);
- }
- $compiler->raw(')');
- } else {
- if ($this->getAttribute('safe')) {
- $compiler
- ->raw("('' === \$tmp = ")
- ->subcompile($this->getNode('values'))
- ->raw(") ? '' : new Twig_Markup(\$tmp, \$this->env->getCharset())")
- ;
- } else {
- $compiler->subcompile($this->getNode('values'));
- }
- }
- }
-
- $compiler->raw(";\n");
- }
-}
-
-class_alias('Twig_Node_Set', 'Twig\Node\SetNode', false);
diff --git a/inc/lib/Twig/Node/SetTemp.php b/inc/lib/Twig/Node/SetTemp.php
deleted file mode 100644
index 996fdcde..00000000
--- a/inc/lib/Twig/Node/SetTemp.php
+++ /dev/null
@@ -1,40 +0,0 @@
- $name), $lineno);
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- $name = $this->getAttribute('name');
- $compiler
- ->addDebugInfo($this)
- ->write('if (isset($context[')
- ->string($name)
- ->raw('])) { $_')
- ->raw($name)
- ->raw('_ = $context[')
- ->repr($name)
- ->raw(']; } else { $_')
- ->raw($name)
- ->raw("_ = null; }\n")
- ;
- }
-}
-
-class_alias('Twig_Node_SetTemp', 'Twig\Node\SetTempNode', false);
diff --git a/inc/lib/Twig/Node/Spaceless.php b/inc/lib/Twig/Node/Spaceless.php
deleted file mode 100644
index 76f90cde..00000000
--- a/inc/lib/Twig/Node/Spaceless.php
+++ /dev/null
@@ -1,37 +0,0 @@
-
- */
-class Twig_Node_Spaceless extends Twig_Node
-{
- public function __construct(Twig_NodeInterface $body, $lineno, $tag = 'spaceless')
- {
- parent::__construct(array('body' => $body), array(), $lineno, $tag);
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- $compiler
- ->addDebugInfo($this)
- ->write("ob_start();\n")
- ->subcompile($this->getNode('body'))
- ->write("echo trim(preg_replace('/>\s+', '><', ob_get_clean()));\n")
- ;
- }
-}
-
-class_alias('Twig_Node_Spaceless', 'Twig\Node\SpacelessNode', false);
diff --git a/inc/lib/Twig/Node/Text.php b/inc/lib/Twig/Node/Text.php
deleted file mode 100644
index f4577fee..00000000
--- a/inc/lib/Twig/Node/Text.php
+++ /dev/null
@@ -1,36 +0,0 @@
-
- */
-class Twig_Node_Text extends Twig_Node implements Twig_NodeOutputInterface
-{
- public function __construct($data, $lineno)
- {
- parent::__construct(array(), array('data' => $data), $lineno);
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- $compiler
- ->addDebugInfo($this)
- ->write('echo ')
- ->string($this->getAttribute('data'))
- ->raw(";\n")
- ;
- }
-}
-
-class_alias('Twig_Node_Text', 'Twig\Node\TextNode', false);
diff --git a/inc/lib/Twig/Node/With.php b/inc/lib/Twig/Node/With.php
deleted file mode 100644
index 2ab0ea5d..00000000
--- a/inc/lib/Twig/Node/With.php
+++ /dev/null
@@ -1,64 +0,0 @@
-
- */
-class Twig_Node_With extends Twig_Node
-{
- public function __construct(Twig_Node $body, Twig_Node $variables = null, $only = false, $lineno, $tag = null)
- {
- $nodes = array('body' => $body);
- if (null !== $variables) {
- $nodes['variables'] = $variables;
- }
-
- parent::__construct($nodes, array('only' => (bool) $only), $lineno, $tag);
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- $compiler->addDebugInfo($this);
-
- if ($this->hasNode('variables')) {
- $varsName = $compiler->getVarName();
- $compiler
- ->write(sprintf('$%s = ', $varsName))
- ->subcompile($this->getNode('variables'))
- ->raw(";\n")
- ->write(sprintf("if (!is_array(\$%s)) {\n", $varsName))
- ->indent()
- ->write("throw new Twig_Error_Runtime('Variables passed to the \"with\" tag must be a hash.');\n")
- ->outdent()
- ->write("}\n")
- ;
-
- if ($this->getAttribute('only')) {
- $compiler->write("\$context = array('_parent' => \$context);\n");
- } else {
- $compiler->write("\$context['_parent'] = \$context;\n");
- }
-
- $compiler->write(sprintf("\$context = array_merge(\$context, \$%s);\n", $varsName));
- } else {
- $compiler->write("\$context['_parent'] = \$context;\n");
- }
-
- $compiler
- ->subcompile($this->getNode('body'))
- ->write("\$context = \$context['_parent'];\n")
- ;
- }
-}
-
-class_alias('Twig_Node_With', 'Twig\Node\WithNode', false);
diff --git a/inc/lib/Twig/NodeCaptureInterface.php b/inc/lib/Twig/NodeCaptureInterface.php
deleted file mode 100644
index 6638834b..00000000
--- a/inc/lib/Twig/NodeCaptureInterface.php
+++ /dev/null
@@ -1,21 +0,0 @@
-
- */
-interface Twig_NodeCaptureInterface
-{
-}
-
-class_alias('Twig_NodeCaptureInterface', 'Twig\Node\NodeCaptureInterface', false);
diff --git a/inc/lib/Twig/NodeInterface.php b/inc/lib/Twig/NodeInterface.php
deleted file mode 100644
index 78e758bd..00000000
--- a/inc/lib/Twig/NodeInterface.php
+++ /dev/null
@@ -1,32 +0,0 @@
-
- *
- * @deprecated since 1.12 (to be removed in 3.0)
- */
-interface Twig_NodeInterface extends Countable, IteratorAggregate
-{
- /**
- * Compiles the node to PHP.
- */
- public function compile(Twig_Compiler $compiler);
-
- /**
- * @deprecated since 1.27 (to be removed in 2.0)
- */
- public function getLine();
-
- public function getNodeTag();
-}
diff --git a/inc/lib/Twig/NodeOutputInterface.php b/inc/lib/Twig/NodeOutputInterface.php
deleted file mode 100644
index 5a8eaa9c..00000000
--- a/inc/lib/Twig/NodeOutputInterface.php
+++ /dev/null
@@ -1,21 +0,0 @@
-
- */
-interface Twig_NodeOutputInterface
-{
-}
-
-class_alias('Twig_NodeOutputInterface', 'Twig\Node\NodeOutputInterface', false);
diff --git a/inc/lib/Twig/NodeTraverser.php b/inc/lib/Twig/NodeTraverser.php
deleted file mode 100644
index f00a0bf5..00000000
--- a/inc/lib/Twig/NodeTraverser.php
+++ /dev/null
@@ -1,86 +0,0 @@
-
- */
-class Twig_NodeTraverser
-{
- protected $env;
- protected $visitors = array();
-
- /**
- * @param Twig_Environment $env
- * @param Twig_NodeVisitorInterface[] $visitors
- */
- public function __construct(Twig_Environment $env, array $visitors = array())
- {
- $this->env = $env;
- foreach ($visitors as $visitor) {
- $this->addVisitor($visitor);
- }
- }
-
- public function addVisitor(Twig_NodeVisitorInterface $visitor)
- {
- if (!isset($this->visitors[$visitor->getPriority()])) {
- $this->visitors[$visitor->getPriority()] = array();
- }
-
- $this->visitors[$visitor->getPriority()][] = $visitor;
- }
-
- /**
- * Traverses a node and calls the registered visitors.
- *
- * @return Twig_NodeInterface
- */
- public function traverse(Twig_NodeInterface $node)
- {
- ksort($this->visitors);
- foreach ($this->visitors as $visitors) {
- foreach ($visitors as $visitor) {
- $node = $this->traverseForVisitor($visitor, $node);
- }
- }
-
- return $node;
- }
-
- protected function traverseForVisitor(Twig_NodeVisitorInterface $visitor, Twig_NodeInterface $node = null)
- {
- if (null === $node) {
- return;
- }
-
- $node = $visitor->enterNode($node, $this->env);
-
- foreach ($node as $k => $n) {
- if (false !== $m = $this->traverseForVisitor($visitor, $n)) {
- if ($m !== $n) {
- $node->setNode($k, $m);
- }
- } else {
- $node->removeNode($k);
- }
- }
-
- return $visitor->leaveNode($node, $this->env);
- }
-}
-
-class_alias('Twig_NodeTraverser', 'Twig\NodeTraverser', false);
diff --git a/inc/lib/Twig/NodeVisitor/Escaper.php b/inc/lib/Twig/NodeVisitor/Escaper.php
deleted file mode 100644
index 1a1ae66f..00000000
--- a/inc/lib/Twig/NodeVisitor/Escaper.php
+++ /dev/null
@@ -1,154 +0,0 @@
-
- */
-class Twig_NodeVisitor_Escaper extends Twig_BaseNodeVisitor
-{
- protected $statusStack = array();
- protected $blocks = array();
- protected $safeAnalysis;
- protected $traverser;
- protected $defaultStrategy = false;
- protected $safeVars = array();
-
- public function __construct()
- {
- $this->safeAnalysis = new Twig_NodeVisitor_SafeAnalysis();
- }
-
- protected function doEnterNode(Twig_Node $node, Twig_Environment $env)
- {
- if ($node instanceof Twig_Node_Module) {
- if ($env->hasExtension('Twig_Extension_Escaper') && $defaultStrategy = $env->getExtension('Twig_Extension_Escaper')->getDefaultStrategy($node->getTemplateName())) {
- $this->defaultStrategy = $defaultStrategy;
- }
- $this->safeVars = array();
- $this->blocks = array();
- } elseif ($node instanceof Twig_Node_AutoEscape) {
- $this->statusStack[] = $node->getAttribute('value');
- } elseif ($node instanceof Twig_Node_Block) {
- $this->statusStack[] = isset($this->blocks[$node->getAttribute('name')]) ? $this->blocks[$node->getAttribute('name')] : $this->needEscaping($env);
- } elseif ($node instanceof Twig_Node_Import) {
- $this->safeVars[] = $node->getNode('var')->getAttribute('name');
- }
-
- return $node;
- }
-
- protected function doLeaveNode(Twig_Node $node, Twig_Environment $env)
- {
- if ($node instanceof Twig_Node_Module) {
- $this->defaultStrategy = false;
- $this->safeVars = array();
- $this->blocks = array();
- } elseif ($node instanceof Twig_Node_Expression_Filter) {
- return $this->preEscapeFilterNode($node, $env);
- } elseif ($node instanceof Twig_Node_Print) {
- return $this->escapePrintNode($node, $env, $this->needEscaping($env));
- }
-
- if ($node instanceof Twig_Node_AutoEscape || $node instanceof Twig_Node_Block) {
- array_pop($this->statusStack);
- } elseif ($node instanceof Twig_Node_BlockReference) {
- $this->blocks[$node->getAttribute('name')] = $this->needEscaping($env);
- }
-
- return $node;
- }
-
- protected function escapePrintNode(Twig_Node_Print $node, Twig_Environment $env, $type)
- {
- if (false === $type) {
- return $node;
- }
-
- $expression = $node->getNode('expr');
-
- if ($this->isSafeFor($type, $expression, $env)) {
- return $node;
- }
-
- $class = get_class($node);
-
- return new $class(
- $this->getEscaperFilter($type, $expression),
- $node->getTemplateLine()
- );
- }
-
- protected function preEscapeFilterNode(Twig_Node_Expression_Filter $filter, Twig_Environment $env)
- {
- $name = $filter->getNode('filter')->getAttribute('value');
-
- $type = $env->getFilter($name)->getPreEscape();
- if (null === $type) {
- return $filter;
- }
-
- $node = $filter->getNode('node');
- if ($this->isSafeFor($type, $node, $env)) {
- return $filter;
- }
-
- $filter->setNode('node', $this->getEscaperFilter($type, $node));
-
- return $filter;
- }
-
- protected function isSafeFor($type, Twig_NodeInterface $expression, $env)
- {
- $safe = $this->safeAnalysis->getSafe($expression);
-
- if (null === $safe) {
- if (null === $this->traverser) {
- $this->traverser = new Twig_NodeTraverser($env, array($this->safeAnalysis));
- }
-
- $this->safeAnalysis->setSafeVars($this->safeVars);
-
- $this->traverser->traverse($expression);
- $safe = $this->safeAnalysis->getSafe($expression);
- }
-
- return in_array($type, $safe) || in_array('all', $safe);
- }
-
- protected function needEscaping(Twig_Environment $env)
- {
- if (count($this->statusStack)) {
- return $this->statusStack[count($this->statusStack) - 1];
- }
-
- return $this->defaultStrategy ? $this->defaultStrategy : false;
- }
-
- protected function getEscaperFilter($type, Twig_NodeInterface $node)
- {
- $line = $node->getTemplateLine();
- $name = new Twig_Node_Expression_Constant('escape', $line);
- $args = new Twig_Node(array(new Twig_Node_Expression_Constant((string) $type, $line), new Twig_Node_Expression_Constant(null, $line), new Twig_Node_Expression_Constant(true, $line)));
-
- return new Twig_Node_Expression_Filter($node, $name, $args, $line);
- }
-
- public function getPriority()
- {
- return 0;
- }
-}
-
-class_alias('Twig_NodeVisitor_Escaper', 'Twig\NodeVisitor\EscaperNodeVisitor', false);
diff --git a/inc/lib/Twig/NodeVisitor/Optimizer.php b/inc/lib/Twig/NodeVisitor/Optimizer.php
deleted file mode 100644
index c55e40ff..00000000
--- a/inc/lib/Twig/NodeVisitor/Optimizer.php
+++ /dev/null
@@ -1,253 +0,0 @@
-
- */
-class Twig_NodeVisitor_Optimizer extends Twig_BaseNodeVisitor
-{
- const OPTIMIZE_ALL = -1;
- const OPTIMIZE_NONE = 0;
- const OPTIMIZE_FOR = 2;
- const OPTIMIZE_RAW_FILTER = 4;
- const OPTIMIZE_VAR_ACCESS = 8;
-
- protected $loops = array();
- protected $loopsTargets = array();
- protected $optimizers;
- protected $prependedNodes = array();
- protected $inABody = false;
-
- /**
- * @param int $optimizers The optimizer mode
- */
- public function __construct($optimizers = -1)
- {
- if (!is_int($optimizers) || $optimizers > (self::OPTIMIZE_FOR | self::OPTIMIZE_RAW_FILTER | self::OPTIMIZE_VAR_ACCESS)) {
- throw new InvalidArgumentException(sprintf('Optimizer mode "%s" is not valid.', $optimizers));
- }
-
- $this->optimizers = $optimizers;
- }
-
- protected function doEnterNode(Twig_Node $node, Twig_Environment $env)
- {
- if (self::OPTIMIZE_FOR === (self::OPTIMIZE_FOR & $this->optimizers)) {
- $this->enterOptimizeFor($node, $env);
- }
-
- if (PHP_VERSION_ID < 50400 && self::OPTIMIZE_VAR_ACCESS === (self::OPTIMIZE_VAR_ACCESS & $this->optimizers) && !$env->isStrictVariables() && !$env->hasExtension('Twig_Extension_Sandbox')) {
- if ($this->inABody) {
- if (!$node instanceof Twig_Node_Expression) {
- if ('Twig_Node' !== get_class($node)) {
- array_unshift($this->prependedNodes, array());
- }
- } else {
- $node = $this->optimizeVariables($node, $env);
- }
- } elseif ($node instanceof Twig_Node_Body) {
- $this->inABody = true;
- }
- }
-
- return $node;
- }
-
- protected function doLeaveNode(Twig_Node $node, Twig_Environment $env)
- {
- $expression = $node instanceof Twig_Node_Expression;
-
- if (self::OPTIMIZE_FOR === (self::OPTIMIZE_FOR & $this->optimizers)) {
- $this->leaveOptimizeFor($node, $env);
- }
-
- if (self::OPTIMIZE_RAW_FILTER === (self::OPTIMIZE_RAW_FILTER & $this->optimizers)) {
- $node = $this->optimizeRawFilter($node, $env);
- }
-
- $node = $this->optimizePrintNode($node, $env);
-
- if (self::OPTIMIZE_VAR_ACCESS === (self::OPTIMIZE_VAR_ACCESS & $this->optimizers) && !$env->isStrictVariables() && !$env->hasExtension('Twig_Extension_Sandbox')) {
- if ($node instanceof Twig_Node_Body) {
- $this->inABody = false;
- } elseif ($this->inABody) {
- if (!$expression && 'Twig_Node' !== get_class($node) && $prependedNodes = array_shift($this->prependedNodes)) {
- $nodes = array();
- foreach (array_unique($prependedNodes) as $name) {
- $nodes[] = new Twig_Node_SetTemp($name, $node->getTemplateLine());
- }
-
- $nodes[] = $node;
- $node = new Twig_Node($nodes);
- }
- }
- }
-
- return $node;
- }
-
- protected function optimizeVariables(Twig_NodeInterface $node, Twig_Environment $env)
- {
- if ('Twig_Node_Expression_Name' === get_class($node) && $node->isSimple()) {
- $this->prependedNodes[0][] = $node->getAttribute('name');
-
- return new Twig_Node_Expression_TempName($node->getAttribute('name'), $node->getTemplateLine());
- }
-
- return $node;
- }
-
- /**
- * Optimizes print nodes.
- *
- * It replaces:
- *
- * * "echo $this->render(Parent)Block()" with "$this->display(Parent)Block()"
- *
- * @return Twig_NodeInterface
- */
- protected function optimizePrintNode(Twig_NodeInterface $node, Twig_Environment $env)
- {
- if (!$node instanceof Twig_Node_Print) {
- return $node;
- }
-
- $exprNode = $node->getNode('expr');
- if (
- $exprNode instanceof Twig_Node_Expression_BlockReference ||
- $exprNode instanceof Twig_Node_Expression_Parent
- ) {
- $exprNode->setAttribute('output', true);
-
- return $exprNode;
- }
-
- return $node;
- }
-
- /**
- * Removes "raw" filters.
- *
- * @return Twig_NodeInterface
- */
- protected function optimizeRawFilter(Twig_NodeInterface $node, Twig_Environment $env)
- {
- if ($node instanceof Twig_Node_Expression_Filter && 'raw' == $node->getNode('filter')->getAttribute('value')) {
- return $node->getNode('node');
- }
-
- return $node;
- }
-
- /**
- * Optimizes "for" tag by removing the "loop" variable creation whenever possible.
- */
- protected function enterOptimizeFor(Twig_NodeInterface $node, Twig_Environment $env)
- {
- if ($node instanceof Twig_Node_For) {
- // disable the loop variable by default
- $node->setAttribute('with_loop', false);
- array_unshift($this->loops, $node);
- array_unshift($this->loopsTargets, $node->getNode('value_target')->getAttribute('name'));
- array_unshift($this->loopsTargets, $node->getNode('key_target')->getAttribute('name'));
- } elseif (!$this->loops) {
- // we are outside a loop
- return;
- }
-
- // when do we need to add the loop variable back?
-
- // the loop variable is referenced for the current loop
- elseif ($node instanceof Twig_Node_Expression_Name && 'loop' === $node->getAttribute('name')) {
- $node->setAttribute('always_defined', true);
- $this->addLoopToCurrent();
- }
-
- // optimize access to loop targets
- elseif ($node instanceof Twig_Node_Expression_Name && in_array($node->getAttribute('name'), $this->loopsTargets)) {
- $node->setAttribute('always_defined', true);
- }
-
- // block reference
- elseif ($node instanceof Twig_Node_BlockReference || $node instanceof Twig_Node_Expression_BlockReference) {
- $this->addLoopToCurrent();
- }
-
- // include without the only attribute
- elseif ($node instanceof Twig_Node_Include && !$node->getAttribute('only')) {
- $this->addLoopToAll();
- }
-
- // include function without the with_context=false parameter
- elseif ($node instanceof Twig_Node_Expression_Function
- && 'include' === $node->getAttribute('name')
- && (!$node->getNode('arguments')->hasNode('with_context')
- || false !== $node->getNode('arguments')->getNode('with_context')->getAttribute('value')
- )
- ) {
- $this->addLoopToAll();
- }
-
- // the loop variable is referenced via an attribute
- elseif ($node instanceof Twig_Node_Expression_GetAttr
- && (!$node->getNode('attribute') instanceof Twig_Node_Expression_Constant
- || 'parent' === $node->getNode('attribute')->getAttribute('value')
- )
- && (true === $this->loops[0]->getAttribute('with_loop')
- || ($node->getNode('node') instanceof Twig_Node_Expression_Name
- && 'loop' === $node->getNode('node')->getAttribute('name')
- )
- )
- ) {
- $this->addLoopToAll();
- }
- }
-
- /**
- * Optimizes "for" tag by removing the "loop" variable creation whenever possible.
- */
- protected function leaveOptimizeFor(Twig_NodeInterface $node, Twig_Environment $env)
- {
- if ($node instanceof Twig_Node_For) {
- array_shift($this->loops);
- array_shift($this->loopsTargets);
- array_shift($this->loopsTargets);
- }
- }
-
- protected function addLoopToCurrent()
- {
- $this->loops[0]->setAttribute('with_loop', true);
- }
-
- protected function addLoopToAll()
- {
- foreach ($this->loops as $loop) {
- $loop->setAttribute('with_loop', true);
- }
- }
-
- public function getPriority()
- {
- return 255;
- }
-}
-
-class_alias('Twig_NodeVisitor_Optimizer', 'Twig\NodeVisitor\OptimizerNodeVisitor', false);
diff --git a/inc/lib/Twig/NodeVisitor/SafeAnalysis.php b/inc/lib/Twig/NodeVisitor/SafeAnalysis.php
deleted file mode 100644
index ca31c8fc..00000000
--- a/inc/lib/Twig/NodeVisitor/SafeAnalysis.php
+++ /dev/null
@@ -1,150 +0,0 @@
-safeVars = $safeVars;
- }
-
- public function getSafe(Twig_NodeInterface $node)
- {
- $hash = spl_object_hash($node);
- if (!isset($this->data[$hash])) {
- return;
- }
-
- foreach ($this->data[$hash] as $bucket) {
- if ($bucket['key'] !== $node) {
- continue;
- }
-
- if (in_array('html_attr', $bucket['value'])) {
- $bucket['value'][] = 'html';
- }
-
- return $bucket['value'];
- }
- }
-
- protected function setSafe(Twig_NodeInterface $node, array $safe)
- {
- $hash = spl_object_hash($node);
- if (isset($this->data[$hash])) {
- foreach ($this->data[$hash] as &$bucket) {
- if ($bucket['key'] === $node) {
- $bucket['value'] = $safe;
-
- return;
- }
- }
- }
- $this->data[$hash][] = array(
- 'key' => $node,
- 'value' => $safe,
- );
- }
-
- protected function doEnterNode(Twig_Node $node, Twig_Environment $env)
- {
- return $node;
- }
-
- protected function doLeaveNode(Twig_Node $node, Twig_Environment $env)
- {
- if ($node instanceof Twig_Node_Expression_Constant) {
- // constants are marked safe for all
- $this->setSafe($node, array('all'));
- } elseif ($node instanceof Twig_Node_Expression_BlockReference) {
- // blocks are safe by definition
- $this->setSafe($node, array('all'));
- } elseif ($node instanceof Twig_Node_Expression_Parent) {
- // parent block is safe by definition
- $this->setSafe($node, array('all'));
- } elseif ($node instanceof Twig_Node_Expression_Conditional) {
- // intersect safeness of both operands
- $safe = $this->intersectSafe($this->getSafe($node->getNode('expr2')), $this->getSafe($node->getNode('expr3')));
- $this->setSafe($node, $safe);
- } elseif ($node instanceof Twig_Node_Expression_Filter) {
- // filter expression is safe when the filter is safe
- $name = $node->getNode('filter')->getAttribute('value');
- $args = $node->getNode('arguments');
- if (false !== $filter = $env->getFilter($name)) {
- $safe = $filter->getSafe($args);
- if (null === $safe) {
- $safe = $this->intersectSafe($this->getSafe($node->getNode('node')), $filter->getPreservesSafety());
- }
- $this->setSafe($node, $safe);
- } else {
- $this->setSafe($node, array());
- }
- } elseif ($node instanceof Twig_Node_Expression_Function) {
- // function expression is safe when the function is safe
- $name = $node->getAttribute('name');
- $args = $node->getNode('arguments');
- $function = $env->getFunction($name);
- if (false !== $function) {
- $this->setSafe($node, $function->getSafe($args));
- } else {
- $this->setSafe($node, array());
- }
- } elseif ($node instanceof Twig_Node_Expression_MethodCall) {
- if ($node->getAttribute('safe')) {
- $this->setSafe($node, array('all'));
- } else {
- $this->setSafe($node, array());
- }
- } elseif ($node instanceof Twig_Node_Expression_GetAttr && $node->getNode('node') instanceof Twig_Node_Expression_Name) {
- $name = $node->getNode('node')->getAttribute('name');
- // attributes on template instances are safe
- if ('_self' == $name || in_array($name, $this->safeVars)) {
- $this->setSafe($node, array('all'));
- } else {
- $this->setSafe($node, array());
- }
- } else {
- $this->setSafe($node, array());
- }
-
- return $node;
- }
-
- protected function intersectSafe(array $a = null, array $b = null)
- {
- if (null === $a || null === $b) {
- return array();
- }
-
- if (in_array('all', $a)) {
- return $b;
- }
-
- if (in_array('all', $b)) {
- return $a;
- }
-
- return array_intersect($a, $b);
- }
-
- public function getPriority()
- {
- return 0;
- }
-}
-
-class_alias('Twig_NodeVisitor_SafeAnalysis', 'Twig\NodeVisitor\SafeAnalysisNodeVisitor', false);
diff --git a/inc/lib/Twig/NodeVisitor/Sandbox.php b/inc/lib/Twig/NodeVisitor/Sandbox.php
deleted file mode 100644
index 71aa4f02..00000000
--- a/inc/lib/Twig/NodeVisitor/Sandbox.php
+++ /dev/null
@@ -1,82 +0,0 @@
-
- */
-class Twig_NodeVisitor_Sandbox extends Twig_BaseNodeVisitor
-{
- protected $inAModule = false;
- protected $tags;
- protected $filters;
- protected $functions;
-
- protected function doEnterNode(Twig_Node $node, Twig_Environment $env)
- {
- if ($node instanceof Twig_Node_Module) {
- $this->inAModule = true;
- $this->tags = array();
- $this->filters = array();
- $this->functions = array();
-
- return $node;
- } elseif ($this->inAModule) {
- // look for tags
- if ($node->getNodeTag() && !isset($this->tags[$node->getNodeTag()])) {
- $this->tags[$node->getNodeTag()] = $node;
- }
-
- // look for filters
- if ($node instanceof Twig_Node_Expression_Filter && !isset($this->filters[$node->getNode('filter')->getAttribute('value')])) {
- $this->filters[$node->getNode('filter')->getAttribute('value')] = $node;
- }
-
- // look for functions
- if ($node instanceof Twig_Node_Expression_Function && !isset($this->functions[$node->getAttribute('name')])) {
- $this->functions[$node->getAttribute('name')] = $node;
- }
-
- // the .. operator is equivalent to the range() function
- if ($node instanceof Twig_Node_Expression_Binary_Range && !isset($this->functions['range'])) {
- $this->functions['range'] = $node;
- }
-
- // wrap print to check __toString() calls
- if ($node instanceof Twig_Node_Print) {
- return new Twig_Node_SandboxedPrint($node->getNode('expr'), $node->getTemplateLine(), $node->getNodeTag());
- }
- }
-
- return $node;
- }
-
- protected function doLeaveNode(Twig_Node $node, Twig_Environment $env)
- {
- if ($node instanceof Twig_Node_Module) {
- $this->inAModule = false;
-
- $node->setNode('display_start', new Twig_Node(array(new Twig_Node_CheckSecurity($this->filters, $this->tags, $this->functions), $node->getNode('display_start'))));
- }
-
- return $node;
- }
-
- public function getPriority()
- {
- return 0;
- }
-}
-
-class_alias('Twig_NodeVisitor_Sandbox', 'Twig\NodeVisitor\SandboxNodeVisitor', false);
diff --git a/inc/lib/Twig/NodeVisitorInterface.php b/inc/lib/Twig/NodeVisitorInterface.php
deleted file mode 100644
index 1270a372..00000000
--- a/inc/lib/Twig/NodeVisitorInterface.php
+++ /dev/null
@@ -1,45 +0,0 @@
-
- */
-interface Twig_NodeVisitorInterface
-{
- /**
- * Called before child nodes are visited.
- *
- * @return Twig_NodeInterface The modified node
- */
- public function enterNode(Twig_NodeInterface $node, Twig_Environment $env);
-
- /**
- * Called after child nodes are visited.
- *
- * @return Twig_NodeInterface|false The modified node or false if the node must be removed
- */
- public function leaveNode(Twig_NodeInterface $node, Twig_Environment $env);
-
- /**
- * Returns the priority for this visitor.
- *
- * Priority should be between -10 and 10 (0 is the default).
- *
- * @return int The priority level
- */
- public function getPriority();
-}
-
-class_alias('Twig_NodeVisitorInterface', 'Twig\NodeVisitor\NodeVisitorInterface', false);
-class_exists('Twig_Environment');
-class_exists('Twig_Node');
diff --git a/inc/lib/Twig/Parser.php b/inc/lib/Twig/Parser.php
deleted file mode 100644
index 6de879a5..00000000
--- a/inc/lib/Twig/Parser.php
+++ /dev/null
@@ -1,412 +0,0 @@
-
- */
-class Twig_Parser implements Twig_ParserInterface
-{
- protected $stack = array();
- protected $stream;
- protected $parent;
- protected $handlers;
- protected $visitors;
- protected $expressionParser;
- protected $blocks;
- protected $blockStack;
- protected $macros;
- protected $env;
- protected $reservedMacroNames;
- protected $importedSymbols;
- protected $traits;
- protected $embeddedTemplates = array();
- private $varNameSalt = 0;
-
- public function __construct(Twig_Environment $env)
- {
- $this->env = $env;
- }
-
- /**
- * @deprecated since 1.27 (to be removed in 2.0)
- */
- public function getEnvironment()
- {
- @trigger_error('The '.__METHOD__.' method is deprecated since version 1.27 and will be removed in 2.0.', E_USER_DEPRECATED);
-
- return $this->env;
- }
-
- public function getVarName()
- {
- return sprintf('__internal_%s', hash('sha256', __METHOD__.$this->stream->getSourceContext()->getCode().$this->varNameSalt++));
- }
-
- /**
- * @deprecated since 1.27 (to be removed in 2.0). Use $parser->getStream()->getSourceContext()->getPath() instead.
- */
- public function getFilename()
- {
- @trigger_error(sprintf('The "%s" method is deprecated since version 1.27 and will be removed in 2.0. Use $parser->getStream()->getSourceContext()->getPath() instead.', __METHOD__), E_USER_DEPRECATED);
-
- return $this->stream->getSourceContext()->getName();
- }
-
- public function parse(Twig_TokenStream $stream, $test = null, $dropNeedle = false)
- {
- // push all variables into the stack to keep the current state of the parser
- // using get_object_vars() instead of foreach would lead to https://bugs.php.net/71336
- // This hack can be removed when min version if PHP 7.0
- $vars = array();
- foreach ($this as $k => $v) {
- $vars[$k] = $v;
- }
-
- unset($vars['stack'], $vars['env'], $vars['handlers'], $vars['visitors'], $vars['expressionParser'], $vars['reservedMacroNames']);
- $this->stack[] = $vars;
-
- // tag handlers
- if (null === $this->handlers) {
- $this->handlers = $this->env->getTokenParsers();
- $this->handlers->setParser($this);
- }
-
- // node visitors
- if (null === $this->visitors) {
- $this->visitors = $this->env->getNodeVisitors();
- }
-
- if (null === $this->expressionParser) {
- $this->expressionParser = new Twig_ExpressionParser($this, $this->env);
- }
-
- $this->stream = $stream;
- $this->parent = null;
- $this->blocks = array();
- $this->macros = array();
- $this->traits = array();
- $this->blockStack = array();
- $this->importedSymbols = array(array());
- $this->embeddedTemplates = array();
- $this->varNameSalt = 0;
-
- try {
- $body = $this->subparse($test, $dropNeedle);
-
- if (null !== $this->parent && null === $body = $this->filterBodyNodes($body)) {
- $body = new Twig_Node();
- }
- } catch (Twig_Error_Syntax $e) {
- if (!$e->getSourceContext()) {
- $e->setSourceContext($this->stream->getSourceContext());
- }
-
- if (!$e->getTemplateLine()) {
- $e->setTemplateLine($this->stream->getCurrent()->getLine());
- }
-
- throw $e;
- }
-
- $node = new Twig_Node_Module(new Twig_Node_Body(array($body)), $this->parent, new Twig_Node($this->blocks), new Twig_Node($this->macros), new Twig_Node($this->traits), $this->embeddedTemplates, $stream->getSourceContext());
-
- $traverser = new Twig_NodeTraverser($this->env, $this->visitors);
-
- $node = $traverser->traverse($node);
-
- // restore previous stack so previous parse() call can resume working
- foreach (array_pop($this->stack) as $key => $val) {
- $this->$key = $val;
- }
-
- return $node;
- }
-
- public function subparse($test, $dropNeedle = false)
- {
- $lineno = $this->getCurrentToken()->getLine();
- $rv = array();
- while (!$this->stream->isEOF()) {
- switch ($this->getCurrentToken()->getType()) {
- case Twig_Token::TEXT_TYPE:
- $token = $this->stream->next();
- $rv[] = new Twig_Node_Text($token->getValue(), $token->getLine());
- break;
-
- case Twig_Token::VAR_START_TYPE:
- $token = $this->stream->next();
- $expr = $this->expressionParser->parseExpression();
- $this->stream->expect(Twig_Token::VAR_END_TYPE);
- $rv[] = new Twig_Node_Print($expr, $token->getLine());
- break;
-
- case Twig_Token::BLOCK_START_TYPE:
- $this->stream->next();
- $token = $this->getCurrentToken();
-
- if (Twig_Token::NAME_TYPE !== $token->getType()) {
- throw new Twig_Error_Syntax('A block must start with a tag name.', $token->getLine(), $this->stream->getSourceContext());
- }
-
- if (null !== $test && call_user_func($test, $token)) {
- if ($dropNeedle) {
- $this->stream->next();
- }
-
- if (1 === count($rv)) {
- return $rv[0];
- }
-
- return new Twig_Node($rv, array(), $lineno);
- }
-
- $subparser = $this->handlers->getTokenParser($token->getValue());
- if (null === $subparser) {
- if (null !== $test) {
- $e = new Twig_Error_Syntax(sprintf('Unexpected "%s" tag', $token->getValue()), $token->getLine(), $this->stream->getSourceContext());
-
- if (is_array($test) && isset($test[0]) && $test[0] instanceof Twig_TokenParserInterface) {
- $e->appendMessage(sprintf(' (expecting closing tag for the "%s" tag defined near line %s).', $test[0]->getTag(), $lineno));
- }
- } else {
- $e = new Twig_Error_Syntax(sprintf('Unknown "%s" tag.', $token->getValue()), $token->getLine(), $this->stream->getSourceContext());
- $e->addSuggestions($token->getValue(), array_keys($this->env->getTags()));
- }
-
- throw $e;
- }
-
- $this->stream->next();
-
- $node = $subparser->parse($token);
- if (null !== $node) {
- $rv[] = $node;
- }
- break;
-
- default:
- throw new Twig_Error_Syntax('Lexer or parser ended up in unsupported state.', $this->getCurrentToken()->getLine(), $this->stream->getSourceContext());
- }
- }
-
- if (1 === count($rv)) {
- return $rv[0];
- }
-
- return new Twig_Node($rv, array(), $lineno);
- }
-
- /**
- * @deprecated since 1.27 (to be removed in 2.0)
- */
- public function addHandler($name, $class)
- {
- @trigger_error('The '.__METHOD__.' method is deprecated since version 1.27 and will be removed in 2.0.', E_USER_DEPRECATED);
-
- $this->handlers[$name] = $class;
- }
-
- /**
- * @deprecated since 1.27 (to be removed in 2.0)
- */
- public function addNodeVisitor(Twig_NodeVisitorInterface $visitor)
- {
- @trigger_error('The '.__METHOD__.' method is deprecated since version 1.27 and will be removed in 2.0.', E_USER_DEPRECATED);
-
- $this->visitors[] = $visitor;
- }
-
- public function getBlockStack()
- {
- return $this->blockStack;
- }
-
- public function peekBlockStack()
- {
- return $this->blockStack[count($this->blockStack) - 1];
- }
-
- public function popBlockStack()
- {
- array_pop($this->blockStack);
- }
-
- public function pushBlockStack($name)
- {
- $this->blockStack[] = $name;
- }
-
- public function hasBlock($name)
- {
- return isset($this->blocks[$name]);
- }
-
- public function getBlock($name)
- {
- return $this->blocks[$name];
- }
-
- public function setBlock($name, Twig_Node_Block $value)
- {
- $this->blocks[$name] = new Twig_Node_Body(array($value), array(), $value->getTemplateLine());
- }
-
- public function hasMacro($name)
- {
- return isset($this->macros[$name]);
- }
-
- public function setMacro($name, Twig_Node_Macro $node)
- {
- if ($this->isReservedMacroName($name)) {
- throw new Twig_Error_Syntax(sprintf('"%s" cannot be used as a macro name as it is a reserved keyword.', $name), $node->getTemplateLine(), $this->stream->getSourceContext());
- }
-
- $this->macros[$name] = $node;
- }
-
- public function isReservedMacroName($name)
- {
- if (null === $this->reservedMacroNames) {
- $this->reservedMacroNames = array();
- $r = new ReflectionClass($this->env->getBaseTemplateClass());
- foreach ($r->getMethods() as $method) {
- $methodName = strtolower($method->getName());
-
- if ('get' === substr($methodName, 0, 3) && isset($methodName[3])) {
- $this->reservedMacroNames[] = substr($methodName, 3);
- }
- }
- }
-
- return in_array(strtolower($name), $this->reservedMacroNames);
- }
-
- public function addTrait($trait)
- {
- $this->traits[] = $trait;
- }
-
- public function hasTraits()
- {
- return count($this->traits) > 0;
- }
-
- public function embedTemplate(Twig_Node_Module $template)
- {
- $template->setIndex(mt_rand());
-
- $this->embeddedTemplates[] = $template;
- }
-
- public function addImportedSymbol($type, $alias, $name = null, Twig_Node_Expression $node = null)
- {
- $this->importedSymbols[0][$type][$alias] = array('name' => $name, 'node' => $node);
- }
-
- public function getImportedSymbol($type, $alias)
- {
- foreach ($this->importedSymbols as $functions) {
- if (isset($functions[$type][$alias])) {
- return $functions[$type][$alias];
- }
- }
- }
-
- public function isMainScope()
- {
- return 1 === count($this->importedSymbols);
- }
-
- public function pushLocalScope()
- {
- array_unshift($this->importedSymbols, array());
- }
-
- public function popLocalScope()
- {
- array_shift($this->importedSymbols);
- }
-
- /**
- * @return Twig_ExpressionParser
- */
- public function getExpressionParser()
- {
- return $this->expressionParser;
- }
-
- public function getParent()
- {
- return $this->parent;
- }
-
- public function setParent($parent)
- {
- $this->parent = $parent;
- }
-
- /**
- * @return Twig_TokenStream
- */
- public function getStream()
- {
- return $this->stream;
- }
-
- /**
- * @return Twig_Token
- */
- public function getCurrentToken()
- {
- return $this->stream->getCurrent();
- }
-
- protected function filterBodyNodes(Twig_NodeInterface $node)
- {
- // check that the body does not contain non-empty output nodes
- if (
- ($node instanceof Twig_Node_Text && !ctype_space($node->getAttribute('data')))
- ||
- (!$node instanceof Twig_Node_Text && !$node instanceof Twig_Node_BlockReference && $node instanceof Twig_NodeOutputInterface)
- ) {
- if (false !== strpos((string) $node, chr(0xEF).chr(0xBB).chr(0xBF))) {
- throw new Twig_Error_Syntax('A template that extends another one cannot start with a byte order mark (BOM); it must be removed.', $node->getTemplateLine(), $this->stream->getSourceContext());
- }
-
- throw new Twig_Error_Syntax('A template that extends another one cannot include content outside Twig blocks. Did you forget to put the content inside a {% block %} tag?', $node->getTemplateLine(), $this->stream->getSourceContext());
- }
-
- // bypass nodes that will "capture" the output
- if ($node instanceof Twig_NodeCaptureInterface) {
- return $node;
- }
-
- if ($node instanceof Twig_NodeOutputInterface) {
- return;
- }
-
- foreach ($node as $k => $n) {
- if (null !== $n && null === $this->filterBodyNodes($n)) {
- $node->removeNode($k);
- }
- }
-
- return $node;
- }
-}
-
-class_alias('Twig_Parser', 'Twig\Parser', false);
-class_exists('Twig_Node');
-class_exists('Twig_TokenStream');
diff --git a/inc/lib/Twig/ParserInterface.php b/inc/lib/Twig/ParserInterface.php
deleted file mode 100644
index 85c6e67b..00000000
--- a/inc/lib/Twig/ParserInterface.php
+++ /dev/null
@@ -1,29 +0,0 @@
-
- *
- * @deprecated since 1.12 (to be removed in 3.0)
- */
-interface Twig_ParserInterface
-{
- /**
- * Converts a token stream to a node tree.
- *
- * @return Twig_Node_Module
- *
- * @throws Twig_Error_Syntax When the token stream is syntactically or semantically wrong
- */
- public function parse(Twig_TokenStream $stream);
-}
diff --git a/inc/lib/Twig/Profiler/Dumper/Base.php b/inc/lib/Twig/Profiler/Dumper/Base.php
deleted file mode 100644
index 913afd4f..00000000
--- a/inc/lib/Twig/Profiler/Dumper/Base.php
+++ /dev/null
@@ -1,62 +0,0 @@
-
- */
-abstract class Twig_Profiler_Dumper_Base
-{
- private $root;
-
- public function dump(Twig_Profiler_Profile $profile)
- {
- return $this->dumpProfile($profile);
- }
-
- abstract protected function formatTemplate(Twig_Profiler_Profile $profile, $prefix);
-
- abstract protected function formatNonTemplate(Twig_Profiler_Profile $profile, $prefix);
-
- abstract protected function formatTime(Twig_Profiler_Profile $profile, $percent);
-
- private function dumpProfile(Twig_Profiler_Profile $profile, $prefix = '', $sibling = false)
- {
- if ($profile->isRoot()) {
- $this->root = $profile->getDuration();
- $start = $profile->getName();
- } else {
- if ($profile->isTemplate()) {
- $start = $this->formatTemplate($profile, $prefix);
- } else {
- $start = $this->formatNonTemplate($profile, $prefix);
- }
- $prefix .= $sibling ? '│ ' : ' ';
- }
-
- $percent = $this->root ? $profile->getDuration() / $this->root * 100 : 0;
-
- if ($profile->getDuration() * 1000 < 1) {
- $str = $start."\n";
- } else {
- $str = sprintf("%s %s\n", $start, $this->formatTime($profile, $percent));
- }
-
- $nCount = count($profile->getProfiles());
- foreach ($profile as $i => $p) {
- $str .= $this->dumpProfile($p, $prefix, $i + 1 !== $nCount);
- }
-
- return $str;
- }
-}
-
-class_alias('Twig_Profiler_Dumper_Base', 'Twig\Profiler\Dumper\BaseDumper', false);
-class_exists('Twig_Profiler_Profile');
diff --git a/inc/lib/Twig/Profiler/Dumper/Blackfire.php b/inc/lib/Twig/Profiler/Dumper/Blackfire.php
deleted file mode 100644
index 7a33baf2..00000000
--- a/inc/lib/Twig/Profiler/Dumper/Blackfire.php
+++ /dev/null
@@ -1,72 +0,0 @@
-
- *
- * @final
- */
-class Twig_Profiler_Dumper_Blackfire
-{
- public function dump(Twig_Profiler_Profile $profile)
- {
- $data = array();
- $this->dumpProfile('main()', $profile, $data);
- $this->dumpChildren('main()', $profile, $data);
-
- $start = sprintf('%f', microtime(true));
- $str = << $values) {
- $str .= "{$name}//{$values['ct']} {$values['wt']} {$values['mu']} {$values['pmu']}\n";
- }
-
- return $str;
- }
-
- private function dumpChildren($parent, Twig_Profiler_Profile $profile, &$data)
- {
- foreach ($profile as $p) {
- if ($p->isTemplate()) {
- $name = $p->getTemplate();
- } else {
- $name = sprintf('%s::%s(%s)', $p->getTemplate(), $p->getType(), $p->getName());
- }
- $this->dumpProfile(sprintf('%s==>%s', $parent, $name), $p, $data);
- $this->dumpChildren($name, $p, $data);
- }
- }
-
- private function dumpProfile($edge, Twig_Profiler_Profile $profile, &$data)
- {
- if (isset($data[$edge])) {
- $data[$edge]['ct'] += 1;
- $data[$edge]['wt'] += floor($profile->getDuration() * 1000000);
- $data[$edge]['mu'] += $profile->getMemoryUsage();
- $data[$edge]['pmu'] += $profile->getPeakMemoryUsage();
- } else {
- $data[$edge] = array(
- 'ct' => 1,
- 'wt' => floor($profile->getDuration() * 1000000),
- 'mu' => $profile->getMemoryUsage(),
- 'pmu' => $profile->getPeakMemoryUsage(),
- );
- }
- }
-}
-
-class_alias('Twig_Profiler_Dumper_Blackfire', 'Twig\Profiler\Dumper\BlackfireDumper', false);
diff --git a/inc/lib/Twig/Profiler/Dumper/Html.php b/inc/lib/Twig/Profiler/Dumper/Html.php
deleted file mode 100644
index b57a2551..00000000
--- a/inc/lib/Twig/Profiler/Dumper/Html.php
+++ /dev/null
@@ -1,47 +0,0 @@
-
- *
- * @final
- */
-class Twig_Profiler_Dumper_Html extends Twig_Profiler_Dumper_Base
-{
- private static $colors = array(
- 'block' => '#dfd',
- 'macro' => '#ddf',
- 'template' => '#ffd',
- 'big' => '#d44',
- );
-
- public function dump(Twig_Profiler_Profile $profile)
- {
- return ''.parent::dump($profile).' ';
- }
-
- protected function formatTemplate(Twig_Profiler_Profile $profile, $prefix)
- {
- return sprintf('%s└ %s ', $prefix, self::$colors['template'], $profile->getTemplate());
- }
-
- protected function formatNonTemplate(Twig_Profiler_Profile $profile, $prefix)
- {
- return sprintf('%s└ %s::%s(%s )', $prefix, $profile->getTemplate(), $profile->getType(), isset(self::$colors[$profile->getType()]) ? self::$colors[$profile->getType()] : 'auto', $profile->getName());
- }
-
- protected function formatTime(Twig_Profiler_Profile $profile, $percent)
- {
- return sprintf('%.2fms/%.0f%% ', $percent > 20 ? self::$colors['big'] : 'auto', $profile->getDuration() * 1000, $percent);
- }
-}
-
-class_alias('Twig_Profiler_Dumper_Html', 'Twig\Profiler\Dumper\HtmlDumper', false);
diff --git a/inc/lib/Twig/Profiler/Dumper/Text.php b/inc/lib/Twig/Profiler/Dumper/Text.php
deleted file mode 100644
index 69d2c4bf..00000000
--- a/inc/lib/Twig/Profiler/Dumper/Text.php
+++ /dev/null
@@ -1,35 +0,0 @@
-
- *
- * @final
- */
-class Twig_Profiler_Dumper_Text extends Twig_Profiler_Dumper_Base
-{
- protected function formatTemplate(Twig_Profiler_Profile $profile, $prefix)
- {
- return sprintf('%s└ %s', $prefix, $profile->getTemplate());
- }
-
- protected function formatNonTemplate(Twig_Profiler_Profile $profile, $prefix)
- {
- return sprintf('%s└ %s::%s(%s)', $prefix, $profile->getTemplate(), $profile->getType(), $profile->getName());
- }
-
- protected function formatTime(Twig_Profiler_Profile $profile, $percent)
- {
- return sprintf('%.2fms/%.0f%%', $profile->getDuration() * 1000, $percent);
- }
-}
-
-class_alias('Twig_Profiler_Dumper_Text', 'Twig\Profiler\Dumper\TextDumper', false);
diff --git a/inc/lib/Twig/Profiler/Node/EnterProfile.php b/inc/lib/Twig/Profiler/Node/EnterProfile.php
deleted file mode 100644
index 69c8f797..00000000
--- a/inc/lib/Twig/Profiler/Node/EnterProfile.php
+++ /dev/null
@@ -1,39 +0,0 @@
-
- */
-class Twig_Profiler_Node_EnterProfile extends Twig_Node
-{
- public function __construct($extensionName, $type, $name, $varName)
- {
- parent::__construct(array(), array('extension_name' => $extensionName, 'name' => $name, 'type' => $type, 'var_name' => $varName));
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- $compiler
- ->write(sprintf('$%s = $this->env->getExtension(', $this->getAttribute('var_name')))
- ->repr($this->getAttribute('extension_name'))
- ->raw(");\n")
- ->write(sprintf('$%s->enter($%s = new Twig_Profiler_Profile($this->getTemplateName(), ', $this->getAttribute('var_name'), $this->getAttribute('var_name').'_prof'))
- ->repr($this->getAttribute('type'))
- ->raw(', ')
- ->repr($this->getAttribute('name'))
- ->raw("));\n\n")
- ;
- }
-}
-
-class_alias('Twig_Profiler_Node_EnterProfile', 'Twig\Profiler\Node\EnterProfileNode', false);
diff --git a/inc/lib/Twig/Profiler/Node/LeaveProfile.php b/inc/lib/Twig/Profiler/Node/LeaveProfile.php
deleted file mode 100644
index d1d6a7cc..00000000
--- a/inc/lib/Twig/Profiler/Node/LeaveProfile.php
+++ /dev/null
@@ -1,33 +0,0 @@
-
- */
-class Twig_Profiler_Node_LeaveProfile extends Twig_Node
-{
- public function __construct($varName)
- {
- parent::__construct(array(), array('var_name' => $varName));
- }
-
- public function compile(Twig_Compiler $compiler)
- {
- $compiler
- ->write("\n")
- ->write(sprintf("\$%s->leave(\$%s);\n\n", $this->getAttribute('var_name'), $this->getAttribute('var_name').'_prof'))
- ;
- }
-}
-
-class_alias('Twig_Profiler_Node_LeaveProfile', 'Twig\Profiler\Node\LeaveProfileNode', false);
diff --git a/inc/lib/Twig/Profiler/NodeVisitor/Profiler.php b/inc/lib/Twig/Profiler/NodeVisitor/Profiler.php
deleted file mode 100644
index 5db41fea..00000000
--- a/inc/lib/Twig/Profiler/NodeVisitor/Profiler.php
+++ /dev/null
@@ -1,67 +0,0 @@
-
- *
- * @final
- */
-class Twig_Profiler_NodeVisitor_Profiler extends Twig_BaseNodeVisitor
-{
- private $extensionName;
-
- public function __construct($extensionName)
- {
- $this->extensionName = $extensionName;
- }
-
- protected function doEnterNode(Twig_Node $node, Twig_Environment $env)
- {
- return $node;
- }
-
- protected function doLeaveNode(Twig_Node $node, Twig_Environment $env)
- {
- if ($node instanceof Twig_Node_Module) {
- $varName = $this->getVarName();
- $node->setNode('display_start', new Twig_Node(array(new Twig_Profiler_Node_EnterProfile($this->extensionName, Twig_Profiler_Profile::TEMPLATE, $node->getTemplateName(), $varName), $node->getNode('display_start'))));
- $node->setNode('display_end', new Twig_Node(array(new Twig_Profiler_Node_LeaveProfile($varName), $node->getNode('display_end'))));
- } elseif ($node instanceof Twig_Node_Block) {
- $varName = $this->getVarName();
- $node->setNode('body', new Twig_Node_Body(array(
- new Twig_Profiler_Node_EnterProfile($this->extensionName, Twig_Profiler_Profile::BLOCK, $node->getAttribute('name'), $varName),
- $node->getNode('body'),
- new Twig_Profiler_Node_LeaveProfile($varName),
- )));
- } elseif ($node instanceof Twig_Node_Macro) {
- $varName = $this->getVarName();
- $node->setNode('body', new Twig_Node_Body(array(
- new Twig_Profiler_Node_EnterProfile($this->extensionName, Twig_Profiler_Profile::MACRO, $node->getAttribute('name'), $varName),
- $node->getNode('body'),
- new Twig_Profiler_Node_LeaveProfile($varName),
- )));
- }
-
- return $node;
- }
-
- private function getVarName()
- {
- return sprintf('__internal_%s', hash('sha256', $this->extensionName));
- }
-
- public function getPriority()
- {
- return 0;
- }
-}
-
-class_alias('Twig_Profiler_NodeVisitor_Profiler', 'Twig\Profiler\NodeVisitor\ProfilerNodeVisitor', false);
diff --git a/inc/lib/Twig/Profiler/Profile.php b/inc/lib/Twig/Profiler/Profile.php
deleted file mode 100644
index 3fdc1a8a..00000000
--- a/inc/lib/Twig/Profiler/Profile.php
+++ /dev/null
@@ -1,170 +0,0 @@
-
- *
- * @final
- */
-class Twig_Profiler_Profile implements IteratorAggregate, Serializable
-{
- const ROOT = 'ROOT';
- const BLOCK = 'block';
- const TEMPLATE = 'template';
- const MACRO = 'macro';
-
- private $template;
- private $name;
- private $type;
- private $starts = array();
- private $ends = array();
- private $profiles = array();
-
- public function __construct($template = 'main', $type = self::ROOT, $name = 'main')
- {
- $this->template = $template;
- $this->type = $type;
- $this->name = 0 === strpos($name, '__internal_') ? 'INTERNAL' : $name;
- $this->enter();
- }
-
- public function getTemplate()
- {
- return $this->template;
- }
-
- public function getType()
- {
- return $this->type;
- }
-
- public function getName()
- {
- return $this->name;
- }
-
- public function isRoot()
- {
- return self::ROOT === $this->type;
- }
-
- public function isTemplate()
- {
- return self::TEMPLATE === $this->type;
- }
-
- public function isBlock()
- {
- return self::BLOCK === $this->type;
- }
-
- public function isMacro()
- {
- return self::MACRO === $this->type;
- }
-
- public function getProfiles()
- {
- return $this->profiles;
- }
-
- public function addProfile(Twig_Profiler_Profile $profile)
- {
- $this->profiles[] = $profile;
- }
-
- /**
- * Returns the duration in microseconds.
- *
- * @return int
- */
- public function getDuration()
- {
- if ($this->isRoot() && $this->profiles) {
- // for the root node with children, duration is the sum of all child durations
- $duration = 0;
- foreach ($this->profiles as $profile) {
- $duration += $profile->getDuration();
- }
-
- return $duration;
- }
-
- return isset($this->ends['wt']) && isset($this->starts['wt']) ? $this->ends['wt'] - $this->starts['wt'] : 0;
- }
-
- /**
- * Returns the memory usage in bytes.
- *
- * @return int
- */
- public function getMemoryUsage()
- {
- return isset($this->ends['mu']) && isset($this->starts['mu']) ? $this->ends['mu'] - $this->starts['mu'] : 0;
- }
-
- /**
- * Returns the peak memory usage in bytes.
- *
- * @return int
- */
- public function getPeakMemoryUsage()
- {
- return isset($this->ends['pmu']) && isset($this->starts['pmu']) ? $this->ends['pmu'] - $this->starts['pmu'] : 0;
- }
-
- /**
- * Starts the profiling.
- */
- public function enter()
- {
- $this->starts = array(
- 'wt' => microtime(true),
- 'mu' => memory_get_usage(),
- 'pmu' => memory_get_peak_usage(),
- );
- }
-
- /**
- * Stops the profiling.
- */
- public function leave()
- {
- $this->ends = array(
- 'wt' => microtime(true),
- 'mu' => memory_get_usage(),
- 'pmu' => memory_get_peak_usage(),
- );
- }
-
- public function reset()
- {
- $this->starts = $this->ends = $this->profiles = array();
- $this->enter();
- }
-
- public function getIterator()
- {
- return new ArrayIterator($this->profiles);
- }
-
- public function serialize()
- {
- return serialize(array($this->template, $this->name, $this->type, $this->starts, $this->ends, $this->profiles));
- }
-
- public function unserialize($data)
- {
- list($this->template, $this->name, $this->type, $this->starts, $this->ends, $this->profiles) = unserialize($data);
- }
-}
-
-class_alias('Twig_Profiler_Profile', 'Twig\Profiler\Profile', false);
diff --git a/inc/lib/Twig/RuntimeLoaderInterface.php b/inc/lib/Twig/RuntimeLoaderInterface.php
deleted file mode 100644
index f5eb14e0..00000000
--- a/inc/lib/Twig/RuntimeLoaderInterface.php
+++ /dev/null
@@ -1,29 +0,0 @@
-
- */
-interface Twig_RuntimeLoaderInterface
-{
- /**
- * Creates the runtime implementation of a Twig element (filter/function/test).
- *
- * @param string $class A runtime class
- *
- * @return object|null The runtime instance or null if the loader does not know how to create the runtime for this class
- */
- public function load($class);
-}
-
-class_alias('Twig_RuntimeLoaderInterface', 'Twig\RuntimeLoader\RuntimeLoaderInterface', false);
diff --git a/inc/lib/Twig/Sandbox/SecurityError.php b/inc/lib/Twig/Sandbox/SecurityError.php
deleted file mode 100644
index b6707e38..00000000
--- a/inc/lib/Twig/Sandbox/SecurityError.php
+++ /dev/null
@@ -1,21 +0,0 @@
-
- */
-class Twig_Sandbox_SecurityError extends Twig_Error
-{
-}
-
-class_alias('Twig_Sandbox_SecurityError', 'Twig\Sandbox\SecurityError', false);
diff --git a/inc/lib/Twig/Sandbox/SecurityNotAllowedFilterError.php b/inc/lib/Twig/Sandbox/SecurityNotAllowedFilterError.php
deleted file mode 100644
index 0ba33276..00000000
--- a/inc/lib/Twig/Sandbox/SecurityNotAllowedFilterError.php
+++ /dev/null
@@ -1,33 +0,0 @@
-
- */
-class Twig_Sandbox_SecurityNotAllowedFilterError extends Twig_Sandbox_SecurityError
-{
- private $filterName;
-
- public function __construct($message, $functionName, $lineno = -1, $filename = null, Exception $previous = null)
- {
- parent::__construct($message, $lineno, $filename, $previous);
- $this->filterName = $functionName;
- }
-
- public function getFilterName()
- {
- return $this->filterName;
- }
-}
-
-class_alias('Twig_Sandbox_SecurityNotAllowedFilterError', 'Twig\Sandbox\SecurityNotAllowedFilterError', false);
diff --git a/inc/lib/Twig/Sandbox/SecurityNotAllowedFunctionError.php b/inc/lib/Twig/Sandbox/SecurityNotAllowedFunctionError.php
deleted file mode 100644
index aa391429..00000000
--- a/inc/lib/Twig/Sandbox/SecurityNotAllowedFunctionError.php
+++ /dev/null
@@ -1,33 +0,0 @@
-
- */
-class Twig_Sandbox_SecurityNotAllowedFunctionError extends Twig_Sandbox_SecurityError
-{
- private $functionName;
-
- public function __construct($message, $functionName, $lineno = -1, $filename = null, Exception $previous = null)
- {
- parent::__construct($message, $lineno, $filename, $previous);
- $this->functionName = $functionName;
- }
-
- public function getFunctionName()
- {
- return $this->functionName;
- }
-}
-
-class_alias('Twig_Sandbox_SecurityNotAllowedFunctionError', 'Twig\Sandbox\SecurityNotAllowedFunctionError', false);
diff --git a/inc/lib/Twig/Sandbox/SecurityNotAllowedMethodError.php b/inc/lib/Twig/Sandbox/SecurityNotAllowedMethodError.php
deleted file mode 100644
index 93012fe9..00000000
--- a/inc/lib/Twig/Sandbox/SecurityNotAllowedMethodError.php
+++ /dev/null
@@ -1,40 +0,0 @@
-
- */
-class Twig_Sandbox_SecurityNotAllowedMethodError extends Twig_Sandbox_SecurityError
-{
- private $className;
- private $methodName;
-
- public function __construct($message, $className, $methodName, $lineno = -1, $filename = null, Exception $previous = null)
- {
- parent::__construct($message, $lineno, $filename, $previous);
- $this->className = $className;
- $this->methodName = $methodName;
- }
-
- public function getClassName()
- {
- return $this->className;
- }
-
- public function getMethodName()
- {
- return $this->methodName;
- }
-}
-
-class_alias('Twig_Sandbox_SecurityNotAllowedMethodError', 'Twig\Sandbox\SecurityNotAllowedMethodError', false);
diff --git a/inc/lib/Twig/Sandbox/SecurityNotAllowedPropertyError.php b/inc/lib/Twig/Sandbox/SecurityNotAllowedPropertyError.php
deleted file mode 100644
index f27969c1..00000000
--- a/inc/lib/Twig/Sandbox/SecurityNotAllowedPropertyError.php
+++ /dev/null
@@ -1,40 +0,0 @@
-
- */
-class Twig_Sandbox_SecurityNotAllowedPropertyError extends Twig_Sandbox_SecurityError
-{
- private $className;
- private $propertyName;
-
- public function __construct($message, $className, $propertyName, $lineno = -1, $filename = null, Exception $previous = null)
- {
- parent::__construct($message, $lineno, $filename, $previous);
- $this->className = $className;
- $this->propertyName = $propertyName;
- }
-
- public function getClassName()
- {
- return $this->className;
- }
-
- public function getPropertyName()
- {
- return $this->propertyName;
- }
-}
-
-class_alias('Twig_Sandbox_SecurityNotAllowedPropertyError', 'Twig\Sandbox\SecurityNotAllowedPropertyError', false);
diff --git a/inc/lib/Twig/Sandbox/SecurityNotAllowedTagError.php b/inc/lib/Twig/Sandbox/SecurityNotAllowedTagError.php
deleted file mode 100644
index 4bbd2238..00000000
--- a/inc/lib/Twig/Sandbox/SecurityNotAllowedTagError.php
+++ /dev/null
@@ -1,33 +0,0 @@
-
- */
-class Twig_Sandbox_SecurityNotAllowedTagError extends Twig_Sandbox_SecurityError
-{
- private $tagName;
-
- public function __construct($message, $tagName, $lineno = -1, $filename = null, Exception $previous = null)
- {
- parent::__construct($message, $lineno, $filename, $previous);
- $this->tagName = $tagName;
- }
-
- public function getTagName()
- {
- return $this->tagName;
- }
-}
-
-class_alias('Twig_Sandbox_SecurityNotAllowedTagError', 'Twig\Sandbox\SecurityNotAllowedTagError', false);
diff --git a/inc/lib/Twig/Sandbox/SecurityPolicy.php b/inc/lib/Twig/Sandbox/SecurityPolicy.php
deleted file mode 100644
index dca0b82b..00000000
--- a/inc/lib/Twig/Sandbox/SecurityPolicy.php
+++ /dev/null
@@ -1,125 +0,0 @@
-
- */
-class Twig_Sandbox_SecurityPolicy implements Twig_Sandbox_SecurityPolicyInterface
-{
- protected $allowedTags;
- protected $allowedFilters;
- protected $allowedMethods;
- protected $allowedProperties;
- protected $allowedFunctions;
-
- public function __construct(array $allowedTags = array(), array $allowedFilters = array(), array $allowedMethods = array(), array $allowedProperties = array(), array $allowedFunctions = array())
- {
- $this->allowedTags = $allowedTags;
- $this->allowedFilters = $allowedFilters;
- $this->setAllowedMethods($allowedMethods);
- $this->allowedProperties = $allowedProperties;
- $this->allowedFunctions = $allowedFunctions;
- }
-
- public function setAllowedTags(array $tags)
- {
- $this->allowedTags = $tags;
- }
-
- public function setAllowedFilters(array $filters)
- {
- $this->allowedFilters = $filters;
- }
-
- public function setAllowedMethods(array $methods)
- {
- $this->allowedMethods = array();
- foreach ($methods as $class => $m) {
- $this->allowedMethods[$class] = array_map('strtolower', is_array($m) ? $m : array($m));
- }
- }
-
- public function setAllowedProperties(array $properties)
- {
- $this->allowedProperties = $properties;
- }
-
- public function setAllowedFunctions(array $functions)
- {
- $this->allowedFunctions = $functions;
- }
-
- public function checkSecurity($tags, $filters, $functions)
- {
- foreach ($tags as $tag) {
- if (!in_array($tag, $this->allowedTags)) {
- throw new Twig_Sandbox_SecurityNotAllowedTagError(sprintf('Tag "%s" is not allowed.', $tag), $tag);
- }
- }
-
- foreach ($filters as $filter) {
- if (!in_array($filter, $this->allowedFilters)) {
- throw new Twig_Sandbox_SecurityNotAllowedFilterError(sprintf('Filter "%s" is not allowed.', $filter), $filter);
- }
- }
-
- foreach ($functions as $function) {
- if (!in_array($function, $this->allowedFunctions)) {
- throw new Twig_Sandbox_SecurityNotAllowedFunctionError(sprintf('Function "%s" is not allowed.', $function), $function);
- }
- }
- }
-
- public function checkMethodAllowed($obj, $method)
- {
- if ($obj instanceof Twig_TemplateInterface || $obj instanceof Twig_Markup) {
- return true;
- }
-
- $allowed = false;
- $method = strtolower($method);
- foreach ($this->allowedMethods as $class => $methods) {
- if ($obj instanceof $class) {
- $allowed = in_array($method, $methods);
-
- break;
- }
- }
-
- if (!$allowed) {
- $class = get_class($obj);
- throw new Twig_Sandbox_SecurityNotAllowedMethodError(sprintf('Calling "%s" method on a "%s" object is not allowed.', $method, $class), $class, $method);
- }
- }
-
- public function checkPropertyAllowed($obj, $property)
- {
- $allowed = false;
- foreach ($this->allowedProperties as $class => $properties) {
- if ($obj instanceof $class) {
- $allowed = in_array($property, is_array($properties) ? $properties : array($properties));
-
- break;
- }
- }
-
- if (!$allowed) {
- $class = get_class($obj);
- throw new Twig_Sandbox_SecurityNotAllowedPropertyError(sprintf('Calling "%s" property on a "%s" object is not allowed.', $property, $class), $class, $property);
- }
- }
-}
-
-class_alias('Twig_Sandbox_SecurityPolicy', 'Twig\Sandbox\SecurityPolicy', false);
diff --git a/inc/lib/Twig/Sandbox/SecurityPolicyInterface.php b/inc/lib/Twig/Sandbox/SecurityPolicyInterface.php
deleted file mode 100644
index 88f64447..00000000
--- a/inc/lib/Twig/Sandbox/SecurityPolicyInterface.php
+++ /dev/null
@@ -1,26 +0,0 @@
-
- */
-interface Twig_Sandbox_SecurityPolicyInterface
-{
- public function checkSecurity($tags, $filters, $functions);
-
- public function checkMethodAllowed($obj, $method);
-
- public function checkPropertyAllowed($obj, $method);
-}
-
-class_alias('Twig_Sandbox_SecurityPolicyInterface', 'Twig\Sandbox\SecurityPolicyInterface', false);
diff --git a/inc/lib/Twig/SimpleFilter.php b/inc/lib/Twig/SimpleFilter.php
deleted file mode 100644
index ee4c0aeb..00000000
--- a/inc/lib/Twig/SimpleFilter.php
+++ /dev/null
@@ -1,121 +0,0 @@
-
- */
-class Twig_SimpleFilter
-{
- protected $name;
- protected $callable;
- protected $options;
- protected $arguments = array();
-
- public function __construct($name, $callable, array $options = array())
- {
- $this->name = $name;
- $this->callable = $callable;
- $this->options = array_merge(array(
- 'needs_environment' => false,
- 'needs_context' => false,
- 'is_variadic' => false,
- 'is_safe' => null,
- 'is_safe_callback' => null,
- 'pre_escape' => null,
- 'preserves_safety' => null,
- 'node_class' => 'Twig_Node_Expression_Filter',
- 'deprecated' => false,
- 'alternative' => null,
- ), $options);
- }
-
- public function getName()
- {
- return $this->name;
- }
-
- public function getCallable()
- {
- return $this->callable;
- }
-
- public function getNodeClass()
- {
- return $this->options['node_class'];
- }
-
- public function setArguments($arguments)
- {
- $this->arguments = $arguments;
- }
-
- public function getArguments()
- {
- return $this->arguments;
- }
-
- public function needsEnvironment()
- {
- return $this->options['needs_environment'];
- }
-
- public function needsContext()
- {
- return $this->options['needs_context'];
- }
-
- public function getSafe(Twig_Node $filterArgs)
- {
- if (null !== $this->options['is_safe']) {
- return $this->options['is_safe'];
- }
-
- if (null !== $this->options['is_safe_callback']) {
- return call_user_func($this->options['is_safe_callback'], $filterArgs);
- }
- }
-
- public function getPreservesSafety()
- {
- return $this->options['preserves_safety'];
- }
-
- public function getPreEscape()
- {
- return $this->options['pre_escape'];
- }
-
- public function isVariadic()
- {
- return $this->options['is_variadic'];
- }
-
- public function isDeprecated()
- {
- return (bool) $this->options['deprecated'];
- }
-
- public function getDeprecatedVersion()
- {
- return $this->options['deprecated'];
- }
-
- public function getAlternative()
- {
- return $this->options['alternative'];
- }
-}
-
-class_alias('Twig_SimpleFilter', 'Twig\TwigFilter', false);
diff --git a/inc/lib/Twig/SimpleFunction.php b/inc/lib/Twig/SimpleFunction.php
deleted file mode 100644
index a6aa7ca7..00000000
--- a/inc/lib/Twig/SimpleFunction.php
+++ /dev/null
@@ -1,111 +0,0 @@
-
- */
-class Twig_SimpleFunction
-{
- protected $name;
- protected $callable;
- protected $options;
- protected $arguments = array();
-
- public function __construct($name, $callable, array $options = array())
- {
- $this->name = $name;
- $this->callable = $callable;
- $this->options = array_merge(array(
- 'needs_environment' => false,
- 'needs_context' => false,
- 'is_variadic' => false,
- 'is_safe' => null,
- 'is_safe_callback' => null,
- 'node_class' => 'Twig_Node_Expression_Function',
- 'deprecated' => false,
- 'alternative' => null,
- ), $options);
- }
-
- public function getName()
- {
- return $this->name;
- }
-
- public function getCallable()
- {
- return $this->callable;
- }
-
- public function getNodeClass()
- {
- return $this->options['node_class'];
- }
-
- public function setArguments($arguments)
- {
- $this->arguments = $arguments;
- }
-
- public function getArguments()
- {
- return $this->arguments;
- }
-
- public function needsEnvironment()
- {
- return $this->options['needs_environment'];
- }
-
- public function needsContext()
- {
- return $this->options['needs_context'];
- }
-
- public function getSafe(Twig_Node $functionArgs)
- {
- if (null !== $this->options['is_safe']) {
- return $this->options['is_safe'];
- }
-
- if (null !== $this->options['is_safe_callback']) {
- return call_user_func($this->options['is_safe_callback'], $functionArgs);
- }
-
- return array();
- }
-
- public function isVariadic()
- {
- return $this->options['is_variadic'];
- }
-
- public function isDeprecated()
- {
- return (bool) $this->options['deprecated'];
- }
-
- public function getDeprecatedVersion()
- {
- return $this->options['deprecated'];
- }
-
- public function getAlternative()
- {
- return $this->options['alternative'];
- }
-}
-
-class_alias('Twig_SimpleFunction', 'Twig\TwigFunction', false);
diff --git a/inc/lib/Twig/SimpleTest.php b/inc/lib/Twig/SimpleTest.php
deleted file mode 100644
index fee5778b..00000000
--- a/inc/lib/Twig/SimpleTest.php
+++ /dev/null
@@ -1,73 +0,0 @@
-
- */
-class Twig_SimpleTest
-{
- protected $name;
- protected $callable;
- protected $options;
-
- public function __construct($name, $callable, array $options = array())
- {
- $this->name = $name;
- $this->callable = $callable;
- $this->options = array_merge(array(
- 'is_variadic' => false,
- 'node_class' => 'Twig_Node_Expression_Test',
- 'deprecated' => false,
- 'alternative' => null,
- ), $options);
- }
-
- public function getName()
- {
- return $this->name;
- }
-
- public function getCallable()
- {
- return $this->callable;
- }
-
- public function getNodeClass()
- {
- return $this->options['node_class'];
- }
-
- public function isVariadic()
- {
- return $this->options['is_variadic'];
- }
-
- public function isDeprecated()
- {
- return (bool) $this->options['deprecated'];
- }
-
- public function getDeprecatedVersion()
- {
- return $this->options['deprecated'];
- }
-
- public function getAlternative()
- {
- return $this->options['alternative'];
- }
-}
-
-class_alias('Twig_SimpleTest', 'Twig\TwigTest', false);
diff --git a/inc/lib/Twig/Source.php b/inc/lib/Twig/Source.php
deleted file mode 100644
index bd8d869f..00000000
--- a/inc/lib/Twig/Source.php
+++ /dev/null
@@ -1,53 +0,0 @@
-
- */
-class Twig_Source
-{
- private $code;
- private $name;
- private $path;
-
- /**
- * @param string $code The template source code
- * @param string $name The template logical name
- * @param string $path The filesystem path of the template if any
- */
- public function __construct($code, $name, $path = '')
- {
- $this->code = $code;
- $this->name = $name;
- $this->path = $path;
- }
-
- public function getCode()
- {
- return $this->code;
- }
-
- public function getName()
- {
- return $this->name;
- }
-
- public function getPath()
- {
- return $this->path;
- }
-}
-
-class_alias('Twig_Source', 'Twig\Source', false);
diff --git a/inc/lib/Twig/SourceContextLoaderInterface.php b/inc/lib/Twig/SourceContextLoaderInterface.php
deleted file mode 100644
index a6e8c425..00000000
--- a/inc/lib/Twig/SourceContextLoaderInterface.php
+++ /dev/null
@@ -1,33 +0,0 @@
-
- *
- * @deprecated since 1.27 (to be removed in 3.0)
- */
-interface Twig_SourceContextLoaderInterface
-{
- /**
- * Returns the source context for a given template logical name.
- *
- * @param string $name The template logical name
- *
- * @return Twig_Source
- *
- * @throws Twig_Error_Loader When $name is not found
- */
- public function getSourceContext($name);
-}
-
-class_alias('Twig_SourceContextLoaderInterface', 'Twig\Loader\SourceContextLoaderInterface', false);
diff --git a/inc/lib/Twig/Template.php b/inc/lib/Twig/Template.php
deleted file mode 100644
index 3709232a..00000000
--- a/inc/lib/Twig/Template.php
+++ /dev/null
@@ -1,708 +0,0 @@
-load()
- * instead, which returns an instance of Twig_TemplateWrapper.
- *
- * @author Fabien Potencier
- *
- * @internal
- */
-abstract class Twig_Template implements Twig_TemplateInterface
-{
- /**
- * @internal
- */
- protected static $cache = array();
-
- protected $parent;
- protected $parents = array();
- protected $env;
- protected $blocks = array();
- protected $traits = array();
-
- public function __construct(Twig_Environment $env)
- {
- $this->env = $env;
- }
-
- /**
- * @internal this method will be removed in 2.0 and is only used internally to provide an upgrade path from 1.x to 2.0
- */
- public function __toString()
- {
- return $this->getTemplateName();
- }
-
- /**
- * Returns the template name.
- *
- * @return string The template name
- */
- abstract public function getTemplateName();
-
- /**
- * Returns debug information about the template.
- *
- * @return array Debug information
- *
- * @internal
- */
- public function getDebugInfo()
- {
- return array();
- }
-
- /**
- * Returns the template source code.
- *
- * @return string The template source code
- *
- * @deprecated since 1.27 (to be removed in 2.0). Use getSourceContext() instead
- */
- public function getSource()
- {
- @trigger_error('The '.__METHOD__.' method is deprecated since version 1.27 and will be removed in 2.0. Use getSourceContext() instead.', E_USER_DEPRECATED);
-
- return '';
- }
-
- /**
- * Returns information about the original template source code.
- *
- * @return Twig_Source
- */
- public function getSourceContext()
- {
- return new Twig_Source('', $this->getTemplateName());
- }
-
- /**
- * @deprecated since 1.20 (to be removed in 2.0)
- */
- public function getEnvironment()
- {
- @trigger_error('The '.__METHOD__.' method is deprecated since version 1.20 and will be removed in 2.0.', E_USER_DEPRECATED);
-
- return $this->env;
- }
-
- /**
- * Returns the parent template.
- *
- * This method is for internal use only and should never be called
- * directly.
- *
- * @param array $context
- *
- * @return Twig_TemplateInterface|false The parent template or false if there is no parent
- *
- * @internal
- */
- public function getParent(array $context)
- {
- if (null !== $this->parent) {
- return $this->parent;
- }
-
- try {
- $parent = $this->doGetParent($context);
-
- if (false === $parent) {
- return false;
- }
-
- if ($parent instanceof self) {
- return $this->parents[$parent->getTemplateName()] = $parent;
- }
-
- if (!isset($this->parents[$parent])) {
- $this->parents[$parent] = $this->loadTemplate($parent);
- }
- } catch (Twig_Error_Loader $e) {
- $e->setSourceContext(null);
- $e->guess();
-
- throw $e;
- }
-
- return $this->parents[$parent];
- }
-
- protected function doGetParent(array $context)
- {
- return false;
- }
-
- public function isTraitable()
- {
- return true;
- }
-
- /**
- * Displays a parent block.
- *
- * This method is for internal use only and should never be called
- * directly.
- *
- * @param string $name The block name to display from the parent
- * @param array $context The context
- * @param array $blocks The current set of blocks
- *
- * @internal
- */
- public function displayParentBlock($name, array $context, array $blocks = array())
- {
- $name = (string) $name;
-
- if (isset($this->traits[$name])) {
- $this->traits[$name][0]->displayBlock($name, $context, $blocks, false);
- } elseif (false !== $parent = $this->getParent($context)) {
- $parent->displayBlock($name, $context, $blocks, false);
- } else {
- throw new Twig_Error_Runtime(sprintf('The template has no parent and no traits defining the "%s" block.', $name), -1, $this->getSourceContext());
- }
- }
-
- /**
- * Displays a block.
- *
- * This method is for internal use only and should never be called
- * directly.
- *
- * @param string $name The block name to display
- * @param array $context The context
- * @param array $blocks The current set of blocks
- * @param bool $useBlocks Whether to use the current set of blocks
- *
- * @internal
- */
- public function displayBlock($name, array $context, array $blocks = array(), $useBlocks = true)
- {
- $name = (string) $name;
-
- if ($useBlocks && isset($blocks[$name])) {
- $template = $blocks[$name][0];
- $block = $blocks[$name][1];
- } elseif (isset($this->blocks[$name])) {
- $template = $this->blocks[$name][0];
- $block = $this->blocks[$name][1];
- } else {
- $template = null;
- $block = null;
- }
-
- // avoid RCEs when sandbox is enabled
- if (null !== $template && !$template instanceof self) {
- throw new LogicException('A block must be a method on a Twig_Template instance.');
- }
-
- if (null !== $template) {
- try {
- $template->$block($context, $blocks);
- } catch (Twig_Error $e) {
- if (!$e->getSourceContext()) {
- $e->setSourceContext($template->getSourceContext());
- }
-
- // this is mostly useful for Twig_Error_Loader exceptions
- // see Twig_Error_Loader
- if (false === $e->getTemplateLine()) {
- $e->setTemplateLine(-1);
- $e->guess();
- }
-
- throw $e;
- } catch (Exception $e) {
- throw new Twig_Error_Runtime(sprintf('An exception has been thrown during the rendering of a template ("%s").', $e->getMessage()), -1, $template->getSourceContext(), $e);
- }
- } elseif (false !== $parent = $this->getParent($context)) {
- $parent->displayBlock($name, $context, array_merge($this->blocks, $blocks), false);
- } else {
- @trigger_error(sprintf('Silent display of undefined block "%s" in template "%s" is deprecated since version 1.29 and will throw an exception in 2.0. Use the "block(\'%s\') is defined" expression to test for block existence.', $name, $this->getTemplateName(), $name), E_USER_DEPRECATED);
- }
- }
-
- /**
- * Renders a parent block.
- *
- * This method is for internal use only and should never be called
- * directly.
- *
- * @param string $name The block name to render from the parent
- * @param array $context The context
- * @param array $blocks The current set of blocks
- *
- * @return string The rendered block
- *
- * @internal
- */
- public function renderParentBlock($name, array $context, array $blocks = array())
- {
- ob_start();
- $this->displayParentBlock($name, $context, $blocks);
-
- return ob_get_clean();
- }
-
- /**
- * Renders a block.
- *
- * This method is for internal use only and should never be called
- * directly.
- *
- * @param string $name The block name to render
- * @param array $context The context
- * @param array $blocks The current set of blocks
- * @param bool $useBlocks Whether to use the current set of blocks
- *
- * @return string The rendered block
- *
- * @internal
- */
- public function renderBlock($name, array $context, array $blocks = array(), $useBlocks = true)
- {
- ob_start();
- $this->displayBlock($name, $context, $blocks, $useBlocks);
-
- return ob_get_clean();
- }
-
- /**
- * Returns whether a block exists or not in the current context of the template.
- *
- * This method checks blocks defined in the current template
- * or defined in "used" traits or defined in parent templates.
- *
- * @param string $name The block name
- * @param array $context The context
- * @param array $blocks The current set of blocks
- *
- * @return bool true if the block exists, false otherwise
- *
- * @internal
- */
- public function hasBlock($name, array $context = null, array $blocks = array())
- {
- if (null === $context) {
- @trigger_error('The '.__METHOD__.' method is internal and should never be called; calling it directly is deprecated since version 1.28 and won\'t be possible anymore in 2.0.', E_USER_DEPRECATED);
-
- return isset($this->blocks[(string) $name]);
- }
-
- if (isset($blocks[$name])) {
- return $blocks[$name][0] instanceof self;
- }
-
- if (isset($this->blocks[$name])) {
- return true;
- }
-
- if (false !== $parent = $this->getParent($context)) {
- return $parent->hasBlock($name, $context);
- }
-
- return false;
- }
-
- /**
- * Returns all block names in the current context of the template.
- *
- * This method checks blocks defined in the current template
- * or defined in "used" traits or defined in parent templates.
- *
- * @param array $context The context
- * @param array $blocks The current set of blocks
- *
- * @return array An array of block names
- *
- * @internal
- */
- public function getBlockNames(array $context = null, array $blocks = array())
- {
- if (null === $context) {
- @trigger_error('The '.__METHOD__.' method is internal and should never be called; calling it directly is deprecated since version 1.28 and won\'t be possible anymore in 2.0.', E_USER_DEPRECATED);
-
- return array_keys($this->blocks);
- }
-
- $names = array_merge(array_keys($blocks), array_keys($this->blocks));
-
- if (false !== $parent = $this->getParent($context)) {
- $names = array_merge($names, $parent->getBlockNames($context));
- }
-
- return array_unique($names);
- }
-
- protected function loadTemplate($template, $templateName = null, $line = null, $index = null)
- {
- try {
- if (is_array($template)) {
- return $this->env->resolveTemplate($template);
- }
-
- if ($template instanceof self) {
- return $template;
- }
-
- if ($template instanceof Twig_TemplateWrapper) {
- return $template;
- }
-
- return $this->env->loadTemplate($template, $index);
- } catch (Twig_Error $e) {
- if (!$e->getSourceContext()) {
- $e->setSourceContext($templateName ? new Twig_Source('', $templateName) : $this->getSourceContext());
- }
-
- if ($e->getTemplateLine()) {
- throw $e;
- }
-
- if (!$line) {
- $e->guess();
- } else {
- $e->setTemplateLine($line);
- }
-
- throw $e;
- }
- }
-
- /**
- * Returns all blocks.
- *
- * This method is for internal use only and should never be called
- * directly.
- *
- * @return array An array of blocks
- *
- * @internal
- */
- public function getBlocks()
- {
- return $this->blocks;
- }
-
- public function display(array $context, array $blocks = array())
- {
- $this->displayWithErrorHandling($this->env->mergeGlobals($context), array_merge($this->blocks, $blocks));
- }
-
- public function render(array $context)
- {
- $level = ob_get_level();
- ob_start();
- try {
- $this->display($context);
- } catch (Exception $e) {
- while (ob_get_level() > $level) {
- ob_end_clean();
- }
-
- throw $e;
- } catch (Throwable $e) {
- while (ob_get_level() > $level) {
- ob_end_clean();
- }
-
- throw $e;
- }
-
- return ob_get_clean();
- }
-
- protected function displayWithErrorHandling(array $context, array $blocks = array())
- {
- try {
- $this->doDisplay($context, $blocks);
- } catch (Twig_Error $e) {
- if (!$e->getSourceContext()) {
- $e->setSourceContext($this->getSourceContext());
- }
-
- // this is mostly useful for Twig_Error_Loader exceptions
- // see Twig_Error_Loader
- if (false === $e->getTemplateLine()) {
- $e->setTemplateLine(-1);
- $e->guess();
- }
-
- throw $e;
- } catch (Exception $e) {
- throw new Twig_Error_Runtime(sprintf('An exception has been thrown during the rendering of a template ("%s").', $e->getMessage()), -1, $this->getSourceContext(), $e);
- }
- }
-
- /**
- * Auto-generated method to display the template with the given context.
- *
- * @param array $context An array of parameters to pass to the template
- * @param array $blocks An array of blocks to pass to the template
- */
- abstract protected function doDisplay(array $context, array $blocks = array());
-
- /**
- * Returns a variable from the context.
- *
- * This method is for internal use only and should never be called
- * directly.
- *
- * This method should not be overridden in a sub-class as this is an
- * implementation detail that has been introduced to optimize variable
- * access for versions of PHP before 5.4. This is not a way to override
- * the way to get a variable value.
- *
- * @param array $context The context
- * @param string $item The variable to return from the context
- * @param bool $ignoreStrictCheck Whether to ignore the strict variable check or not
- *
- * @return mixed The content of the context variable
- *
- * @throws Twig_Error_Runtime if the variable does not exist and Twig is running in strict mode
- *
- * @internal
- */
- final protected function getContext($context, $item, $ignoreStrictCheck = false)
- {
- if (!array_key_exists($item, $context)) {
- if ($ignoreStrictCheck || !$this->env->isStrictVariables()) {
- return;
- }
-
- throw new Twig_Error_Runtime(sprintf('Variable "%s" does not exist.', $item), -1, $this->getSourceContext());
- }
-
- return $context[$item];
- }
-
- /**
- * Returns the attribute value for a given array/object.
- *
- * @param mixed $object The object or array from where to get the item
- * @param mixed $item The item to get from the array or object
- * @param array $arguments An array of arguments to pass if the item is an object method
- * @param string $type The type of attribute (@see Twig_Template constants)
- * @param bool $isDefinedTest Whether this is only a defined check
- * @param bool $ignoreStrictCheck Whether to ignore the strict attribute check or not
- *
- * @return mixed The attribute value, or a Boolean when $isDefinedTest is true, or null when the attribute is not set and $ignoreStrictCheck is true
- *
- * @throws Twig_Error_Runtime if the attribute does not exist and Twig is running in strict mode and $isDefinedTest is false
- *
- * @internal
- */
- protected function getAttribute($object, $item, array $arguments = array(), $type = self::ANY_CALL, $isDefinedTest = false, $ignoreStrictCheck = false)
- {
- // array
- if (self::METHOD_CALL !== $type) {
- $arrayItem = is_bool($item) || is_float($item) ? (int) $item : $item;
-
- if ((is_array($object) && (isset($object[$arrayItem]) || array_key_exists($arrayItem, $object)))
- || ($object instanceof ArrayAccess && isset($object[$arrayItem]))
- ) {
- if ($isDefinedTest) {
- return true;
- }
-
- return $object[$arrayItem];
- }
-
- if (self::ARRAY_CALL === $type || !is_object($object)) {
- if ($isDefinedTest) {
- return false;
- }
-
- if ($ignoreStrictCheck || !$this->env->isStrictVariables()) {
- return;
- }
-
- if ($object instanceof ArrayAccess) {
- $message = sprintf('Key "%s" in object with ArrayAccess of class "%s" does not exist.', $arrayItem, get_class($object));
- } elseif (is_object($object)) {
- $message = sprintf('Impossible to access a key "%s" on an object of class "%s" that does not implement ArrayAccess interface.', $item, get_class($object));
- } elseif (is_array($object)) {
- if (empty($object)) {
- $message = sprintf('Key "%s" does not exist as the array is empty.', $arrayItem);
- } else {
- $message = sprintf('Key "%s" for array with keys "%s" does not exist.', $arrayItem, implode(', ', array_keys($object)));
- }
- } elseif (self::ARRAY_CALL === $type) {
- if (null === $object) {
- $message = sprintf('Impossible to access a key ("%s") on a null variable.', $item);
- } else {
- $message = sprintf('Impossible to access a key ("%s") on a %s variable ("%s").', $item, gettype($object), $object);
- }
- } elseif (null === $object) {
- $message = sprintf('Impossible to access an attribute ("%s") on a null variable.', $item);
- } else {
- $message = sprintf('Impossible to access an attribute ("%s") on a %s variable ("%s").', $item, gettype($object), $object);
- }
-
- throw new Twig_Error_Runtime($message, -1, $this->getSourceContext());
- }
- }
-
- if (!is_object($object)) {
- if ($isDefinedTest) {
- return false;
- }
-
- if ($ignoreStrictCheck || !$this->env->isStrictVariables()) {
- return;
- }
-
- if (null === $object) {
- $message = sprintf('Impossible to invoke a method ("%s") on a null variable.', $item);
- } elseif (is_array($object)) {
- $message = sprintf('Impossible to invoke a method ("%s") on an array.', $item);
- } else {
- $message = sprintf('Impossible to invoke a method ("%s") on a %s variable ("%s").', $item, gettype($object), $object);
- }
-
- throw new Twig_Error_Runtime($message, -1, $this->getSourceContext());
- }
-
- // object property
- if (self::METHOD_CALL !== $type && !$object instanceof self) { // Twig_Template does not have public properties, and we don't want to allow access to internal ones
- if (isset($object->$item) || array_key_exists((string) $item, $object)) {
- if ($isDefinedTest) {
- return true;
- }
-
- if ($this->env->hasExtension('Twig_Extension_Sandbox')) {
- $this->env->getExtension('Twig_Extension_Sandbox')->checkPropertyAllowed($object, $item);
- }
-
- return $object->$item;
- }
- }
-
- $class = get_class($object);
-
- // object method
- if (!isset(self::$cache[$class])) {
- // get_class_methods returns all methods accessible in the scope, but we only want public ones to be accessible in templates
- if ($object instanceof self) {
- $ref = new ReflectionClass($class);
- $methods = array();
-
- foreach ($ref->getMethods(ReflectionMethod::IS_PUBLIC) as $refMethod) {
- // Accessing the environment from templates is forbidden to prevent untrusted changes to the environment
- if ('getenvironment' !== strtolower($refMethod->name)) {
- $methods[] = $refMethod->name;
- }
- }
- } else {
- $methods = get_class_methods($object);
- }
- // sort values to have consistent behavior, so that "get" methods win precedence over "is" methods
- sort($methods);
-
- $cache = array();
-
- foreach ($methods as $method) {
- $cache[$method] = $method;
- $cache[$lcName = strtolower($method)] = $method;
-
- if ('g' === $lcName[0] && 0 === strpos($lcName, 'get')) {
- $name = substr($method, 3);
- $lcName = substr($lcName, 3);
- } elseif ('i' === $lcName[0] && 0 === strpos($lcName, 'is')) {
- $name = substr($method, 2);
- $lcName = substr($lcName, 2);
- } else {
- continue;
- }
-
- // skip get() and is() methods (in which case, $name is empty)
- if ($name) {
- if (!isset($cache[$name])) {
- $cache[$name] = $method;
- }
- if (!isset($cache[$lcName])) {
- $cache[$lcName] = $method;
- }
- }
- }
- self::$cache[$class] = $cache;
- }
-
- $call = false;
- if (isset(self::$cache[$class][$item])) {
- $method = self::$cache[$class][$item];
- } elseif (isset(self::$cache[$class][$lcItem = strtolower($item)])) {
- $method = self::$cache[$class][$lcItem];
- } elseif (isset(self::$cache[$class]['__call'])) {
- $method = $item;
- $call = true;
- } else {
- if ($isDefinedTest) {
- return false;
- }
-
- if ($ignoreStrictCheck || !$this->env->isStrictVariables()) {
- return;
- }
-
- throw new Twig_Error_Runtime(sprintf('Neither the property "%1$s" nor one of the methods "%1$s()", "get%1$s()"/"is%1$s()" or "__call()" exist and have public access in class "%2$s".', $item, $class), -1, $this->getSourceContext());
- }
-
- if ($isDefinedTest) {
- return true;
- }
-
- if ($this->env->hasExtension('Twig_Extension_Sandbox')) {
- $this->env->getExtension('Twig_Extension_Sandbox')->checkMethodAllowed($object, $method);
- }
-
- // Some objects throw exceptions when they have __call, and the method we try
- // to call is not supported. If ignoreStrictCheck is true, we should return null.
- try {
- if (!$arguments) {
- $ret = $object->$method();
- } else {
- $ret = call_user_func_array(array($object, $method), $arguments);
- }
- } catch (BadMethodCallException $e) {
- if ($call && ($ignoreStrictCheck || !$this->env->isStrictVariables())) {
- return;
- }
- throw $e;
- }
-
- // @deprecated in 1.28
- if ($object instanceof Twig_TemplateInterface) {
- $self = $object->getTemplateName() === $this->getTemplateName();
- $message = sprintf('Calling "%s" on template "%s" from template "%s" is deprecated since version 1.28 and won\'t be supported anymore in 2.0.', $item, $object->getTemplateName(), $this->getTemplateName());
- if ('renderBlock' === $method || 'displayBlock' === $method) {
- $message .= sprintf(' Use block("%s"%s) instead).', $arguments[0], $self ? '' : ', template');
- } elseif ('hasBlock' === $method) {
- $message .= sprintf(' Use "block("%s"%s) is defined" instead).', $arguments[0], $self ? '' : ', template');
- } elseif ('render' === $method || 'display' === $method) {
- $message .= sprintf(' Use include("%s") instead).', $object->getTemplateName());
- }
- @trigger_error($message, E_USER_DEPRECATED);
-
- return '' === $ret ? '' : new Twig_Markup($ret, $this->env->getCharset());
- }
-
- return $ret;
- }
-}
-
-class_alias('Twig_Template', 'Twig\Template', false);
diff --git a/inc/lib/Twig/TemplateInterface.php b/inc/lib/Twig/TemplateInterface.php
deleted file mode 100644
index 457ef7d7..00000000
--- a/inc/lib/Twig/TemplateInterface.php
+++ /dev/null
@@ -1,48 +0,0 @@
-
- *
- * @deprecated since 1.12 (to be removed in 3.0)
- */
-interface Twig_TemplateInterface
-{
- const ANY_CALL = 'any';
- const ARRAY_CALL = 'array';
- const METHOD_CALL = 'method';
-
- /**
- * Renders the template with the given context and returns it as string.
- *
- * @param array $context An array of parameters to pass to the template
- *
- * @return string The rendered template
- */
- public function render(array $context);
-
- /**
- * Displays the template with the given context.
- *
- * @param array $context An array of parameters to pass to the template
- * @param array $blocks An array of blocks to pass to the template
- */
- public function display(array $context, array $blocks = array());
-
- /**
- * Returns the bound environment for this template.
- *
- * @return Twig_Environment
- */
- public function getEnvironment();
-}
diff --git a/inc/lib/Twig/TemplateWrapper.php b/inc/lib/Twig/TemplateWrapper.php
deleted file mode 100644
index 497f6e98..00000000
--- a/inc/lib/Twig/TemplateWrapper.php
+++ /dev/null
@@ -1,133 +0,0 @@
-
- */
-final class Twig_TemplateWrapper
-{
- private $env;
- private $template;
-
- /**
- * This method is for internal use only and should never be called
- * directly (use Twig_Environment::load() instead).
- *
- * @internal
- */
- public function __construct(Twig_Environment $env, Twig_Template $template)
- {
- $this->env = $env;
- $this->template = $template;
- }
-
- /**
- * Renders the template.
- *
- * @param array $context An array of parameters to pass to the template
- *
- * @return string The rendered template
- */
- public function render($context = array())
- {
- return $this->template->render($context);
- }
-
- /**
- * Displays the template.
- *
- * @param array $context An array of parameters to pass to the template
- */
- public function display($context = array())
- {
- $this->template->display($context);
- }
-
- /**
- * Checks if a block is defined.
- *
- * @param string $name The block name
- * @param array $context An array of parameters to pass to the template
- *
- * @return bool
- */
- public function hasBlock($name, $context = array())
- {
- return $this->template->hasBlock($name, $context);
- }
-
- /**
- * Returns defined block names in the template.
- *
- * @param array $context An array of parameters to pass to the template
- *
- * @return string[] An array of defined template block names
- */
- public function getBlockNames($context = array())
- {
- return $this->template->getBlockNames($context);
- }
-
- /**
- * Renders a template block.
- *
- * @param string $name The block name to render
- * @param array $context An array of parameters to pass to the template
- *
- * @return string The rendered block
- */
- public function renderBlock($name, $context = array())
- {
- $context = $this->env->mergeGlobals($context);
- $level = ob_get_level();
- ob_start();
- try {
- $this->template->displayBlock($name, $context);
- } catch (Exception $e) {
- while (ob_get_level() > $level) {
- ob_end_clean();
- }
-
- throw $e;
- } catch (Throwable $e) {
- while (ob_get_level() > $level) {
- ob_end_clean();
- }
-
- throw $e;
- }
-
- return ob_get_clean();
- }
-
- /**
- * Displays a template block.
- *
- * @param string $name The block name to render
- * @param array $context An array of parameters to pass to the template
- */
- public function displayBlock($name, $context = array())
- {
- $this->template->displayBlock($name, $this->env->mergeGlobals($context));
- }
-
- /**
- * @return Twig_Source
- */
- public function getSourceContext()
- {
- return $this->template->getSourceContext();
- }
-}
-
-class_alias('Twig_TemplateWrapper', 'Twig\TemplateWrapper', false);
diff --git a/inc/lib/Twig/Test.php b/inc/lib/Twig/Test.php
deleted file mode 100644
index b450ec62..00000000
--- a/inc/lib/Twig/Test.php
+++ /dev/null
@@ -1,37 +0,0 @@
-
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-abstract class Twig_Test implements Twig_TestInterface, Twig_TestCallableInterface
-{
- protected $options;
- protected $arguments = array();
-
- public function __construct(array $options = array())
- {
- $this->options = array_merge(array(
- 'callable' => null,
- ), $options);
- }
-
- public function getCallable()
- {
- return $this->options['callable'];
- }
-}
diff --git a/inc/lib/Twig/Test/Function.php b/inc/lib/Twig/Test/Function.php
deleted file mode 100644
index 9e83c3f8..00000000
--- a/inc/lib/Twig/Test/Function.php
+++ /dev/null
@@ -1,38 +0,0 @@
-
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-class Twig_Test_Function extends Twig_Test
-{
- protected $function;
-
- public function __construct($function, array $options = array())
- {
- $options['callable'] = $function;
-
- parent::__construct($options);
-
- $this->function = $function;
- }
-
- public function compile()
- {
- return $this->function;
- }
-}
diff --git a/inc/lib/Twig/Test/IntegrationTestCase.php b/inc/lib/Twig/Test/IntegrationTestCase.php
deleted file mode 100644
index 016951aa..00000000
--- a/inc/lib/Twig/Test/IntegrationTestCase.php
+++ /dev/null
@@ -1,249 +0,0 @@
-
- * @author Karma Dordrak
- */
-abstract class Twig_Test_IntegrationTestCase extends TestCase
-{
- /**
- * @return string
- */
- abstract protected function getFixturesDir();
-
- /**
- * @return Twig_RuntimeLoaderInterface[]
- */
- protected function getRuntimeLoaders()
- {
- return array();
- }
-
- /**
- * @return Twig_ExtensionInterface[]
- */
- protected function getExtensions()
- {
- return array();
- }
-
- /**
- * @return Twig_SimpleFilter[]
- */
- protected function getTwigFilters()
- {
- return array();
- }
-
- /**
- * @return Twig_SimpleFunction[]
- */
- protected function getTwigFunctions()
- {
- return array();
- }
-
- /**
- * @return Twig_SimpleTest[]
- */
- protected function getTwigTests()
- {
- return array();
- }
-
- /**
- * @dataProvider getTests
- */
- public function testIntegration($file, $message, $condition, $templates, $exception, $outputs)
- {
- $this->doIntegrationTest($file, $message, $condition, $templates, $exception, $outputs);
- }
-
- /**
- * @dataProvider getLegacyTests
- * @group legacy
- */
- public function testLegacyIntegration($file, $message, $condition, $templates, $exception, $outputs)
- {
- $this->doIntegrationTest($file, $message, $condition, $templates, $exception, $outputs);
- }
-
- public function getTests($name, $legacyTests = false)
- {
- $fixturesDir = realpath($this->getFixturesDir());
- $tests = array();
-
- foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($fixturesDir), RecursiveIteratorIterator::LEAVES_ONLY) as $file) {
- if (!preg_match('/\.test$/', $file)) {
- continue;
- }
-
- if ($legacyTests xor false !== strpos($file->getRealpath(), '.legacy.test')) {
- continue;
- }
-
- $test = file_get_contents($file->getRealpath());
-
- if (preg_match('/--TEST--\s*(.*?)\s*(?:--CONDITION--\s*(.*))?\s*((?:--TEMPLATE(?:\(.*?\))?--(?:.*?))+)\s*(?:--DATA--\s*(.*))?\s*--EXCEPTION--\s*(.*)/sx', $test, $match)) {
- $message = $match[1];
- $condition = $match[2];
- $templates = self::parseTemplates($match[3]);
- $exception = $match[5];
- $outputs = array(array(null, $match[4], null, ''));
- } elseif (preg_match('/--TEST--\s*(.*?)\s*(?:--CONDITION--\s*(.*))?\s*((?:--TEMPLATE(?:\(.*?\))?--(?:.*?))+)--DATA--.*?--EXPECT--.*/s', $test, $match)) {
- $message = $match[1];
- $condition = $match[2];
- $templates = self::parseTemplates($match[3]);
- $exception = false;
- preg_match_all('/--DATA--(.*?)(?:--CONFIG--(.*?))?--EXPECT--(.*?)(?=\-\-DATA\-\-|$)/s', $test, $outputs, PREG_SET_ORDER);
- } else {
- throw new InvalidArgumentException(sprintf('Test "%s" is not valid.', str_replace($fixturesDir.'/', '', $file)));
- }
-
- $tests[] = array(str_replace($fixturesDir.'/', '', $file), $message, $condition, $templates, $exception, $outputs);
- }
-
- if ($legacyTests && empty($tests)) {
- // add a dummy test to avoid a PHPUnit message
- return array(array('not', '-', '', array(), '', array()));
- }
-
- return $tests;
- }
-
- public function getLegacyTests()
- {
- return $this->getTests('testLegacyIntegration', true);
- }
-
- protected function doIntegrationTest($file, $message, $condition, $templates, $exception, $outputs)
- {
- if (!$outputs) {
- $this->markTestSkipped('no legacy tests to run');
- }
-
- if ($condition) {
- eval('$ret = '.$condition.';');
- if (!$ret) {
- $this->markTestSkipped($condition);
- }
- }
-
- $loader = new Twig_Loader_Array($templates);
-
- foreach ($outputs as $i => $match) {
- $config = array_merge(array(
- 'cache' => false,
- 'strict_variables' => true,
- ), $match[2] ? eval($match[2].';') : array());
- $twig = new Twig_Environment($loader, $config);
- $twig->addGlobal('global', 'global');
- foreach ($this->getRuntimeLoaders() as $runtimeLoader) {
- $twig->addRuntimeLoader($runtimeLoader);
- }
-
- foreach ($this->getExtensions() as $extension) {
- $twig->addExtension($extension);
- }
-
- foreach ($this->getTwigFilters() as $filter) {
- $twig->addFilter($filter);
- }
-
- foreach ($this->getTwigTests() as $test) {
- $twig->addTest($test);
- }
-
- foreach ($this->getTwigFunctions() as $function) {
- $twig->addFunction($function);
- }
-
- // avoid using the same PHP class name for different cases
- // only for PHP 5.2+
- if (PHP_VERSION_ID >= 50300) {
- $p = new ReflectionProperty($twig, 'templateClassPrefix');
- $p->setAccessible(true);
- $p->setValue($twig, '__TwigTemplate_'.hash('sha256', uniqid(mt_rand(), true), false).'_');
- }
-
- try {
- $template = $twig->loadTemplate('index.twig');
- } catch (Exception $e) {
- if (false !== $exception) {
- $message = $e->getMessage();
- $this->assertSame(trim($exception), trim(sprintf('%s: %s', get_class($e), $message)));
- $last = substr($message, strlen($message) - 1);
- $this->assertTrue('.' === $last || '?' === $last, $message, 'Exception message must end with a dot or a question mark.');
-
- return;
- }
-
- throw new Twig_Error(sprintf('%s: %s', get_class($e), $e->getMessage()), -1, $file, $e);
- }
-
- try {
- $output = trim($template->render(eval($match[1].';')), "\n ");
- } catch (Exception $e) {
- if (false !== $exception) {
- $this->assertSame(trim($exception), trim(sprintf('%s: %s', get_class($e), $e->getMessage())));
-
- return;
- }
-
- $e = new Twig_Error(sprintf('%s: %s', get_class($e), $e->getMessage()), -1, $file, $e);
-
- $output = trim(sprintf('%s: %s', get_class($e), $e->getMessage()));
- }
-
- if (false !== $exception) {
- list($class) = explode(':', $exception);
- $constraintClass = class_exists('PHPUnit\Framework\Constraint\Exception') ? 'PHPUnit\Framework\Constraint\Exception' : 'PHPUnit_Framework_Constraint_Exception';
- $this->assertThat(null, new $constraintClass($class));
- }
-
- $expected = trim($match[3], "\n ");
-
- if ($expected !== $output) {
- printf("Compiled templates that failed on case %d:\n", $i + 1);
-
- foreach (array_keys($templates) as $name) {
- echo "Template: $name\n";
- $loader = $twig->getLoader();
- if (!$loader instanceof Twig_SourceContextLoaderInterface) {
- $source = new Twig_Source($loader->getSource($name), $name);
- } else {
- $source = $loader->getSourceContext($name);
- }
- echo $twig->compile($twig->parse($twig->tokenize($source)));
- }
- }
- $this->assertEquals($expected, $output, $message.' (in '.$file.')');
- }
- }
-
- protected static function parseTemplates($test)
- {
- $templates = array();
- preg_match_all('/--TEMPLATE(?:\((.*?)\))?--(.*?)(?=\-\-TEMPLATE|$)/s', $test, $matches, PREG_SET_ORDER);
- foreach ($matches as $match) {
- $templates[($match[1] ? $match[1] : 'index.twig')] = $match[2];
- }
-
- return $templates;
- }
-}
-
-class_alias('Twig_Test_IntegrationTestCase', 'Twig\Test\IntegrationTestCase', false);
diff --git a/inc/lib/Twig/Test/Method.php b/inc/lib/Twig/Test/Method.php
deleted file mode 100644
index feccd5db..00000000
--- a/inc/lib/Twig/Test/Method.php
+++ /dev/null
@@ -1,40 +0,0 @@
-
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-class Twig_Test_Method extends Twig_Test
-{
- protected $extension;
- protected $method;
-
- public function __construct(Twig_ExtensionInterface $extension, $method, array $options = array())
- {
- $options['callable'] = array($extension, $method);
-
- parent::__construct($options);
-
- $this->extension = $extension;
- $this->method = $method;
- }
-
- public function compile()
- {
- return sprintf('$this->env->getExtension(\'%s\')->%s', get_class($this->extension), $this->method);
- }
-}
diff --git a/inc/lib/Twig/Test/Node.php b/inc/lib/Twig/Test/Node.php
deleted file mode 100644
index 6098a527..00000000
--- a/inc/lib/Twig/Test/Node.php
+++ /dev/null
@@ -1,40 +0,0 @@
-
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-class Twig_Test_Node extends Twig_Test
-{
- protected $class;
-
- public function __construct($class, array $options = array())
- {
- parent::__construct($options);
-
- $this->class = $class;
- }
-
- public function getClass()
- {
- return $this->class;
- }
-
- public function compile()
- {
- }
-}
diff --git a/inc/lib/Twig/Test/NodeTestCase.php b/inc/lib/Twig/Test/NodeTestCase.php
deleted file mode 100644
index 47942675..00000000
--- a/inc/lib/Twig/Test/NodeTestCase.php
+++ /dev/null
@@ -1,75 +0,0 @@
-assertNodeCompilation($source, $node, $environment, $isPattern);
- }
-
- public function assertNodeCompilation($source, Twig_Node $node, Twig_Environment $environment = null, $isPattern = false)
- {
- $compiler = $this->getCompiler($environment);
- $compiler->compile($node);
-
- if ($isPattern) {
- $this->assertStringMatchesFormat($source, trim($compiler->getSource()));
- } else {
- $this->assertEquals($source, trim($compiler->getSource()));
- }
- }
-
- protected function getCompiler(Twig_Environment $environment = null)
- {
- return new Twig_Compiler(null === $environment ? $this->getEnvironment() : $environment);
- }
-
- protected function getEnvironment()
- {
- return new Twig_Environment(new Twig_Loader_Array(array()));
- }
-
- protected function getVariableGetter($name, $line = false)
- {
- $line = $line > 0 ? "// line {$line}\n" : '';
-
- if (PHP_VERSION_ID >= 70000) {
- return sprintf('%s($context["%s"] ?? null)', $line, $name, $name);
- }
-
- if (PHP_VERSION_ID >= 50400) {
- return sprintf('%s(isset($context["%s"]) ? $context["%s"] : null)', $line, $name, $name);
- }
-
- return sprintf('%s$this->getContext($context, "%s")', $line, $name);
- }
-
- protected function getAttributeGetter()
- {
- if (function_exists('twig_template_get_attributes')) {
- return 'twig_template_get_attributes($this, ';
- }
-
- return '$this->getAttribute(';
- }
-}
-
-class_alias('Twig_Test_NodeTestCase', 'Twig\Test\NodeTestCase', false);
-class_exists('Twig_Environment');
-class_exists('Twig_Node');
diff --git a/inc/lib/Twig/TestCallableInterface.php b/inc/lib/Twig/TestCallableInterface.php
deleted file mode 100644
index 51ecb9a2..00000000
--- a/inc/lib/Twig/TestCallableInterface.php
+++ /dev/null
@@ -1,22 +0,0 @@
-
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-interface Twig_TestCallableInterface
-{
- public function getCallable();
-}
diff --git a/inc/lib/Twig/TestInterface.php b/inc/lib/Twig/TestInterface.php
deleted file mode 100644
index 91664075..00000000
--- a/inc/lib/Twig/TestInterface.php
+++ /dev/null
@@ -1,27 +0,0 @@
-
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-interface Twig_TestInterface
-{
- /**
- * Compiles a test.
- *
- * @return string The PHP code for the test
- */
- public function compile();
-}
diff --git a/inc/lib/Twig/Token.php b/inc/lib/Twig/Token.php
deleted file mode 100644
index 89066869..00000000
--- a/inc/lib/Twig/Token.php
+++ /dev/null
@@ -1,207 +0,0 @@
-
- *
- * @final
- */
-class Twig_Token
-{
- protected $value;
- protected $type;
- protected $lineno;
-
- const EOF_TYPE = -1;
- const TEXT_TYPE = 0;
- const BLOCK_START_TYPE = 1;
- const VAR_START_TYPE = 2;
- const BLOCK_END_TYPE = 3;
- const VAR_END_TYPE = 4;
- const NAME_TYPE = 5;
- const NUMBER_TYPE = 6;
- const STRING_TYPE = 7;
- const OPERATOR_TYPE = 8;
- const PUNCTUATION_TYPE = 9;
- const INTERPOLATION_START_TYPE = 10;
- const INTERPOLATION_END_TYPE = 11;
-
- /**
- * @param int $type The type of the token
- * @param string $value The token value
- * @param int $lineno The line position in the source
- */
- public function __construct($type, $value, $lineno)
- {
- $this->type = $type;
- $this->value = $value;
- $this->lineno = $lineno;
- }
-
- public function __toString()
- {
- return sprintf('%s(%s)', self::typeToString($this->type, true), $this->value);
- }
-
- /**
- * Tests the current token for a type and/or a value.
- *
- * Parameters may be:
- * * just type
- * * type and value (or array of possible values)
- * * just value (or array of possible values) (NAME_TYPE is used as type)
- *
- * @param array|string|int $type The type to test
- * @param array|string|null $values The token value
- *
- * @return bool
- */
- public function test($type, $values = null)
- {
- if (null === $values && !is_int($type)) {
- $values = $type;
- $type = self::NAME_TYPE;
- }
-
- return ($this->type === $type) && (
- null === $values ||
- (is_array($values) && in_array($this->value, $values)) ||
- $this->value == $values
- );
- }
-
- /**
- * @return int
- */
- public function getLine()
- {
- return $this->lineno;
- }
-
- /**
- * @return int
- */
- public function getType()
- {
- return $this->type;
- }
-
- /**
- * @return string
- */
- public function getValue()
- {
- return $this->value;
- }
-
- /**
- * Returns the constant representation (internal) of a given type.
- *
- * @param int $type The type as an integer
- * @param bool $short Whether to return a short representation or not
- *
- * @return string The string representation
- */
- public static function typeToString($type, $short = false)
- {
- switch ($type) {
- case self::EOF_TYPE:
- $name = 'EOF_TYPE';
- break;
- case self::TEXT_TYPE:
- $name = 'TEXT_TYPE';
- break;
- case self::BLOCK_START_TYPE:
- $name = 'BLOCK_START_TYPE';
- break;
- case self::VAR_START_TYPE:
- $name = 'VAR_START_TYPE';
- break;
- case self::BLOCK_END_TYPE:
- $name = 'BLOCK_END_TYPE';
- break;
- case self::VAR_END_TYPE:
- $name = 'VAR_END_TYPE';
- break;
- case self::NAME_TYPE:
- $name = 'NAME_TYPE';
- break;
- case self::NUMBER_TYPE:
- $name = 'NUMBER_TYPE';
- break;
- case self::STRING_TYPE:
- $name = 'STRING_TYPE';
- break;
- case self::OPERATOR_TYPE:
- $name = 'OPERATOR_TYPE';
- break;
- case self::PUNCTUATION_TYPE:
- $name = 'PUNCTUATION_TYPE';
- break;
- case self::INTERPOLATION_START_TYPE:
- $name = 'INTERPOLATION_START_TYPE';
- break;
- case self::INTERPOLATION_END_TYPE:
- $name = 'INTERPOLATION_END_TYPE';
- break;
- default:
- throw new LogicException(sprintf('Token of type "%s" does not exist.', $type));
- }
-
- return $short ? $name : 'Twig_Token::'.$name;
- }
-
- /**
- * Returns the English representation of a given type.
- *
- * @param int $type The type as an integer
- *
- * @return string The string representation
- */
- public static function typeToEnglish($type)
- {
- switch ($type) {
- case self::EOF_TYPE:
- return 'end of template';
- case self::TEXT_TYPE:
- return 'text';
- case self::BLOCK_START_TYPE:
- return 'begin of statement block';
- case self::VAR_START_TYPE:
- return 'begin of print statement';
- case self::BLOCK_END_TYPE:
- return 'end of statement block';
- case self::VAR_END_TYPE:
- return 'end of print statement';
- case self::NAME_TYPE:
- return 'name';
- case self::NUMBER_TYPE:
- return 'number';
- case self::STRING_TYPE:
- return 'string';
- case self::OPERATOR_TYPE:
- return 'operator';
- case self::PUNCTUATION_TYPE:
- return 'punctuation';
- case self::INTERPOLATION_START_TYPE:
- return 'begin of string interpolation';
- case self::INTERPOLATION_END_TYPE:
- return 'end of string interpolation';
- default:
- throw new LogicException(sprintf('Token of type "%s" does not exist.', $type));
- }
- }
-}
-
-class_alias('Twig_Token', 'Twig\Token', false);
diff --git a/inc/lib/Twig/TokenParser.php b/inc/lib/Twig/TokenParser.php
deleted file mode 100644
index 1b4de14d..00000000
--- a/inc/lib/Twig/TokenParser.php
+++ /dev/null
@@ -1,33 +0,0 @@
-
- */
-abstract class Twig_TokenParser implements Twig_TokenParserInterface
-{
- /**
- * @var Twig_Parser
- */
- protected $parser;
-
- /**
- * Sets the parser associated with this token parser.
- */
- public function setParser(Twig_Parser $parser)
- {
- $this->parser = $parser;
- }
-}
-
-class_alias('Twig_TokenParser', 'Twig\TokenParser\AbstractTokenParser', false);
diff --git a/inc/lib/Twig/TokenParser/AutoEscape.php b/inc/lib/Twig/TokenParser/AutoEscape.php
deleted file mode 100644
index a20dedd1..00000000
--- a/inc/lib/Twig/TokenParser/AutoEscape.php
+++ /dev/null
@@ -1,83 +0,0 @@
-
- * {% autoescape true %}
- * Everything will be automatically escaped in this block
- * {% endautoescape %}
- *
- * {% autoescape false %}
- * Everything will be outputed as is in this block
- * {% endautoescape %}
- *
- * {% autoescape true js %}
- * Everything will be automatically escaped in this block
- * using the js escaping strategy
- * {% endautoescape %}
- *
- *
- * @final
- */
-class Twig_TokenParser_AutoEscape extends Twig_TokenParser
-{
- public function parse(Twig_Token $token)
- {
- $lineno = $token->getLine();
- $stream = $this->parser->getStream();
-
- if ($stream->test(Twig_Token::BLOCK_END_TYPE)) {
- $value = 'html';
- } else {
- $expr = $this->parser->getExpressionParser()->parseExpression();
- if (!$expr instanceof Twig_Node_Expression_Constant) {
- throw new Twig_Error_Syntax('An escaping strategy must be a string or a bool.', $stream->getCurrent()->getLine(), $stream->getSourceContext());
- }
- $value = $expr->getAttribute('value');
-
- $compat = true === $value || false === $value;
-
- if (true === $value) {
- $value = 'html';
- }
-
- if ($compat && $stream->test(Twig_Token::NAME_TYPE)) {
- @trigger_error('Using the autoescape tag with "true" or "false" before the strategy name is deprecated since version 1.21.', E_USER_DEPRECATED);
-
- if (false === $value) {
- throw new Twig_Error_Syntax('Unexpected escaping strategy as you set autoescaping to false.', $stream->getCurrent()->getLine(), $stream->getSourceContext());
- }
-
- $value = $stream->next()->getValue();
- }
- }
-
- $stream->expect(Twig_Token::BLOCK_END_TYPE);
- $body = $this->parser->subparse(array($this, 'decideBlockEnd'), true);
- $stream->expect(Twig_Token::BLOCK_END_TYPE);
-
- return new Twig_Node_AutoEscape($value, $body, $lineno, $this->getTag());
- }
-
- public function decideBlockEnd(Twig_Token $token)
- {
- return $token->test('endautoescape');
- }
-
- public function getTag()
- {
- return 'autoescape';
- }
-}
-
-class_alias('Twig_TokenParser_AutoEscape', 'Twig\TokenParser\AutoEscapeTokenParser', false);
diff --git a/inc/lib/Twig/TokenParser/Block.php b/inc/lib/Twig/TokenParser/Block.php
deleted file mode 100644
index f30f86b5..00000000
--- a/inc/lib/Twig/TokenParser/Block.php
+++ /dev/null
@@ -1,73 +0,0 @@
-
- * {% block head %}
- *
- * {% block title %}{% endblock %} - My Webpage
- * {% endblock %}
- *
- *
- * @final
- */
-class Twig_TokenParser_Block extends Twig_TokenParser
-{
- public function parse(Twig_Token $token)
- {
- $lineno = $token->getLine();
- $stream = $this->parser->getStream();
- $name = $stream->expect(Twig_Token::NAME_TYPE)->getValue();
- if ($this->parser->hasBlock($name)) {
- throw new Twig_Error_Syntax(sprintf("The block '%s' has already been defined line %d.", $name, $this->parser->getBlock($name)->getTemplateLine()), $stream->getCurrent()->getLine(), $stream->getSourceContext());
- }
- $this->parser->setBlock($name, $block = new Twig_Node_Block($name, new Twig_Node(array()), $lineno));
- $this->parser->pushLocalScope();
- $this->parser->pushBlockStack($name);
-
- if ($stream->nextIf(Twig_Token::BLOCK_END_TYPE)) {
- $body = $this->parser->subparse(array($this, 'decideBlockEnd'), true);
- if ($token = $stream->nextIf(Twig_Token::NAME_TYPE)) {
- $value = $token->getValue();
-
- if ($value != $name) {
- throw new Twig_Error_Syntax(sprintf('Expected endblock for block "%s" (but "%s" given).', $name, $value), $stream->getCurrent()->getLine(), $stream->getSourceContext());
- }
- }
- } else {
- $body = new Twig_Node(array(
- new Twig_Node_Print($this->parser->getExpressionParser()->parseExpression(), $lineno),
- ));
- }
- $stream->expect(Twig_Token::BLOCK_END_TYPE);
-
- $block->setNode('body', $body);
- $this->parser->popBlockStack();
- $this->parser->popLocalScope();
-
- return new Twig_Node_BlockReference($name, $lineno, $this->getTag());
- }
-
- public function decideBlockEnd(Twig_Token $token)
- {
- return $token->test('endblock');
- }
-
- public function getTag()
- {
- return 'block';
- }
-}
-
-class_alias('Twig_TokenParser_Block', 'Twig\TokenParser\BlockTokenParser', false);
diff --git a/inc/lib/Twig/TokenParser/Do.php b/inc/lib/Twig/TokenParser/Do.php
deleted file mode 100644
index 8ce08808..00000000
--- a/inc/lib/Twig/TokenParser/Do.php
+++ /dev/null
@@ -1,34 +0,0 @@
-parser->getExpressionParser()->parseExpression();
-
- $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
-
- return new Twig_Node_Do($expr, $token->getLine(), $this->getTag());
- }
-
- public function getTag()
- {
- return 'do';
- }
-}
-
-class_alias('Twig_TokenParser_Do', 'Twig\TokenParser\DoTokenParser', false);
diff --git a/inc/lib/Twig/TokenParser/Embed.php b/inc/lib/Twig/TokenParser/Embed.php
deleted file mode 100644
index 44644cc6..00000000
--- a/inc/lib/Twig/TokenParser/Embed.php
+++ /dev/null
@@ -1,67 +0,0 @@
-parser->getStream();
-
- $parent = $this->parser->getExpressionParser()->parseExpression();
-
- list($variables, $only, $ignoreMissing) = $this->parseArguments();
-
- $parentToken = $fakeParentToken = new Twig_Token(Twig_Token::STRING_TYPE, '__parent__', $token->getLine());
- if ($parent instanceof Twig_Node_Expression_Constant) {
- $parentToken = new Twig_Token(Twig_Token::STRING_TYPE, $parent->getAttribute('value'), $token->getLine());
- } elseif ($parent instanceof Twig_Node_Expression_Name) {
- $parentToken = new Twig_Token(Twig_Token::NAME_TYPE, $parent->getAttribute('name'), $token->getLine());
- }
-
- // inject a fake parent to make the parent() function work
- $stream->injectTokens(array(
- new Twig_Token(Twig_Token::BLOCK_START_TYPE, '', $token->getLine()),
- new Twig_Token(Twig_Token::NAME_TYPE, 'extends', $token->getLine()),
- $parentToken,
- new Twig_Token(Twig_Token::BLOCK_END_TYPE, '', $token->getLine()),
- ));
-
- $module = $this->parser->parse($stream, array($this, 'decideBlockEnd'), true);
-
- // override the parent with the correct one
- if ($fakeParentToken === $parentToken) {
- $module->setNode('parent', $parent);
- }
-
- $this->parser->embedTemplate($module);
-
- $stream->expect(Twig_Token::BLOCK_END_TYPE);
-
- return new Twig_Node_Embed($module->getTemplateName(), $module->getAttribute('index'), $variables, $only, $ignoreMissing, $token->getLine(), $this->getTag());
- }
-
- public function decideBlockEnd(Twig_Token $token)
- {
- return $token->test('endembed');
- }
-
- public function getTag()
- {
- return 'embed';
- }
-}
-
-class_alias('Twig_TokenParser_Embed', 'Twig\TokenParser\EmbedTokenParser', false);
diff --git a/inc/lib/Twig/TokenParser/Extends.php b/inc/lib/Twig/TokenParser/Extends.php
deleted file mode 100644
index 31168cce..00000000
--- a/inc/lib/Twig/TokenParser/Extends.php
+++ /dev/null
@@ -1,46 +0,0 @@
-
- * {% extends "base.html" %}
- *
- *
- * @final
- */
-class Twig_TokenParser_Extends extends Twig_TokenParser
-{
- public function parse(Twig_Token $token)
- {
- $stream = $this->parser->getStream();
-
- if (!$this->parser->isMainScope()) {
- throw new Twig_Error_Syntax('Cannot extend from a block.', $token->getLine(), $stream->getSourceContext());
- }
-
- if (null !== $this->parser->getParent()) {
- throw new Twig_Error_Syntax('Multiple extends tags are forbidden.', $token->getLine(), $stream->getSourceContext());
- }
- $this->parser->setParent($this->parser->getExpressionParser()->parseExpression());
-
- $stream->expect(Twig_Token::BLOCK_END_TYPE);
- }
-
- public function getTag()
- {
- return 'extends';
- }
-}
-
-class_alias('Twig_TokenParser_Extends', 'Twig\TokenParser\ExtendsTokenParser', false);
diff --git a/inc/lib/Twig/TokenParser/Filter.php b/inc/lib/Twig/TokenParser/Filter.php
deleted file mode 100644
index 76017829..00000000
--- a/inc/lib/Twig/TokenParser/Filter.php
+++ /dev/null
@@ -1,53 +0,0 @@
-
- * {% filter upper %}
- * This text becomes uppercase
- * {% endfilter %}
- *
- *
- * @final
- */
-class Twig_TokenParser_Filter extends Twig_TokenParser
-{
- public function parse(Twig_Token $token)
- {
- $name = $this->parser->getVarName();
- $ref = new Twig_Node_Expression_BlockReference(new Twig_Node_Expression_Constant($name, $token->getLine()), null, $token->getLine(), $this->getTag());
-
- $filter = $this->parser->getExpressionParser()->parseFilterExpressionRaw($ref, $this->getTag());
- $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
-
- $body = $this->parser->subparse(array($this, 'decideBlockEnd'), true);
- $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
-
- $block = new Twig_Node_Block($name, $body, $token->getLine());
- $this->parser->setBlock($name, $block);
-
- return new Twig_Node_Print($filter, $token->getLine(), $this->getTag());
- }
-
- public function decideBlockEnd(Twig_Token $token)
- {
- return $token->test('endfilter');
- }
-
- public function getTag()
- {
- return 'filter';
- }
-}
-
-class_alias('Twig_TokenParser_Filter', 'Twig\TokenParser\FilterTokenParser', false);
diff --git a/inc/lib/Twig/TokenParser/Flush.php b/inc/lib/Twig/TokenParser/Flush.php
deleted file mode 100644
index 51832c77..00000000
--- a/inc/lib/Twig/TokenParser/Flush.php
+++ /dev/null
@@ -1,34 +0,0 @@
-parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
-
- return new Twig_Node_Flush($token->getLine(), $this->getTag());
- }
-
- public function getTag()
- {
- return 'flush';
- }
-}
-
-class_alias('Twig_TokenParser_Flush', 'Twig\TokenParser\FlushTokenParser', false);
diff --git a/inc/lib/Twig/TokenParser/For.php b/inc/lib/Twig/TokenParser/For.php
deleted file mode 100644
index 8e737c5f..00000000
--- a/inc/lib/Twig/TokenParser/For.php
+++ /dev/null
@@ -1,127 +0,0 @@
-
- *
- * {% for user in users %}
- * {{ user.username|e }}
- * {% endfor %}
- *
- *
- *
- * @final
- */
-class Twig_TokenParser_For extends Twig_TokenParser
-{
- public function parse(Twig_Token $token)
- {
- $lineno = $token->getLine();
- $stream = $this->parser->getStream();
- $targets = $this->parser->getExpressionParser()->parseAssignmentExpression();
- $stream->expect(Twig_Token::OPERATOR_TYPE, 'in');
- $seq = $this->parser->getExpressionParser()->parseExpression();
-
- $ifexpr = null;
- if ($stream->nextIf(Twig_Token::NAME_TYPE, 'if')) {
- $ifexpr = $this->parser->getExpressionParser()->parseExpression();
- }
-
- $stream->expect(Twig_Token::BLOCK_END_TYPE);
- $body = $this->parser->subparse(array($this, 'decideForFork'));
- if ('else' == $stream->next()->getValue()) {
- $stream->expect(Twig_Token::BLOCK_END_TYPE);
- $else = $this->parser->subparse(array($this, 'decideForEnd'), true);
- } else {
- $else = null;
- }
- $stream->expect(Twig_Token::BLOCK_END_TYPE);
-
- if (count($targets) > 1) {
- $keyTarget = $targets->getNode(0);
- $keyTarget = new Twig_Node_Expression_AssignName($keyTarget->getAttribute('name'), $keyTarget->getTemplateLine());
- $valueTarget = $targets->getNode(1);
- $valueTarget = new Twig_Node_Expression_AssignName($valueTarget->getAttribute('name'), $valueTarget->getTemplateLine());
- } else {
- $keyTarget = new Twig_Node_Expression_AssignName('_key', $lineno);
- $valueTarget = $targets->getNode(0);
- $valueTarget = new Twig_Node_Expression_AssignName($valueTarget->getAttribute('name'), $valueTarget->getTemplateLine());
- }
-
- if ($ifexpr) {
- $this->checkLoopUsageCondition($stream, $ifexpr);
- $this->checkLoopUsageBody($stream, $body);
- }
-
- return new Twig_Node_For($keyTarget, $valueTarget, $seq, $ifexpr, $body, $else, $lineno, $this->getTag());
- }
-
- public function decideForFork(Twig_Token $token)
- {
- return $token->test(array('else', 'endfor'));
- }
-
- public function decideForEnd(Twig_Token $token)
- {
- return $token->test('endfor');
- }
-
- // the loop variable cannot be used in the condition
- protected function checkLoopUsageCondition(Twig_TokenStream $stream, Twig_NodeInterface $node)
- {
- if ($node instanceof Twig_Node_Expression_GetAttr && $node->getNode('node') instanceof Twig_Node_Expression_Name && 'loop' == $node->getNode('node')->getAttribute('name')) {
- throw new Twig_Error_Syntax('The "loop" variable cannot be used in a looping condition.', $node->getTemplateLine(), $stream->getSourceContext());
- }
-
- foreach ($node as $n) {
- if (!$n) {
- continue;
- }
-
- $this->checkLoopUsageCondition($stream, $n);
- }
- }
-
- // check usage of non-defined loop-items
- // it does not catch all problems (for instance when a for is included into another or when the variable is used in an include)
- protected function checkLoopUsageBody(Twig_TokenStream $stream, Twig_NodeInterface $node)
- {
- if ($node instanceof Twig_Node_Expression_GetAttr && $node->getNode('node') instanceof Twig_Node_Expression_Name && 'loop' == $node->getNode('node')->getAttribute('name')) {
- $attribute = $node->getNode('attribute');
- if ($attribute instanceof Twig_Node_Expression_Constant && in_array($attribute->getAttribute('value'), array('length', 'revindex0', 'revindex', 'last'))) {
- throw new Twig_Error_Syntax(sprintf('The "loop.%s" variable is not defined when looping with a condition.', $attribute->getAttribute('value')), $node->getTemplateLine(), $stream->getSourceContext());
- }
- }
-
- // should check for parent.loop.XXX usage
- if ($node instanceof Twig_Node_For) {
- return;
- }
-
- foreach ($node as $n) {
- if (!$n) {
- continue;
- }
-
- $this->checkLoopUsageBody($stream, $n);
- }
- }
-
- public function getTag()
- {
- return 'for';
- }
-}
-
-class_alias('Twig_TokenParser_For', 'Twig\TokenParser\ForTokenParser', false);
diff --git a/inc/lib/Twig/TokenParser/From.php b/inc/lib/Twig/TokenParser/From.php
deleted file mode 100644
index f3053da4..00000000
--- a/inc/lib/Twig/TokenParser/From.php
+++ /dev/null
@@ -1,66 +0,0 @@
-
- * {% from 'forms.html' import forms %}
- *
- *
- * @final
- */
-class Twig_TokenParser_From extends Twig_TokenParser
-{
- public function parse(Twig_Token $token)
- {
- $macro = $this->parser->getExpressionParser()->parseExpression();
- $stream = $this->parser->getStream();
- $stream->expect('import');
-
- $targets = array();
- do {
- $name = $stream->expect(Twig_Token::NAME_TYPE)->getValue();
-
- $alias = $name;
- if ($stream->nextIf('as')) {
- $alias = $stream->expect(Twig_Token::NAME_TYPE)->getValue();
- }
-
- $targets[$name] = $alias;
-
- if (!$stream->nextIf(Twig_Token::PUNCTUATION_TYPE, ',')) {
- break;
- }
- } while (true);
-
- $stream->expect(Twig_Token::BLOCK_END_TYPE);
-
- $node = new Twig_Node_Import($macro, new Twig_Node_Expression_AssignName($this->parser->getVarName(), $token->getLine()), $token->getLine(), $this->getTag());
-
- foreach ($targets as $name => $alias) {
- if ($this->parser->isReservedMacroName($name)) {
- throw new Twig_Error_Syntax(sprintf('"%s" cannot be an imported macro as it is a reserved keyword.', $name), $token->getLine(), $stream->getSourceContext());
- }
-
- $this->parser->addImportedSymbol('function', $alias, 'get'.$name, $node->getNode('var'));
- }
-
- return $node;
- }
-
- public function getTag()
- {
- return 'from';
- }
-}
-
-class_alias('Twig_TokenParser_From', 'Twig\TokenParser\FromTokenParser', false);
diff --git a/inc/lib/Twig/TokenParser/If.php b/inc/lib/Twig/TokenParser/If.php
deleted file mode 100644
index f081df3a..00000000
--- a/inc/lib/Twig/TokenParser/If.php
+++ /dev/null
@@ -1,86 +0,0 @@
-
- * {% if users %}
- *
- * {% for user in users %}
- * {{ user.username|e }}
- * {% endfor %}
- *
- * {% endif %}
- *
- *
- * @final
- */
-class Twig_TokenParser_If extends Twig_TokenParser
-{
- public function parse(Twig_Token $token)
- {
- $lineno = $token->getLine();
- $expr = $this->parser->getExpressionParser()->parseExpression();
- $stream = $this->parser->getStream();
- $stream->expect(Twig_Token::BLOCK_END_TYPE);
- $body = $this->parser->subparse(array($this, 'decideIfFork'));
- $tests = array($expr, $body);
- $else = null;
-
- $end = false;
- while (!$end) {
- switch ($stream->next()->getValue()) {
- case 'else':
- $stream->expect(Twig_Token::BLOCK_END_TYPE);
- $else = $this->parser->subparse(array($this, 'decideIfEnd'));
- break;
-
- case 'elseif':
- $expr = $this->parser->getExpressionParser()->parseExpression();
- $stream->expect(Twig_Token::BLOCK_END_TYPE);
- $body = $this->parser->subparse(array($this, 'decideIfFork'));
- $tests[] = $expr;
- $tests[] = $body;
- break;
-
- case 'endif':
- $end = true;
- break;
-
- default:
- throw new Twig_Error_Syntax(sprintf('Unexpected end of template. Twig was looking for the following tags "else", "elseif", or "endif" to close the "if" block started at line %d).', $lineno), $stream->getCurrent()->getLine(), $stream->getSourceContext());
- }
- }
-
- $stream->expect(Twig_Token::BLOCK_END_TYPE);
-
- return new Twig_Node_If(new Twig_Node($tests), $else, $lineno, $this->getTag());
- }
-
- public function decideIfFork(Twig_Token $token)
- {
- return $token->test(array('elseif', 'else', 'endif'));
- }
-
- public function decideIfEnd(Twig_Token $token)
- {
- return $token->test(array('endif'));
- }
-
- public function getTag()
- {
- return 'if';
- }
-}
-
-class_alias('Twig_TokenParser_If', 'Twig\TokenParser\IfTokenParser', false);
diff --git a/inc/lib/Twig/TokenParser/Import.php b/inc/lib/Twig/TokenParser/Import.php
deleted file mode 100644
index 47802f50..00000000
--- a/inc/lib/Twig/TokenParser/Import.php
+++ /dev/null
@@ -1,41 +0,0 @@
-
- * {% import 'forms.html' as forms %}
- *
- *
- * @final
- */
-class Twig_TokenParser_Import extends Twig_TokenParser
-{
- public function parse(Twig_Token $token)
- {
- $macro = $this->parser->getExpressionParser()->parseExpression();
- $this->parser->getStream()->expect('as');
- $var = new Twig_Node_Expression_AssignName($this->parser->getStream()->expect(Twig_Token::NAME_TYPE)->getValue(), $token->getLine());
- $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
-
- $this->parser->addImportedSymbol('template', $var->getAttribute('name'));
-
- return new Twig_Node_Import($macro, $var, $token->getLine(), $this->getTag());
- }
-
- public function getTag()
- {
- return 'import';
- }
-}
-
-class_alias('Twig_TokenParser_Import', 'Twig\TokenParser\ImportTokenParser', false);
diff --git a/inc/lib/Twig/TokenParser/Include.php b/inc/lib/Twig/TokenParser/Include.php
deleted file mode 100644
index 309f11db..00000000
--- a/inc/lib/Twig/TokenParser/Include.php
+++ /dev/null
@@ -1,65 +0,0 @@
-
- * {% include 'header.html' %}
- * Body
- * {% include 'footer.html' %}
- *
- */
-class Twig_TokenParser_Include extends Twig_TokenParser
-{
- public function parse(Twig_Token $token)
- {
- $expr = $this->parser->getExpressionParser()->parseExpression();
-
- list($variables, $only, $ignoreMissing) = $this->parseArguments();
-
- return new Twig_Node_Include($expr, $variables, $only, $ignoreMissing, $token->getLine(), $this->getTag());
- }
-
- protected function parseArguments()
- {
- $stream = $this->parser->getStream();
-
- $ignoreMissing = false;
- if ($stream->nextIf(Twig_Token::NAME_TYPE, 'ignore')) {
- $stream->expect(Twig_Token::NAME_TYPE, 'missing');
-
- $ignoreMissing = true;
- }
-
- $variables = null;
- if ($stream->nextIf(Twig_Token::NAME_TYPE, 'with')) {
- $variables = $this->parser->getExpressionParser()->parseExpression();
- }
-
- $only = false;
- if ($stream->nextIf(Twig_Token::NAME_TYPE, 'only')) {
- $only = true;
- }
-
- $stream->expect(Twig_Token::BLOCK_END_TYPE);
-
- return array($variables, $only, $ignoreMissing);
- }
-
- public function getTag()
- {
- return 'include';
- }
-}
-
-class_alias('Twig_TokenParser_Include', 'Twig\TokenParser\IncludeTokenParser', false);
diff --git a/inc/lib/Twig/TokenParser/Macro.php b/inc/lib/Twig/TokenParser/Macro.php
deleted file mode 100644
index 4287934b..00000000
--- a/inc/lib/Twig/TokenParser/Macro.php
+++ /dev/null
@@ -1,60 +0,0 @@
-
- * {% macro input(name, value, type, size) %}
- *
- * {% endmacro %}
- *
- *
- * @final
- */
-class Twig_TokenParser_Macro extends Twig_TokenParser
-{
- public function parse(Twig_Token $token)
- {
- $lineno = $token->getLine();
- $stream = $this->parser->getStream();
- $name = $stream->expect(Twig_Token::NAME_TYPE)->getValue();
-
- $arguments = $this->parser->getExpressionParser()->parseArguments(true, true);
-
- $stream->expect(Twig_Token::BLOCK_END_TYPE);
- $this->parser->pushLocalScope();
- $body = $this->parser->subparse(array($this, 'decideBlockEnd'), true);
- if ($token = $stream->nextIf(Twig_Token::NAME_TYPE)) {
- $value = $token->getValue();
-
- if ($value != $name) {
- throw new Twig_Error_Syntax(sprintf('Expected endmacro for macro "%s" (but "%s" given).', $name, $value), $stream->getCurrent()->getLine(), $stream->getSourceContext());
- }
- }
- $this->parser->popLocalScope();
- $stream->expect(Twig_Token::BLOCK_END_TYPE);
-
- $this->parser->setMacro($name, new Twig_Node_Macro($name, new Twig_Node_Body(array($body)), $arguments, $lineno, $this->getTag()));
- }
-
- public function decideBlockEnd(Twig_Token $token)
- {
- return $token->test('endmacro');
- }
-
- public function getTag()
- {
- return 'macro';
- }
-}
-
-class_alias('Twig_TokenParser_Macro', 'Twig\TokenParser\MacroTokenParser', false);
diff --git a/inc/lib/Twig/TokenParser/Sandbox.php b/inc/lib/Twig/TokenParser/Sandbox.php
deleted file mode 100644
index 7fc70d9a..00000000
--- a/inc/lib/Twig/TokenParser/Sandbox.php
+++ /dev/null
@@ -1,61 +0,0 @@
-
- * {% sandbox %}
- * {% include 'user.html' %}
- * {% endsandbox %}
- *
- *
- * @see https://twig.symfony.com/doc/api.html#sandbox-extension for details
- *
- * @final
- */
-class Twig_TokenParser_Sandbox extends Twig_TokenParser
-{
- public function parse(Twig_Token $token)
- {
- $stream = $this->parser->getStream();
- $stream->expect(Twig_Token::BLOCK_END_TYPE);
- $body = $this->parser->subparse(array($this, 'decideBlockEnd'), true);
- $stream->expect(Twig_Token::BLOCK_END_TYPE);
-
- // in a sandbox tag, only include tags are allowed
- if (!$body instanceof Twig_Node_Include) {
- foreach ($body as $node) {
- if ($node instanceof Twig_Node_Text && ctype_space($node->getAttribute('data'))) {
- continue;
- }
-
- if (!$node instanceof Twig_Node_Include) {
- throw new Twig_Error_Syntax('Only "include" tags are allowed within a "sandbox" section.', $node->getTemplateLine(), $stream->getSourceContext());
- }
- }
- }
-
- return new Twig_Node_Sandbox($body, $token->getLine(), $this->getTag());
- }
-
- public function decideBlockEnd(Twig_Token $token)
- {
- return $token->test('endsandbox');
- }
-
- public function getTag()
- {
- return 'sandbox';
- }
-}
-
-class_alias('Twig_TokenParser_Sandbox', 'Twig\TokenParser\SandboxTokenParser', false);
diff --git a/inc/lib/Twig/TokenParser/Set.php b/inc/lib/Twig/TokenParser/Set.php
deleted file mode 100644
index 48c6b3ae..00000000
--- a/inc/lib/Twig/TokenParser/Set.php
+++ /dev/null
@@ -1,75 +0,0 @@
-
- * {% set foo = 'foo' %}
- *
- * {% set foo = [1, 2] %}
- *
- * {% set foo = {'foo': 'bar'} %}
- *
- * {% set foo = 'foo' ~ 'bar' %}
- *
- * {% set foo, bar = 'foo', 'bar' %}
- *
- * {% set foo %}Some content{% endset %}
- *
- *
- * @final
- */
-class Twig_TokenParser_Set extends Twig_TokenParser
-{
- public function parse(Twig_Token $token)
- {
- $lineno = $token->getLine();
- $stream = $this->parser->getStream();
- $names = $this->parser->getExpressionParser()->parseAssignmentExpression();
-
- $capture = false;
- if ($stream->nextIf(Twig_Token::OPERATOR_TYPE, '=')) {
- $values = $this->parser->getExpressionParser()->parseMultitargetExpression();
-
- $stream->expect(Twig_Token::BLOCK_END_TYPE);
-
- if (count($names) !== count($values)) {
- throw new Twig_Error_Syntax('When using set, you must have the same number of variables and assignments.', $stream->getCurrent()->getLine(), $stream->getSourceContext());
- }
- } else {
- $capture = true;
-
- if (count($names) > 1) {
- throw new Twig_Error_Syntax('When using set with a block, you cannot have a multi-target.', $stream->getCurrent()->getLine(), $stream->getSourceContext());
- }
-
- $stream->expect(Twig_Token::BLOCK_END_TYPE);
-
- $values = $this->parser->subparse(array($this, 'decideBlockEnd'), true);
- $stream->expect(Twig_Token::BLOCK_END_TYPE);
- }
-
- return new Twig_Node_Set($capture, $names, $values, $lineno, $this->getTag());
- }
-
- public function decideBlockEnd(Twig_Token $token)
- {
- return $token->test('endset');
- }
-
- public function getTag()
- {
- return 'set';
- }
-}
-
-class_alias('Twig_TokenParser_Set', 'Twig\TokenParser\SetTokenParser', false);
diff --git a/inc/lib/Twig/TokenParser/Spaceless.php b/inc/lib/Twig/TokenParser/Spaceless.php
deleted file mode 100644
index cecf27c6..00000000
--- a/inc/lib/Twig/TokenParser/Spaceless.php
+++ /dev/null
@@ -1,51 +0,0 @@
-
- * {% spaceless %}
- *
- * foo
- *
- * {% endspaceless %}
- *
- * {# output will be foo
#}
- *
- *
- * @final
- */
-class Twig_TokenParser_Spaceless extends Twig_TokenParser
-{
- public function parse(Twig_Token $token)
- {
- $lineno = $token->getLine();
-
- $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
- $body = $this->parser->subparse(array($this, 'decideSpacelessEnd'), true);
- $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
-
- return new Twig_Node_Spaceless($body, $lineno, $this->getTag());
- }
-
- public function decideSpacelessEnd(Twig_Token $token)
- {
- return $token->test('endspaceless');
- }
-
- public function getTag()
- {
- return 'spaceless';
- }
-}
-
-class_alias('Twig_TokenParser_Spaceless', 'Twig\TokenParser\SpacelessTokenParser', false);
diff --git a/inc/lib/Twig/TokenParser/Use.php b/inc/lib/Twig/TokenParser/Use.php
deleted file mode 100644
index 1ab24e2c..00000000
--- a/inc/lib/Twig/TokenParser/Use.php
+++ /dev/null
@@ -1,70 +0,0 @@
-
- * {% extends "base.html" %}
- *
- * {% use "blocks.html" %}
- *
- * {% block title %}{% endblock %}
- * {% block content %}{% endblock %}
- *
- *
- * @see https://twig.symfony.com/doc/templates.html#horizontal-reuse for details.
- *
- * @final
- */
-class Twig_TokenParser_Use extends Twig_TokenParser
-{
- public function parse(Twig_Token $token)
- {
- $template = $this->parser->getExpressionParser()->parseExpression();
- $stream = $this->parser->getStream();
-
- if (!$template instanceof Twig_Node_Expression_Constant) {
- throw new Twig_Error_Syntax('The template references in a "use" statement must be a string.', $stream->getCurrent()->getLine(), $stream->getSourceContext());
- }
-
- $targets = array();
- if ($stream->nextIf('with')) {
- do {
- $name = $stream->expect(Twig_Token::NAME_TYPE)->getValue();
-
- $alias = $name;
- if ($stream->nextIf('as')) {
- $alias = $stream->expect(Twig_Token::NAME_TYPE)->getValue();
- }
-
- $targets[$name] = new Twig_Node_Expression_Constant($alias, -1);
-
- if (!$stream->nextIf(Twig_Token::PUNCTUATION_TYPE, ',')) {
- break;
- }
- } while (true);
- }
-
- $stream->expect(Twig_Token::BLOCK_END_TYPE);
-
- $this->parser->addTrait(new Twig_Node(array('template' => $template, 'targets' => new Twig_Node($targets))));
-
- return new Twig_Node();
- }
-
- public function getTag()
- {
- return 'use';
- }
-}
-
-class_alias('Twig_TokenParser_Use', 'Twig\TokenParser\UseTokenParser', false);
diff --git a/inc/lib/Twig/TokenParser/With.php b/inc/lib/Twig/TokenParser/With.php
deleted file mode 100644
index 7a692597..00000000
--- a/inc/lib/Twig/TokenParser/With.php
+++ /dev/null
@@ -1,52 +0,0 @@
-
- *
- * @final
- */
-class Twig_TokenParser_With extends Twig_TokenParser
-{
- public function parse(Twig_Token $token)
- {
- $stream = $this->parser->getStream();
-
- $variables = null;
- $only = false;
- if (!$stream->test(Twig_Token::BLOCK_END_TYPE)) {
- $variables = $this->parser->getExpressionParser()->parseExpression();
- $only = $stream->nextIf(Twig_Token::NAME_TYPE, 'only');
- }
-
- $stream->expect(Twig_Token::BLOCK_END_TYPE);
-
- $body = $this->parser->subparse(array($this, 'decideWithEnd'), true);
-
- $stream->expect(Twig_Token::BLOCK_END_TYPE);
-
- return new Twig_Node_With($body, $variables, $only, $token->getLine(), $this->getTag());
- }
-
- public function decideWithEnd(Twig_Token $token)
- {
- return $token->test('endwith');
- }
-
- public function getTag()
- {
- return 'with';
- }
-}
-
-class_alias('Twig_TokenParser_With', 'Twig\TokenParser\WithTokenParser', false);
diff --git a/inc/lib/Twig/TokenParserBroker.php b/inc/lib/Twig/TokenParserBroker.php
deleted file mode 100644
index 0d7d6e52..00000000
--- a/inc/lib/Twig/TokenParserBroker.php
+++ /dev/null
@@ -1,120 +0,0 @@
-
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-class Twig_TokenParserBroker implements Twig_TokenParserBrokerInterface
-{
- protected $parser;
- protected $parsers = array();
- protected $brokers = array();
-
- /**
- * @param array|Traversable $parsers A Traversable of Twig_TokenParserInterface instances
- * @param array|Traversable $brokers A Traversable of Twig_TokenParserBrokerInterface instances
- * @param bool $triggerDeprecationError
- */
- public function __construct($parsers = array(), $brokers = array(), $triggerDeprecationError = true)
- {
- if ($triggerDeprecationError) {
- @trigger_error('The '.__CLASS__.' class is deprecated since version 1.12 and will be removed in 2.0.', E_USER_DEPRECATED);
- }
-
- foreach ($parsers as $parser) {
- if (!$parser instanceof Twig_TokenParserInterface) {
- throw new LogicException('$parsers must a an array of Twig_TokenParserInterface.');
- }
- $this->parsers[$parser->getTag()] = $parser;
- }
- foreach ($brokers as $broker) {
- if (!$broker instanceof Twig_TokenParserBrokerInterface) {
- throw new LogicException('$brokers must a an array of Twig_TokenParserBrokerInterface.');
- }
- $this->brokers[] = $broker;
- }
- }
-
- public function addTokenParser(Twig_TokenParserInterface $parser)
- {
- $this->parsers[$parser->getTag()] = $parser;
- }
-
- public function removeTokenParser(Twig_TokenParserInterface $parser)
- {
- $name = $parser->getTag();
- if (isset($this->parsers[$name]) && $parser === $this->parsers[$name]) {
- unset($this->parsers[$name]);
- }
- }
-
- public function addTokenParserBroker(self $broker)
- {
- $this->brokers[] = $broker;
- }
-
- public function removeTokenParserBroker(self $broker)
- {
- if (false !== $pos = array_search($broker, $this->brokers)) {
- unset($this->brokers[$pos]);
- }
- }
-
- /**
- * Gets a suitable TokenParser for a tag.
- *
- * First looks in parsers, then in brokers.
- *
- * @param string $tag A tag name
- *
- * @return null|Twig_TokenParserInterface A Twig_TokenParserInterface or null if no suitable TokenParser was found
- */
- public function getTokenParser($tag)
- {
- if (isset($this->parsers[$tag])) {
- return $this->parsers[$tag];
- }
- $broker = end($this->brokers);
- while (false !== $broker) {
- $parser = $broker->getTokenParser($tag);
- if (null !== $parser) {
- return $parser;
- }
- $broker = prev($this->brokers);
- }
- }
-
- public function getParsers()
- {
- return $this->parsers;
- }
-
- public function getParser()
- {
- return $this->parser;
- }
-
- public function setParser(Twig_ParserInterface $parser)
- {
- $this->parser = $parser;
- foreach ($this->parsers as $tokenParser) {
- $tokenParser->setParser($parser);
- }
- foreach ($this->brokers as $broker) {
- $broker->setParser($parser);
- }
- }
-}
diff --git a/inc/lib/Twig/TokenParserBrokerInterface.php b/inc/lib/Twig/TokenParserBrokerInterface.php
deleted file mode 100644
index 6c93f5ea..00000000
--- a/inc/lib/Twig/TokenParserBrokerInterface.php
+++ /dev/null
@@ -1,44 +0,0 @@
-
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-interface Twig_TokenParserBrokerInterface
-{
- /**
- * Gets a TokenParser suitable for a tag.
- *
- * @param string $tag A tag name
- *
- * @return Twig_TokenParserInterface|null A Twig_TokenParserInterface or null if no suitable TokenParser was found
- */
- public function getTokenParser($tag);
-
- /**
- * Calls Twig_TokenParserInterface::setParser on all parsers the implementation knows of.
- */
- public function setParser(Twig_ParserInterface $parser);
-
- /**
- * Gets the Twig_ParserInterface.
- *
- * @return null|Twig_ParserInterface A Twig_ParserInterface instance or null
- */
- public function getParser();
-}
diff --git a/inc/lib/Twig/TokenParserInterface.php b/inc/lib/Twig/TokenParserInterface.php
deleted file mode 100644
index 14acc808..00000000
--- a/inc/lib/Twig/TokenParserInterface.php
+++ /dev/null
@@ -1,43 +0,0 @@
-
- */
-interface Twig_TokenParserInterface
-{
- /**
- * Sets the parser associated with this token parser.
- */
- public function setParser(Twig_Parser $parser);
-
- /**
- * Parses a token and returns a node.
- *
- * @return Twig_NodeInterface
- *
- * @throws Twig_Error_Syntax
- */
- public function parse(Twig_Token $token);
-
- /**
- * Gets the tag name associated with this token parser.
- *
- * @return string The tag name
- */
- public function getTag();
-}
-
-class_alias('Twig_TokenParserInterface', 'Twig\TokenParser\TokenParserInterface', false);
-class_exists('Twig_Parser');
-class_exists('Twig_Token');
diff --git a/inc/lib/Twig/TokenStream.php b/inc/lib/Twig/TokenStream.php
deleted file mode 100644
index 81c043ca..00000000
--- a/inc/lib/Twig/TokenStream.php
+++ /dev/null
@@ -1,196 +0,0 @@
-
- */
-class Twig_TokenStream
-{
- protected $tokens;
- protected $current = 0;
- protected $filename;
-
- private $source;
-
- /**
- * @param array $tokens An array of tokens
- * @param string|null $name The name of the template which tokens are associated with
- * @param string|null $source The source code associated with the tokens
- */
- public function __construct(array $tokens, $name = null, $source = null)
- {
- if (!$name instanceof Twig_Source) {
- if (null !== $name || null !== $source) {
- @trigger_error(sprintf('Passing a string as the $name argument of %s() is deprecated since version 1.27. Pass a Twig_Source instance instead.', __METHOD__), E_USER_DEPRECATED);
- }
- $this->source = new Twig_Source($source, $name);
- } else {
- $this->source = $name;
- }
-
- $this->tokens = $tokens;
-
- // deprecated, not used anymore, to be removed in 2.0
- $this->filename = $this->source->getName();
- }
-
- public function __toString()
- {
- return implode("\n", $this->tokens);
- }
-
- public function injectTokens(array $tokens)
- {
- $this->tokens = array_merge(array_slice($this->tokens, 0, $this->current), $tokens, array_slice($this->tokens, $this->current));
- }
-
- /**
- * Sets the pointer to the next token and returns the old one.
- *
- * @return Twig_Token
- */
- public function next()
- {
- if (!isset($this->tokens[++$this->current])) {
- throw new Twig_Error_Syntax('Unexpected end of template.', $this->tokens[$this->current - 1]->getLine(), $this->source);
- }
-
- return $this->tokens[$this->current - 1];
- }
-
- /**
- * Tests a token, sets the pointer to the next one and returns it or throws a syntax error.
- *
- * @return Twig_Token|null The next token if the condition is true, null otherwise
- */
- public function nextIf($primary, $secondary = null)
- {
- if ($this->tokens[$this->current]->test($primary, $secondary)) {
- return $this->next();
- }
- }
-
- /**
- * Tests a token and returns it or throws a syntax error.
- *
- * @return Twig_Token
- */
- public function expect($type, $value = null, $message = null)
- {
- $token = $this->tokens[$this->current];
- if (!$token->test($type, $value)) {
- $line = $token->getLine();
- throw new Twig_Error_Syntax(sprintf('%sUnexpected token "%s" of value "%s" ("%s" expected%s).',
- $message ? $message.'. ' : '',
- Twig_Token::typeToEnglish($token->getType()), $token->getValue(),
- Twig_Token::typeToEnglish($type), $value ? sprintf(' with value "%s"', $value) : ''),
- $line,
- $this->source
- );
- }
- $this->next();
-
- return $token;
- }
-
- /**
- * Looks at the next token.
- *
- * @param int $number
- *
- * @return Twig_Token
- */
- public function look($number = 1)
- {
- if (!isset($this->tokens[$this->current + $number])) {
- throw new Twig_Error_Syntax('Unexpected end of template.', $this->tokens[$this->current + $number - 1]->getLine(), $this->source);
- }
-
- return $this->tokens[$this->current + $number];
- }
-
- /**
- * Tests the current token.
- *
- * @return bool
- */
- public function test($primary, $secondary = null)
- {
- return $this->tokens[$this->current]->test($primary, $secondary);
- }
-
- /**
- * Checks if end of stream was reached.
- *
- * @return bool
- */
- public function isEOF()
- {
- return Twig_Token::EOF_TYPE === $this->tokens[$this->current]->getType();
- }
-
- /**
- * @return Twig_Token
- */
- public function getCurrent()
- {
- return $this->tokens[$this->current];
- }
-
- /**
- * Gets the name associated with this stream (null if not defined).
- *
- * @return string|null
- *
- * @deprecated since 1.27 (to be removed in 2.0)
- */
- public function getFilename()
- {
- @trigger_error(sprintf('The %s() method is deprecated since version 1.27 and will be removed in 2.0. Use getSourceContext() instead.', __METHOD__), E_USER_DEPRECATED);
-
- return $this->source->getName();
- }
-
- /**
- * Gets the source code associated with this stream.
- *
- * @return string
- *
- * @internal Don't use this as it might be empty depending on the environment configuration
- *
- * @deprecated since 1.27 (to be removed in 2.0)
- */
- public function getSource()
- {
- @trigger_error(sprintf('The %s() method is deprecated since version 1.27 and will be removed in 2.0. Use getSourceContext() instead.', __METHOD__), E_USER_DEPRECATED);
-
- return $this->source->getCode();
- }
-
- /**
- * Gets the source associated with this stream.
- *
- * @return Twig_Source
- *
- * @internal
- */
- public function getSourceContext()
- {
- return $this->source;
- }
-}
-
-class_alias('Twig_TokenStream', 'Twig\TokenStream', false);
diff --git a/inc/lib/Twig/Util/DeprecationCollector.php b/inc/lib/Twig/Util/DeprecationCollector.php
deleted file mode 100644
index c7bf53be..00000000
--- a/inc/lib/Twig/Util/DeprecationCollector.php
+++ /dev/null
@@ -1,86 +0,0 @@
-
- *
- * @final
- */
-class Twig_Util_DeprecationCollector
-{
- private $twig;
- private $deprecations;
-
- public function __construct(Twig_Environment $twig)
- {
- $this->twig = $twig;
- }
-
- /**
- * Returns deprecations for templates contained in a directory.
- *
- * @param string $dir A directory where templates are stored
- * @param string $ext Limit the loaded templates by extension
- *
- * @return array An array of deprecations
- */
- public function collectDir($dir, $ext = '.twig')
- {
- $iterator = new RegexIterator(
- new RecursiveIteratorIterator(
- new RecursiveDirectoryIterator($dir), RecursiveIteratorIterator::LEAVES_ONLY
- ), '{'.preg_quote($ext).'$}'
- );
-
- return $this->collect(new Twig_Util_TemplateDirIterator($iterator));
- }
-
- /**
- * Returns deprecations for passed templates.
- *
- * @param Traversable $iterator An iterator of templates (where keys are template names and values the contents of the template)
- *
- * @return array An array of deprecations
- */
- public function collect(Traversable $iterator)
- {
- $this->deprecations = array();
-
- set_error_handler(array($this, 'errorHandler'));
-
- foreach ($iterator as $name => $contents) {
- try {
- $this->twig->parse($this->twig->tokenize(new Twig_Source($contents, $name)));
- } catch (Twig_Error_Syntax $e) {
- // ignore templates containing syntax errors
- }
- }
-
- restore_error_handler();
-
- $deprecations = $this->deprecations;
- $this->deprecations = array();
-
- return $deprecations;
- }
-
- /**
- * @internal
- */
- public function errorHandler($type, $msg)
- {
- if (E_USER_DEPRECATED === $type) {
- $this->deprecations[] = $msg;
- }
- }
-}
-
-class_alias('Twig_Util_DeprecationCollector', 'Twig\Util\DeprecationCollector', false);
diff --git a/inc/lib/Twig/Util/TemplateDirIterator.php b/inc/lib/Twig/Util/TemplateDirIterator.php
deleted file mode 100644
index c8682335..00000000
--- a/inc/lib/Twig/Util/TemplateDirIterator.php
+++ /dev/null
@@ -1,28 +0,0 @@
-
- */
-class Twig_Util_TemplateDirIterator extends IteratorIterator
-{
- public function current()
- {
- return file_get_contents(parent::current());
- }
-
- public function key()
- {
- return (string) parent::key();
- }
-}
-
-class_alias('Twig_Util_TemplateDirIterator', 'Twig\Util\TemplateDirIterator', false);
diff --git a/inc/lib/gettext/gettext.php b/inc/lib/gettext/gettext.php
old mode 100755
new mode 100644
diff --git a/inc/lib/minify/FirePHP.php b/inc/lib/minify/FirePHP.php
old mode 100755
new mode 100644
diff --git a/inc/lib/minify/HTTP/ConditionalGet.php b/inc/lib/minify/HTTP/ConditionalGet.php
old mode 100755
new mode 100644
diff --git a/inc/lib/minify/HTTP/Encoder.php b/inc/lib/minify/HTTP/Encoder.php
old mode 100755
new mode 100644
diff --git a/inc/lib/minify/JSMin.php b/inc/lib/minify/JSMin.php
deleted file mode 100755
index 9840d8b3..00000000
--- a/inc/lib/minify/JSMin.php
+++ /dev/null
@@ -1,449 +0,0 @@
-
- * $minifiedJs = JSMin::minify($js);
- *
- *
- * This is a modified port of jsmin.c. Improvements:
- *
- * Does not choke on some regexp literals containing quote characters. E.g. /'/
- *
- * Spaces are preserved after some add/sub operators, so they are not mistakenly
- * converted to post-inc/dec. E.g. a + ++b -> a+ ++b
- *
- * Preserves multi-line comments that begin with /*!
- *
- * PHP 5 or higher is required.
- *
- * Permission is hereby granted to use this version of the library under the
- * same terms as jsmin.c, which has the following license:
- *
- * --
- * Copyright (c) 2002 Douglas Crockford (www.crockford.com)
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy of
- * this software and associated documentation files (the "Software"), to deal in
- * the Software without restriction, including without limitation the rights to
- * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
- * of the Software, and to permit persons to whom the Software is furnished to do
- * so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in all
- * copies or substantial portions of the Software.
- *
- * The Software shall be used for Good, not Evil.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- * --
- *
- * @package JSMin
- * @author Ryan Grove (PHP port)
- * @author Steve Clay (modifications + cleanup)
- * @author Andrea Giammarchi (spaceBeforeRegExp)
- * @copyright 2002 Douglas Crockford (jsmin.c)
- * @copyright 2008 Ryan Grove (PHP port)
- * @license http://opensource.org/licenses/mit-license.php MIT License
- * @link http://code.google.com/p/jsmin-php/
- */
-
-class JSMin {
- const ORD_LF = 10;
- const ORD_SPACE = 32;
- const ACTION_KEEP_A = 1;
- const ACTION_DELETE_A = 2;
- const ACTION_DELETE_A_B = 3;
-
- protected $a = "\n";
- protected $b = '';
- protected $input = '';
- protected $inputIndex = 0;
- protected $inputLength = 0;
- protected $lookAhead = null;
- protected $output = '';
- protected $lastByteOut = '';
- protected $keptComment = '';
-
- /**
- * Minify Javascript.
- *
- * @param string $js Javascript to be minified
- *
- * @return string
- */
- public static function minify($js)
- {
- $jsmin = new JSMin($js);
- return $jsmin->min();
- }
-
- /**
- * @param string $input
- */
- public function __construct($input)
- {
- $this->input = $input;
- }
-
- /**
- * Perform minification, return result
- *
- * @return string
- */
- public function min()
- {
- if ($this->output !== '') { // min already run
- return $this->output;
- }
-
- $mbIntEnc = null;
- if (function_exists('mb_strlen') && ((int)ini_get('mbstring.func_overload') & 2)) {
- $mbIntEnc = mb_internal_encoding();
- mb_internal_encoding('8bit');
- }
- $this->input = str_replace("\r\n", "\n", $this->input);
- $this->inputLength = strlen($this->input);
-
- $this->action(self::ACTION_DELETE_A_B);
-
- while ($this->a !== null) {
- // determine next command
- $command = self::ACTION_KEEP_A; // default
- if ($this->a === ' ') {
- if (($this->lastByteOut === '+' || $this->lastByteOut === '-')
- && ($this->b === $this->lastByteOut)) {
- // Don't delete this space. If we do, the addition/subtraction
- // could be parsed as a post-increment
- } elseif (! $this->isAlphaNum($this->b)) {
- $command = self::ACTION_DELETE_A;
- }
- } elseif ($this->a === "\n") {
- if ($this->b === ' ') {
- $command = self::ACTION_DELETE_A_B;
-
- // in case of mbstring.func_overload & 2, must check for null b,
- // otherwise mb_strpos will give WARNING
- } elseif ($this->b === null
- || (false === strpos('{[(+-!~', $this->b)
- && ! $this->isAlphaNum($this->b))) {
- $command = self::ACTION_DELETE_A;
- }
- } elseif (! $this->isAlphaNum($this->a)) {
- if ($this->b === ' '
- || ($this->b === "\n"
- && (false === strpos('}])+-"\'', $this->a)))) {
- $command = self::ACTION_DELETE_A_B;
- }
- }
- $this->action($command);
- }
- $this->output = trim($this->output);
-
- if ($mbIntEnc !== null) {
- mb_internal_encoding($mbIntEnc);
- }
- return $this->output;
- }
-
- /**
- * ACTION_KEEP_A = Output A. Copy B to A. Get the next B.
- * ACTION_DELETE_A = Copy B to A. Get the next B.
- * ACTION_DELETE_A_B = Get the next B.
- *
- * @param int $command
- * @throws JSMin_UnterminatedRegExpException|JSMin_UnterminatedStringException
- */
- protected function action($command)
- {
- // make sure we don't compress "a + ++b" to "a+++b", etc.
- if ($command === self::ACTION_DELETE_A_B
- && $this->b === ' '
- && ($this->a === '+' || $this->a === '-')) {
- // Note: we're at an addition/substraction operator; the inputIndex
- // will certainly be a valid index
- if ($this->input[$this->inputIndex] === $this->a) {
- // This is "+ +" or "- -". Don't delete the space.
- $command = self::ACTION_KEEP_A;
- }
- }
-
- switch ($command) {
- case self::ACTION_KEEP_A: // 1
- $this->output .= $this->a;
-
- if ($this->keptComment) {
- $this->output = rtrim($this->output, "\n");
- $this->output .= $this->keptComment;
- $this->keptComment = '';
- }
-
- $this->lastByteOut = $this->a;
-
- // fallthrough intentional
- case self::ACTION_DELETE_A: // 2
- $this->a = $this->b;
- if ($this->a === "'" || $this->a === '"') { // string literal
- $str = $this->a; // in case needed for exception
- for(;;) {
- $this->output .= $this->a;
- $this->lastByteOut = $this->a;
-
- $this->a = $this->get();
- if ($this->a === $this->b) { // end quote
- break;
- }
- if ($this->isEOF($this->a)) {
- $byte = $this->inputIndex - 1;
- throw new JSMin_UnterminatedStringException(
- "JSMin: Unterminated String at byte {$byte}: {$str}");
- }
- $str .= $this->a;
- if ($this->a === '\\') {
- $this->output .= $this->a;
- $this->lastByteOut = $this->a;
-
- $this->a = $this->get();
- $str .= $this->a;
- }
- }
- }
-
- // fallthrough intentional
- case self::ACTION_DELETE_A_B: // 3
- $this->b = $this->next();
- if ($this->b === '/' && $this->isRegexpLiteral()) {
- $this->output .= $this->a . $this->b;
- $pattern = '/'; // keep entire pattern in case we need to report it in the exception
- for(;;) {
- $this->a = $this->get();
- $pattern .= $this->a;
- if ($this->a === '[') {
- for(;;) {
- $this->output .= $this->a;
- $this->a = $this->get();
- $pattern .= $this->a;
- if ($this->a === ']') {
- break;
- }
- if ($this->a === '\\') {
- $this->output .= $this->a;
- $this->a = $this->get();
- $pattern .= $this->a;
- }
- if ($this->isEOF($this->a)) {
- throw new JSMin_UnterminatedRegExpException(
- "JSMin: Unterminated set in RegExp at byte "
- . $this->inputIndex .": {$pattern}");
- }
- }
- }
-
- if ($this->a === '/') { // end pattern
- break; // while (true)
- } elseif ($this->a === '\\') {
- $this->output .= $this->a;
- $this->a = $this->get();
- $pattern .= $this->a;
- } elseif ($this->isEOF($this->a)) {
- $byte = $this->inputIndex - 1;
- throw new JSMin_UnterminatedRegExpException(
- "JSMin: Unterminated RegExp at byte {$byte}: {$pattern}");
- }
- $this->output .= $this->a;
- $this->lastByteOut = $this->a;
- }
- $this->b = $this->next();
- }
- // end case ACTION_DELETE_A_B
- }
- }
-
- /**
- * @return bool
- */
- protected function isRegexpLiteral()
- {
- if (false !== strpos("(,=:[!&|?+-~*{;", $this->a)) {
- // we obviously aren't dividing
- return true;
- }
-
- // we have to check for a preceding keyword, and we don't need to pattern
- // match over the whole output.
- $recentOutput = substr($this->output, -10);
-
- // check if return/typeof directly precede a pattern without a space
- foreach (array('return', 'typeof') as $keyword) {
- if ($this->a !== substr($keyword, -1)) {
- // certainly wasn't keyword
- continue;
- }
- if (preg_match("~(^|[\\s\\S])" . substr($keyword, 0, -1) . "$~", $recentOutput, $m)) {
- if ($m[1] === '' || !$this->isAlphaNum($m[1])) {
- return true;
- }
- }
- }
-
- // check all keywords
- if ($this->a === ' ' || $this->a === "\n") {
- if (preg_match('~(^|[\\s\\S])(?:case|else|in|return|typeof)$~', $recentOutput, $m)) {
- if ($m[1] === '' || !$this->isAlphaNum($m[1])) {
- return true;
- }
- }
- }
-
- return false;
- }
-
- /**
- * Return the next character from stdin. Watch out for lookahead. If the character is a control character,
- * translate it to a space or linefeed.
- *
- * @return string
- */
- protected function get()
- {
- $c = $this->lookAhead;
- $this->lookAhead = null;
- if ($c === null) {
- // getc(stdin)
- if ($this->inputIndex < $this->inputLength) {
- $c = $this->input[$this->inputIndex];
- $this->inputIndex += 1;
- } else {
- $c = null;
- }
- }
- if (ord($c) >= self::ORD_SPACE || $c === "\n" || $c === null) {
- return $c;
- }
- if ($c === "\r") {
- return "\n";
- }
- return ' ';
- }
-
- /**
- * Does $a indicate end of input?
- *
- * @param string $a
- * @return bool
- */
- protected function isEOF($a)
- {
- return ord($a) <= self::ORD_LF;
- }
-
- /**
- * Get next char (without getting it). If is ctrl character, translate to a space or newline.
- *
- * @return string
- */
- protected function peek()
- {
- $this->lookAhead = $this->get();
- return $this->lookAhead;
- }
-
- /**
- * Return true if the character is a letter, digit, underscore, dollar sign, or non-ASCII character.
- *
- * @param string $c
- *
- * @return bool
- */
- protected function isAlphaNum($c)
- {
- return (preg_match('/^[a-z0-9A-Z_\\$\\\\]$/', $c) || ord($c) > 126);
- }
-
- /**
- * Consume a single line comment from input (possibly retaining it)
- */
- protected function consumeSingleLineComment()
- {
- $comment = '';
- while (true) {
- $get = $this->get();
- $comment .= $get;
- if (ord($get) <= self::ORD_LF) { // end of line reached
- // if IE conditional comment
- if (preg_match('/^\\/@(?:cc_on|if|elif|else|end)\\b/', $comment)) {
- $this->keptComment .= "/{$comment}";
- }
- return;
- }
- }
- }
-
- /**
- * Consume a multiple line comment from input (possibly retaining it)
- *
- * @throws JSMin_UnterminatedCommentException
- */
- protected function consumeMultipleLineComment()
- {
- $this->get();
- $comment = '';
- for(;;) {
- $get = $this->get();
- if ($get === '*') {
- if ($this->peek() === '/') { // end of comment reached
- $this->get();
- if (0 === strpos($comment, '!')) {
- // preserved by YUI Compressor
- if (!$this->keptComment) {
- // don't prepend a newline if two comments right after one another
- $this->keptComment = "\n";
- }
- $this->keptComment .= "/*!" . substr($comment, 1) . "*/\n";
- } else if (preg_match('/^@(?:cc_on|if|elif|else|end)\\b/', $comment)) {
- // IE conditional
- $this->keptComment .= "/*{$comment}*/";
- }
- return;
- }
- } elseif ($get === null) {
- throw new JSMin_UnterminatedCommentException(
- "JSMin: Unterminated comment at byte {$this->inputIndex}: /*{$comment}");
- }
- $comment .= $get;
- }
- }
-
- /**
- * Get the next character, skipping over comments. Some comments may be preserved.
- *
- * @return string
- */
- protected function next()
- {
- $get = $this->get();
- if ($get === '/') {
- switch ($this->peek()) {
- case '/':
- $this->consumeSingleLineComment();
- $get = "\n";
- break;
- case '*':
- $this->consumeMultipleLineComment();
- $get = ' ';
- break;
- }
- }
- return $get;
- }
-}
-
-class JSMin_UnterminatedStringException extends Exception {}
-class JSMin_UnterminatedCommentException extends Exception {}
-class JSMin_UnterminatedRegExpException extends Exception {}
diff --git a/inc/lib/minify/JSMinPlus.php b/inc/lib/minify/JSMinPlus.php
deleted file mode 100755
index 5a3c5bdf..00000000
--- a/inc/lib/minify/JSMinPlus.php
+++ /dev/null
@@ -1,2086 +0,0 @@
-
- *
- * Usage: $minified = JSMinPlus::minify($script [, $filename])
- *
- * Versionlog (see also changelog.txt):
- * 23-07-2011 - remove dynamic creation of OP_* and KEYWORD_* defines and declare them on top
- * reduce memory footprint by minifying by block-scope
- * some small byte-saving and performance improvements
- * 12-05-2009 - fixed hook:colon precedence, fixed empty body in loop and if-constructs
- * 18-04-2009 - fixed crashbug in PHP 5.2.9 and several other bugfixes
- * 12-04-2009 - some small bugfixes and performance improvements
- * 09-04-2009 - initial open sourced version 1.0
- *
- * Latest version of this script: http://files.tweakers.net/jsminplus/jsminplus.zip
- *
- */
-
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is the Narcissus JavaScript engine.
- *
- * The Initial Developer of the Original Code is
- * Brendan Eich .
- * Portions created by the Initial Developer are Copyright (C) 2004
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s): Tino Zijdel
- * PHP port, modifications and minifier routine are (C) 2009-2011
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-define('TOKEN_END', 1);
-define('TOKEN_NUMBER', 2);
-define('TOKEN_IDENTIFIER', 3);
-define('TOKEN_STRING', 4);
-define('TOKEN_REGEXP', 5);
-define('TOKEN_NEWLINE', 6);
-define('TOKEN_CONDCOMMENT_START', 7);
-define('TOKEN_CONDCOMMENT_END', 8);
-
-define('JS_SCRIPT', 100);
-define('JS_BLOCK', 101);
-define('JS_LABEL', 102);
-define('JS_FOR_IN', 103);
-define('JS_CALL', 104);
-define('JS_NEW_WITH_ARGS', 105);
-define('JS_INDEX', 106);
-define('JS_ARRAY_INIT', 107);
-define('JS_OBJECT_INIT', 108);
-define('JS_PROPERTY_INIT', 109);
-define('JS_GETTER', 110);
-define('JS_SETTER', 111);
-define('JS_GROUP', 112);
-define('JS_LIST', 113);
-
-define('JS_MINIFIED', 999);
-
-define('DECLARED_FORM', 0);
-define('EXPRESSED_FORM', 1);
-define('STATEMENT_FORM', 2);
-
-/* Operators */
-define('OP_SEMICOLON', ';');
-define('OP_COMMA', ',');
-define('OP_HOOK', '?');
-define('OP_COLON', ':');
-define('OP_OR', '||');
-define('OP_AND', '&&');
-define('OP_BITWISE_OR', '|');
-define('OP_BITWISE_XOR', '^');
-define('OP_BITWISE_AND', '&');
-define('OP_STRICT_EQ', '===');
-define('OP_EQ', '==');
-define('OP_ASSIGN', '=');
-define('OP_STRICT_NE', '!==');
-define('OP_NE', '!=');
-define('OP_LSH', '<<');
-define('OP_LE', '<=');
-define('OP_LT', '<');
-define('OP_URSH', '>>>');
-define('OP_RSH', '>>');
-define('OP_GE', '>=');
-define('OP_GT', '>');
-define('OP_INCREMENT', '++');
-define('OP_DECREMENT', '--');
-define('OP_PLUS', '+');
-define('OP_MINUS', '-');
-define('OP_MUL', '*');
-define('OP_DIV', '/');
-define('OP_MOD', '%');
-define('OP_NOT', '!');
-define('OP_BITWISE_NOT', '~');
-define('OP_DOT', '.');
-define('OP_LEFT_BRACKET', '[');
-define('OP_RIGHT_BRACKET', ']');
-define('OP_LEFT_CURLY', '{');
-define('OP_RIGHT_CURLY', '}');
-define('OP_LEFT_PAREN', '(');
-define('OP_RIGHT_PAREN', ')');
-define('OP_CONDCOMMENT_END', '@*/');
-
-define('OP_UNARY_PLUS', 'U+');
-define('OP_UNARY_MINUS', 'U-');
-
-/* Keywords */
-define('KEYWORD_BREAK', 'break');
-define('KEYWORD_CASE', 'case');
-define('KEYWORD_CATCH', 'catch');
-define('KEYWORD_CONST', 'const');
-define('KEYWORD_CONTINUE', 'continue');
-define('KEYWORD_DEBUGGER', 'debugger');
-define('KEYWORD_DEFAULT', 'default');
-define('KEYWORD_DELETE', 'delete');
-define('KEYWORD_DO', 'do');
-define('KEYWORD_ELSE', 'else');
-define('KEYWORD_ENUM', 'enum');
-define('KEYWORD_FALSE', 'false');
-define('KEYWORD_FINALLY', 'finally');
-define('KEYWORD_FOR', 'for');
-define('KEYWORD_FUNCTION', 'function');
-define('KEYWORD_IF', 'if');
-define('KEYWORD_IN', 'in');
-define('KEYWORD_INSTANCEOF', 'instanceof');
-define('KEYWORD_NEW', 'new');
-define('KEYWORD_NULL', 'null');
-define('KEYWORD_RETURN', 'return');
-define('KEYWORD_SWITCH', 'switch');
-define('KEYWORD_THIS', 'this');
-define('KEYWORD_THROW', 'throw');
-define('KEYWORD_TRUE', 'true');
-define('KEYWORD_TRY', 'try');
-define('KEYWORD_TYPEOF', 'typeof');
-define('KEYWORD_VAR', 'var');
-define('KEYWORD_VOID', 'void');
-define('KEYWORD_WHILE', 'while');
-define('KEYWORD_WITH', 'with');
-
-
-class JSMinPlus
-{
- private $parser;
- private $reserved = array(
- 'break', 'case', 'catch', 'continue', 'default', 'delete', 'do',
- 'else', 'finally', 'for', 'function', 'if', 'in', 'instanceof',
- 'new', 'return', 'switch', 'this', 'throw', 'try', 'typeof', 'var',
- 'void', 'while', 'with',
- // Words reserved for future use
- 'abstract', 'boolean', 'byte', 'char', 'class', 'const', 'debugger',
- 'double', 'enum', 'export', 'extends', 'final', 'float', 'goto',
- 'implements', 'import', 'int', 'interface', 'long', 'native',
- 'package', 'private', 'protected', 'public', 'short', 'static',
- 'super', 'synchronized', 'throws', 'transient', 'volatile',
- // These are not reserved, but should be taken into account
- // in isValidIdentifier (See jslint source code)
- 'arguments', 'eval', 'true', 'false', 'Infinity', 'NaN', 'null', 'undefined'
- );
-
- private function __construct()
- {
- $this->parser = new JSParser($this);
- }
-
- public static function minify($js, $filename='')
- {
- static $instance;
-
- // this is a singleton
- if(!$instance)
- $instance = new JSMinPlus();
-
- return $instance->min($js, $filename);
- }
-
- private function min($js, $filename)
- {
- try
- {
- $n = $this->parser->parse($js, $filename, 1);
- return $this->parseTree($n);
- }
- catch(Exception $e)
- {
- echo $e->getMessage() . "\n";
- }
-
- return false;
- }
-
- public function parseTree($n, $noBlockGrouping = false)
- {
- $s = '';
-
- switch ($n->type)
- {
- case JS_MINIFIED:
- $s = $n->value;
- break;
-
- case JS_SCRIPT:
- // we do nothing yet with funDecls or varDecls
- $noBlockGrouping = true;
- // FALL THROUGH
-
- case JS_BLOCK:
- $childs = $n->treeNodes;
- $lastType = 0;
- for ($c = 0, $i = 0, $j = count($childs); $i < $j; $i++)
- {
- $type = $childs[$i]->type;
- $t = $this->parseTree($childs[$i]);
- if (strlen($t))
- {
- if ($c)
- {
- $s = rtrim($s, ';');
-
- if ($type == KEYWORD_FUNCTION && $childs[$i]->functionForm == DECLARED_FORM)
- {
- // put declared functions on a new line
- $s .= "\n";
- }
- elseif ($type == KEYWORD_VAR && $type == $lastType)
- {
- // mutiple var-statements can go into one
- $t = ',' . substr($t, 4);
- }
- else
- {
- // add terminator
- $s .= ';';
- }
- }
-
- $s .= $t;
-
- $c++;
- $lastType = $type;
- }
- }
-
- if ($c > 1 && !$noBlockGrouping)
- {
- $s = '{' . $s . '}';
- }
- break;
-
- case KEYWORD_FUNCTION:
- $s .= 'function' . ($n->name ? ' ' . $n->name : '') . '(';
- $params = $n->params;
- for ($i = 0, $j = count($params); $i < $j; $i++)
- $s .= ($i ? ',' : '') . $params[$i];
- $s .= '){' . $this->parseTree($n->body, true) . '}';
- break;
-
- case KEYWORD_IF:
- $s = 'if(' . $this->parseTree($n->condition) . ')';
- $thenPart = $this->parseTree($n->thenPart);
- $elsePart = $n->elsePart ? $this->parseTree($n->elsePart) : null;
-
- // empty if-statement
- if ($thenPart == '')
- $thenPart = ';';
-
- if ($elsePart)
- {
- // be carefull and always make a block out of the thenPart; could be more optimized but is a lot of trouble
- if ($thenPart != ';' && $thenPart[0] != '{')
- $thenPart = '{' . $thenPart . '}';
-
- $s .= $thenPart . 'else';
-
- // we could check for more, but that hardly ever applies so go for performance
- if ($elsePart[0] != '{')
- $s .= ' ';
-
- $s .= $elsePart;
- }
- else
- {
- $s .= $thenPart;
- }
- break;
-
- case KEYWORD_SWITCH:
- $s = 'switch(' . $this->parseTree($n->discriminant) . '){';
- $cases = $n->cases;
- for ($i = 0, $j = count($cases); $i < $j; $i++)
- {
- $case = $cases[$i];
- if ($case->type == KEYWORD_CASE)
- $s .= 'case' . ($case->caseLabel->type != TOKEN_STRING ? ' ' : '') . $this->parseTree($case->caseLabel) . ':';
- else
- $s .= 'default:';
-
- $statement = $this->parseTree($case->statements, true);
- if ($statement)
- {
- $s .= $statement;
- // no terminator for last statement
- if ($i + 1 < $j)
- $s .= ';';
- }
- }
- $s .= '}';
- break;
-
- case KEYWORD_FOR:
- $s = 'for(' . ($n->setup ? $this->parseTree($n->setup) : '')
- . ';' . ($n->condition ? $this->parseTree($n->condition) : '')
- . ';' . ($n->update ? $this->parseTree($n->update) : '') . ')';
-
- $body = $this->parseTree($n->body);
- if ($body == '')
- $body = ';';
-
- $s .= $body;
- break;
-
- case KEYWORD_WHILE:
- $s = 'while(' . $this->parseTree($n->condition) . ')';
-
- $body = $this->parseTree($n->body);
- if ($body == '')
- $body = ';';
-
- $s .= $body;
- break;
-
- case JS_FOR_IN:
- $s = 'for(' . ($n->varDecl ? $this->parseTree($n->varDecl) : $this->parseTree($n->iterator)) . ' in ' . $this->parseTree($n->object) . ')';
-
- $body = $this->parseTree($n->body);
- if ($body == '')
- $body = ';';
-
- $s .= $body;
- break;
-
- case KEYWORD_DO:
- $s = 'do{' . $this->parseTree($n->body, true) . '}while(' . $this->parseTree($n->condition) . ')';
- break;
-
- case KEYWORD_BREAK:
- case KEYWORD_CONTINUE:
- $s = $n->value . ($n->label ? ' ' . $n->label : '');
- break;
-
- case KEYWORD_TRY:
- $s = 'try{' . $this->parseTree($n->tryBlock, true) . '}';
- $catchClauses = $n->catchClauses;
- for ($i = 0, $j = count($catchClauses); $i < $j; $i++)
- {
- $t = $catchClauses[$i];
- $s .= 'catch(' . $t->varName . ($t->guard ? ' if ' . $this->parseTree($t->guard) : '') . '){' . $this->parseTree($t->block, true) . '}';
- }
- if ($n->finallyBlock)
- $s .= 'finally{' . $this->parseTree($n->finallyBlock, true) . '}';
- break;
-
- case KEYWORD_THROW:
- case KEYWORD_RETURN:
- $s = $n->type;
- if ($n->value)
- {
- $t = $this->parseTree($n->value);
- if (strlen($t))
- {
- if ($this->isWordChar($t[0]) || $t[0] == '\\')
- $s .= ' ';
-
- $s .= $t;
- }
- }
- break;
-
- case KEYWORD_WITH:
- $s = 'with(' . $this->parseTree($n->object) . ')' . $this->parseTree($n->body);
- break;
-
- case KEYWORD_VAR:
- case KEYWORD_CONST:
- $s = $n->value . ' ';
- $childs = $n->treeNodes;
- for ($i = 0, $j = count($childs); $i < $j; $i++)
- {
- $t = $childs[$i];
- $s .= ($i ? ',' : '') . $t->name;
- $u = $t->initializer;
- if ($u)
- $s .= '=' . $this->parseTree($u);
- }
- break;
-
- case KEYWORD_IN:
- case KEYWORD_INSTANCEOF:
- $left = $this->parseTree($n->treeNodes[0]);
- $right = $this->parseTree($n->treeNodes[1]);
-
- $s = $left;
-
- if ($this->isWordChar(substr($left, -1)))
- $s .= ' ';
-
- $s .= $n->type;
-
- if ($this->isWordChar($right[0]) || $right[0] == '\\')
- $s .= ' ';
-
- $s .= $right;
- break;
-
- case KEYWORD_DELETE:
- case KEYWORD_TYPEOF:
- $right = $this->parseTree($n->treeNodes[0]);
-
- $s = $n->type;
-
- if ($this->isWordChar($right[0]) || $right[0] == '\\')
- $s .= ' ';
-
- $s .= $right;
- break;
-
- case KEYWORD_VOID:
- $s = 'void(' . $this->parseTree($n->treeNodes[0]) . ')';
- break;
-
- case KEYWORD_DEBUGGER:
- throw new Exception('NOT IMPLEMENTED: DEBUGGER');
- break;
-
- case TOKEN_CONDCOMMENT_START:
- case TOKEN_CONDCOMMENT_END:
- $s = $n->value . ($n->type == TOKEN_CONDCOMMENT_START ? ' ' : '');
- $childs = $n->treeNodes;
- for ($i = 0, $j = count($childs); $i < $j; $i++)
- $s .= $this->parseTree($childs[$i]);
- break;
-
- case OP_SEMICOLON:
- if ($expression = $n->expression)
- $s = $this->parseTree($expression);
- break;
-
- case JS_LABEL:
- $s = $n->label . ':' . $this->parseTree($n->statement);
- break;
-
- case OP_COMMA:
- $childs = $n->treeNodes;
- for ($i = 0, $j = count($childs); $i < $j; $i++)
- $s .= ($i ? ',' : '') . $this->parseTree($childs[$i]);
- break;
-
- case OP_ASSIGN:
- $s = $this->parseTree($n->treeNodes[0]) . $n->value . $this->parseTree($n->treeNodes[1]);
- break;
-
- case OP_HOOK:
- $s = $this->parseTree($n->treeNodes[0]) . '?' . $this->parseTree($n->treeNodes[1]) . ':' . $this->parseTree($n->treeNodes[2]);
- break;
-
- case OP_OR: case OP_AND:
- case OP_BITWISE_OR: case OP_BITWISE_XOR: case OP_BITWISE_AND:
- case OP_EQ: case OP_NE: case OP_STRICT_EQ: case OP_STRICT_NE:
- case OP_LT: case OP_LE: case OP_GE: case OP_GT:
- case OP_LSH: case OP_RSH: case OP_URSH:
- case OP_MUL: case OP_DIV: case OP_MOD:
- $s = $this->parseTree($n->treeNodes[0]) . $n->type . $this->parseTree($n->treeNodes[1]);
- break;
-
- case OP_PLUS:
- case OP_MINUS:
- $left = $this->parseTree($n->treeNodes[0]);
- $right = $this->parseTree($n->treeNodes[1]);
-
- switch ($n->treeNodes[1]->type)
- {
- case OP_PLUS:
- case OP_MINUS:
- case OP_INCREMENT:
- case OP_DECREMENT:
- case OP_UNARY_PLUS:
- case OP_UNARY_MINUS:
- $s = $left . $n->type . ' ' . $right;
- break;
-
- case TOKEN_STRING:
- //combine concatted strings with same quotestyle
- if ($n->type == OP_PLUS && substr($left, -1) == $right[0])
- {
- $s = substr($left, 0, -1) . substr($right, 1);
- break;
- }
- // FALL THROUGH
-
- default:
- $s = $left . $n->type . $right;
- }
- break;
-
- case OP_NOT:
- case OP_BITWISE_NOT:
- case OP_UNARY_PLUS:
- case OP_UNARY_MINUS:
- $s = $n->value . $this->parseTree($n->treeNodes[0]);
- break;
-
- case OP_INCREMENT:
- case OP_DECREMENT:
- if ($n->postfix)
- $s = $this->parseTree($n->treeNodes[0]) . $n->value;
- else
- $s = $n->value . $this->parseTree($n->treeNodes[0]);
- break;
-
- case OP_DOT:
- $s = $this->parseTree($n->treeNodes[0]) . '.' . $this->parseTree($n->treeNodes[1]);
- break;
-
- case JS_INDEX:
- $s = $this->parseTree($n->treeNodes[0]);
- // See if we can replace named index with a dot saving 3 bytes
- if ( $n->treeNodes[0]->type == TOKEN_IDENTIFIER &&
- $n->treeNodes[1]->type == TOKEN_STRING &&
- $this->isValidIdentifier(substr($n->treeNodes[1]->value, 1, -1))
- )
- $s .= '.' . substr($n->treeNodes[1]->value, 1, -1);
- else
- $s .= '[' . $this->parseTree($n->treeNodes[1]) . ']';
- break;
-
- case JS_LIST:
- $childs = $n->treeNodes;
- for ($i = 0, $j = count($childs); $i < $j; $i++)
- $s .= ($i ? ',' : '') . $this->parseTree($childs[$i]);
- break;
-
- case JS_CALL:
- $s = $this->parseTree($n->treeNodes[0]) . '(' . $this->parseTree($n->treeNodes[1]) . ')';
- break;
-
- case KEYWORD_NEW:
- case JS_NEW_WITH_ARGS:
- $s = 'new ' . $this->parseTree($n->treeNodes[0]) . '(' . ($n->type == JS_NEW_WITH_ARGS ? $this->parseTree($n->treeNodes[1]) : '') . ')';
- break;
-
- case JS_ARRAY_INIT:
- $s = '[';
- $childs = $n->treeNodes;
- for ($i = 0, $j = count($childs); $i < $j; $i++)
- {
- $s .= ($i ? ',' : '') . $this->parseTree($childs[$i]);
- }
- $s .= ']';
- break;
-
- case JS_OBJECT_INIT:
- $s = '{';
- $childs = $n->treeNodes;
- for ($i = 0, $j = count($childs); $i < $j; $i++)
- {
- $t = $childs[$i];
- if ($i)
- $s .= ',';
- if ($t->type == JS_PROPERTY_INIT)
- {
- // Ditch the quotes when the index is a valid identifier
- if ( $t->treeNodes[0]->type == TOKEN_STRING &&
- $this->isValidIdentifier(substr($t->treeNodes[0]->value, 1, -1))
- )
- $s .= substr($t->treeNodes[0]->value, 1, -1);
- else
- $s .= $t->treeNodes[0]->value;
-
- $s .= ':' . $this->parseTree($t->treeNodes[1]);
- }
- else
- {
- $s .= $t->type == JS_GETTER ? 'get' : 'set';
- $s .= ' ' . $t->name . '(';
- $params = $t->params;
- for ($i = 0, $j = count($params); $i < $j; $i++)
- $s .= ($i ? ',' : '') . $params[$i];
- $s .= '){' . $this->parseTree($t->body, true) . '}';
- }
- }
- $s .= '}';
- break;
-
- case TOKEN_NUMBER:
- $s = $n->value;
- if (preg_match('/^([1-9]+)(0{3,})$/', $s, $m))
- $s = $m[1] . 'e' . strlen($m[2]);
- break;
-
- case KEYWORD_NULL: case KEYWORD_THIS: case KEYWORD_TRUE: case KEYWORD_FALSE:
- case TOKEN_IDENTIFIER: case TOKEN_STRING: case TOKEN_REGEXP:
- $s = $n->value;
- break;
-
- case JS_GROUP:
- if (in_array(
- $n->treeNodes[0]->type,
- array(
- JS_ARRAY_INIT, JS_OBJECT_INIT, JS_GROUP,
- TOKEN_NUMBER, TOKEN_STRING, TOKEN_REGEXP, TOKEN_IDENTIFIER,
- KEYWORD_NULL, KEYWORD_THIS, KEYWORD_TRUE, KEYWORD_FALSE
- )
- ))
- {
- $s = $this->parseTree($n->treeNodes[0]);
- }
- else
- {
- $s = '(' . $this->parseTree($n->treeNodes[0]) . ')';
- }
- break;
-
- default:
- throw new Exception('UNKNOWN TOKEN TYPE: ' . $n->type);
- }
-
- return $s;
- }
-
- private function isValidIdentifier($string)
- {
- return preg_match('/^[a-zA-Z_][a-zA-Z0-9_]*$/', $string) && !in_array($string, $this->reserved);
- }
-
- private function isWordChar($char)
- {
- return $char == '_' || $char == '$' || ctype_alnum($char);
- }
-}
-
-class JSParser
-{
- private $t;
- private $minifier;
-
- private $opPrecedence = array(
- ';' => 0,
- ',' => 1,
- '=' => 2, '?' => 2, ':' => 2,
- // The above all have to have the same precedence, see bug 330975
- '||' => 4,
- '&&' => 5,
- '|' => 6,
- '^' => 7,
- '&' => 8,
- '==' => 9, '!=' => 9, '===' => 9, '!==' => 9,
- '<' => 10, '<=' => 10, '>=' => 10, '>' => 10, 'in' => 10, 'instanceof' => 10,
- '<<' => 11, '>>' => 11, '>>>' => 11,
- '+' => 12, '-' => 12,
- '*' => 13, '/' => 13, '%' => 13,
- 'delete' => 14, 'void' => 14, 'typeof' => 14,
- '!' => 14, '~' => 14, 'U+' => 14, 'U-' => 14,
- '++' => 15, '--' => 15,
- 'new' => 16,
- '.' => 17,
- JS_NEW_WITH_ARGS => 0, JS_INDEX => 0, JS_CALL => 0,
- JS_ARRAY_INIT => 0, JS_OBJECT_INIT => 0, JS_GROUP => 0
- );
-
- private $opArity = array(
- ',' => -2,
- '=' => 2,
- '?' => 3,
- '||' => 2,
- '&&' => 2,
- '|' => 2,
- '^' => 2,
- '&' => 2,
- '==' => 2, '!=' => 2, '===' => 2, '!==' => 2,
- '<' => 2, '<=' => 2, '>=' => 2, '>' => 2, 'in' => 2, 'instanceof' => 2,
- '<<' => 2, '>>' => 2, '>>>' => 2,
- '+' => 2, '-' => 2,
- '*' => 2, '/' => 2, '%' => 2,
- 'delete' => 1, 'void' => 1, 'typeof' => 1,
- '!' => 1, '~' => 1, 'U+' => 1, 'U-' => 1,
- '++' => 1, '--' => 1,
- 'new' => 1,
- '.' => 2,
- JS_NEW_WITH_ARGS => 2, JS_INDEX => 2, JS_CALL => 2,
- JS_ARRAY_INIT => 1, JS_OBJECT_INIT => 1, JS_GROUP => 1,
- TOKEN_CONDCOMMENT_START => 1, TOKEN_CONDCOMMENT_END => 1
- );
-
- public function __construct($minifier=null)
- {
- $this->minifier = $minifier;
- $this->t = new JSTokenizer();
- }
-
- public function parse($s, $f, $l)
- {
- // initialize tokenizer
- $this->t->init($s, $f, $l);
-
- $x = new JSCompilerContext(false);
- $n = $this->Script($x);
- if (!$this->t->isDone())
- throw $this->t->newSyntaxError('Syntax error');
-
- return $n;
- }
-
- private function Script($x)
- {
- $n = $this->Statements($x);
- $n->type = JS_SCRIPT;
- $n->funDecls = $x->funDecls;
- $n->varDecls = $x->varDecls;
-
- // minify by scope
- if ($this->minifier)
- {
- $n->value = $this->minifier->parseTree($n);
-
- // clear tree from node to save memory
- $n->treeNodes = null;
- $n->funDecls = null;
- $n->varDecls = null;
-
- $n->type = JS_MINIFIED;
- }
-
- return $n;
- }
-
- private function Statements($x)
- {
- $n = new JSNode($this->t, JS_BLOCK);
- array_push($x->stmtStack, $n);
-
- while (!$this->t->isDone() && $this->t->peek() != OP_RIGHT_CURLY)
- $n->addNode($this->Statement($x));
-
- array_pop($x->stmtStack);
-
- return $n;
- }
-
- private function Block($x)
- {
- $this->t->mustMatch(OP_LEFT_CURLY);
- $n = $this->Statements($x);
- $this->t->mustMatch(OP_RIGHT_CURLY);
-
- return $n;
- }
-
- private function Statement($x)
- {
- $tt = $this->t->get();
- $n2 = null;
-
- // Cases for statements ending in a right curly return early, avoiding the
- // common semicolon insertion magic after this switch.
- switch ($tt)
- {
- case KEYWORD_FUNCTION:
- return $this->FunctionDefinition(
- $x,
- true,
- count($x->stmtStack) > 1 ? STATEMENT_FORM : DECLARED_FORM
- );
- break;
-
- case OP_LEFT_CURLY:
- $n = $this->Statements($x);
- $this->t->mustMatch(OP_RIGHT_CURLY);
- return $n;
-
- case KEYWORD_IF:
- $n = new JSNode($this->t);
- $n->condition = $this->ParenExpression($x);
- array_push($x->stmtStack, $n);
- $n->thenPart = $this->Statement($x);
- $n->elsePart = $this->t->match(KEYWORD_ELSE) ? $this->Statement($x) : null;
- array_pop($x->stmtStack);
- return $n;
-
- case KEYWORD_SWITCH:
- $n = new JSNode($this->t);
- $this->t->mustMatch(OP_LEFT_PAREN);
- $n->discriminant = $this->Expression($x);
- $this->t->mustMatch(OP_RIGHT_PAREN);
- $n->cases = array();
- $n->defaultIndex = -1;
-
- array_push($x->stmtStack, $n);
-
- $this->t->mustMatch(OP_LEFT_CURLY);
-
- while (($tt = $this->t->get()) != OP_RIGHT_CURLY)
- {
- switch ($tt)
- {
- case KEYWORD_DEFAULT:
- if ($n->defaultIndex >= 0)
- throw $this->t->newSyntaxError('More than one switch default');
- // FALL THROUGH
- case KEYWORD_CASE:
- $n2 = new JSNode($this->t);
- if ($tt == KEYWORD_DEFAULT)
- $n->defaultIndex = count($n->cases);
- else
- $n2->caseLabel = $this->Expression($x, OP_COLON);
- break;
- default:
- throw $this->t->newSyntaxError('Invalid switch case');
- }
-
- $this->t->mustMatch(OP_COLON);
- $n2->statements = new JSNode($this->t, JS_BLOCK);
- while (($tt = $this->t->peek()) != KEYWORD_CASE && $tt != KEYWORD_DEFAULT && $tt != OP_RIGHT_CURLY)
- $n2->statements->addNode($this->Statement($x));
-
- array_push($n->cases, $n2);
- }
-
- array_pop($x->stmtStack);
- return $n;
-
- case KEYWORD_FOR:
- $n = new JSNode($this->t);
- $n->isLoop = true;
- $this->t->mustMatch(OP_LEFT_PAREN);
-
- if (($tt = $this->t->peek()) != OP_SEMICOLON)
- {
- $x->inForLoopInit = true;
- if ($tt == KEYWORD_VAR || $tt == KEYWORD_CONST)
- {
- $this->t->get();
- $n2 = $this->Variables($x);
- }
- else
- {
- $n2 = $this->Expression($x);
- }
- $x->inForLoopInit = false;
- }
-
- if ($n2 && $this->t->match(KEYWORD_IN))
- {
- $n->type = JS_FOR_IN;
- if ($n2->type == KEYWORD_VAR)
- {
- if (count($n2->treeNodes) != 1)
- {
- throw $this->t->SyntaxError(
- 'Invalid for..in left-hand side',
- $this->t->filename,
- $n2->lineno
- );
- }
-
- // NB: n2[0].type == IDENTIFIER and n2[0].value == n2[0].name.
- $n->iterator = $n2->treeNodes[0];
- $n->varDecl = $n2;
- }
- else
- {
- $n->iterator = $n2;
- $n->varDecl = null;
- }
-
- $n->object = $this->Expression($x);
- }
- else
- {
- $n->setup = $n2 ? $n2 : null;
- $this->t->mustMatch(OP_SEMICOLON);
- $n->condition = $this->t->peek() == OP_SEMICOLON ? null : $this->Expression($x);
- $this->t->mustMatch(OP_SEMICOLON);
- $n->update = $this->t->peek() == OP_RIGHT_PAREN ? null : $this->Expression($x);
- }
-
- $this->t->mustMatch(OP_RIGHT_PAREN);
- $n->body = $this->nest($x, $n);
- return $n;
-
- case KEYWORD_WHILE:
- $n = new JSNode($this->t);
- $n->isLoop = true;
- $n->condition = $this->ParenExpression($x);
- $n->body = $this->nest($x, $n);
- return $n;
-
- case KEYWORD_DO:
- $n = new JSNode($this->t);
- $n->isLoop = true;
- $n->body = $this->nest($x, $n, KEYWORD_WHILE);
- $n->condition = $this->ParenExpression($x);
- if (!$x->ecmaStrictMode)
- {
- //
+ {% endverbatim %}