From 891751d09ec24087eeaef9d42209d92251760c98 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 2 Sep 2014 16:58:55 -0500 Subject: [PATCH 01/56] Fixed case where base_url was empty --- system/src/Grav/Common/Markdown/MarkdownGravLinkTrait.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/src/Grav/Common/Markdown/MarkdownGravLinkTrait.php b/system/src/Grav/Common/Markdown/MarkdownGravLinkTrait.php index 1206ac654..29aa68009 100644 --- a/system/src/Grav/Common/Markdown/MarkdownGravLinkTrait.php +++ b/system/src/Grav/Common/Markdown/MarkdownGravLinkTrait.php @@ -107,7 +107,7 @@ protected function identifyLink($Excerpt) protected function convertUrl($markdown_url) { // if absolue and starts with a base_url move on - if (strpos($markdown_url, $this->base_url) === 0) { + if ($this->base_url == '' || strpos($markdown_url, $this->base_url) === 0) { $new_url = $markdown_url; // if its absolute with / } elseif (strpos($markdown_url, '/') === 0) { From c73e0d140d2eb2b39c38a64bfd099a121712fe4b Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Wed, 3 Sep 2014 09:07:29 +0300 Subject: [PATCH 02/56] Go back to PSR-4 --- composer.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 1dbf67ed1..7a2e4cb20 100644 --- a/composer.json +++ b/composer.json @@ -21,8 +21,8 @@ "pimple/pimple": "~3.0" }, "autoload": { - "psr-0": { - "Grav\\": "system/src/" + "psr-4": { + "Grav\\": "system/src/Grav" }, "files": ["system/defines.php"] }, From 943921eadb4f2d8dc388e7fb1469424f85198baa Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Wed, 3 Sep 2014 21:19:16 +0300 Subject: [PATCH 03/56] Fix broken password validation --- system/src/Grav/Common/User/User.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/system/src/Grav/Common/User/User.php b/system/src/Grav/Common/User/User.php index c3c6717a2..678085c13 100644 --- a/system/src/Grav/Common/User/User.php +++ b/system/src/Grav/Common/User/User.php @@ -11,8 +11,6 @@ */ class User extends Data { - protected $password; - /** * Authenticate user. * From a999046882dbe8023ac106cce86f1962a1e3e52b Mon Sep 17 00:00:00 2001 From: Jan Chren Date: Thu, 4 Sep 2014 00:27:30 +0200 Subject: [PATCH 04/56] removed unused functions --- system/src/Grav/Common/Debugger.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/system/src/Grav/Common/Debugger.php b/system/src/Grav/Common/Debugger.php index ee32ead76..456403eb5 100644 --- a/system/src/Grav/Common/Debugger.php +++ b/system/src/Grav/Common/Debugger.php @@ -42,15 +42,14 @@ public function init() ini_set('display_errors', true); } - if ($mode == strtolower('detect')) { + if ($mode === 'detect') { TracyDebugger::$productionMode = self::DETECT; - } elseif ($mode == strtolower('production')) { + } elseif ($mode === 'production') { TracyDebugger::$productionMode = self::PRODUCTION; } else { TracyDebugger::$productionMode = self::DEVELOPMENT; } - } } From 144d64e0c8931b31d66eb7143f1ea39fc085a26d Mon Sep 17 00:00:00 2001 From: Jan Chren Date: Thu, 4 Sep 2014 00:29:45 +0200 Subject: [PATCH 05/56] detect mode only if debugger enabled --- system/src/Grav/Common/Debugger.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/src/Grav/Common/Debugger.php b/system/src/Grav/Common/Debugger.php index 456403eb5..03324b74f 100644 --- a/system/src/Grav/Common/Debugger.php +++ b/system/src/Grav/Common/Debugger.php @@ -28,7 +28,6 @@ public function init() /** @var Config $config */ $config = $grav['config']; - $mode = $config->get('system.debugger.mode'); TracyDebugger::$logDirectory = $config->get('system.debugger.log.enabled') ? LOG_DIR : null; TracyDebugger::$maxDepth = $config->get('system.debugger.max_depth'); @@ -42,6 +41,7 @@ public function init() ini_set('display_errors', true); } + $mode = $config->get('system.debugger.mode'); if ($mode === 'detect') { TracyDebugger::$productionMode = self::DETECT; } elseif ($mode === 'production') { From 971508f613585488ce9ec65dd26f4fee31424295 Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Wed, 3 Sep 2014 17:49:55 -0600 Subject: [PATCH 06/56] Removed memcache from auto setup, added memcache server config, removed memcached support --- system/src/Grav/Common/Cache.php | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/system/src/Grav/Common/Cache.php b/system/src/Grav/Common/Cache.php index 9c2de6886..2fa6c7f79 100644 --- a/system/src/Grav/Common/Cache.php +++ b/system/src/Grav/Common/Cache.php @@ -90,8 +90,6 @@ public function getCacheDriver() $driver_name = 'wincache'; } elseif (extension_loaded('xcache')) { $driver_name = 'xcache'; - } elseif (extension_loaded('memcache')) { - $driver_name = 'memcache'; } } else { $driver_name = $setting; @@ -111,11 +109,11 @@ public function getCacheDriver() break; case 'memcache': + $memcache = new \Memcache(); + $memcache->connect($this->config->get('system.cache.memcache.server','localhost'), + $this->config->get('system.cache.memcache.port', 11211)); $driver = new \Doctrine\Common\Cache\MemcacheCache(); - break; - - case 'memcached': - $driver = new \Doctrine\Common\Cache\MemcachedCache(); + $driver->setMemcache($memcache); break; default: From a0f5e35ad525481296a69d8c470e0dde99dcdeae Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Wed, 3 Sep 2014 17:54:50 -0600 Subject: [PATCH 07/56] removed memcahed from the list of cache options --- system/config/system.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/config/system.yaml b/system/config/system.yaml index 42cd16999..7529f9b01 100644 --- a/system/config/system.yaml +++ b/system/config/system.yaml @@ -23,7 +23,7 @@ cache: enabled: true # Set to true to enable caching check: method: file # Method to check for updates in pages: file|folder|none - driver: auto # One of: auto|file|apc|xcache|memcache|memcached|wincache + driver: auto # One of: auto|file|apc|xcache|memcache|wincache prefix: 'g' # Cache prefix string (prevents cache conflicts) twig: From 32dfc001afda2f0258c869d566ea89bc3e5e15ef Mon Sep 17 00:00:00 2001 From: Djamil Legato Date: Wed, 3 Sep 2014 17:43:15 -0700 Subject: [PATCH 08/56] Switch to old fashion array declaration in the index.php to allow PHP to parse without failing and then check for the required PHP version (5.4+) [Fixes #36] --- index.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/index.php b/index.php index 1137ea3ca..8af6d323a 100644 --- a/index.php +++ b/index.php @@ -20,10 +20,10 @@ } $grav = Grav::instance( - [ + array( 'loader' => $loader, 'debugger' => new Debugger(Debugger::PRODUCTION) - ] + ) ); try { From cc81ea7e3eb845c9cac43b908ee18415a44807a4 Mon Sep 17 00:00:00 2001 From: Jan Chren Date: Thu, 4 Sep 2014 02:50:27 +0200 Subject: [PATCH 09/56] disable display_errors in production environment --- system/src/Grav/Common/Debugger.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/system/src/Grav/Common/Debugger.php b/system/src/Grav/Common/Debugger.php index 03324b74f..3ffbd50b0 100644 --- a/system/src/Grav/Common/Debugger.php +++ b/system/src/Grav/Common/Debugger.php @@ -37,11 +37,12 @@ public function init() TracyDebugger::$strictMode = true; } + $mode = $config->get('system.debugger.mode'); + if (function_exists('ini_set')) { - ini_set('display_errors', true); + ini_set('display_errors', !($mode === 'production')); } - $mode = $config->get('system.debugger.mode'); if ($mode === 'detect') { TracyDebugger::$productionMode = self::DETECT; } elseif ($mode === 'production') { From 8da3eb32f01c5f204cd3038a4522d4b28790f19b Mon Sep 17 00:00:00 2001 From: Jan Chren Date: Fri, 5 Sep 2014 14:43:15 +0200 Subject: [PATCH 10/56] fix for PHP warning "is_file(): open_basedir restriction in effect" Example: PHP Warning: is_file(): open_basedir restriction in effect. File(/home/users/.../user/plugins/.gitkeep/.gitkeep.yaml) is not within the allowed path(s): (/home/users/.../:/usr/share/pear/) in .../web/system/src/Grav/Common/Config.php:237 --- system/src/Grav/Common/Config.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/system/src/Grav/Common/Config.php b/system/src/Grav/Common/Config.php index df25af870..484ed1763 100644 --- a/system/src/Grav/Common/Config.php +++ b/system/src/Grav/Common/Config.php @@ -232,9 +232,10 @@ protected function build() /** @var \DirectoryIterator $plugin */ foreach ($iterator as $plugin) { $name = $plugin->getBasename(); - $file = $plugin->getPathname() . DS . $name . YAML_EXT; + $dir = $plugin->getPathname() ; + $file = $dir . DS . $name . YAML_EXT; - if (!is_file($file)) { + if (!(is_dir($dir) && is_file($file))) { continue; } From e5037eb69b6d48b40cfc360a0584dacd5214deea Mon Sep 17 00:00:00 2001 From: Jan Chren Date: Fri, 5 Sep 2014 16:17:05 +0200 Subject: [PATCH 11/56] json_encode() is faster than serialize() ref: http://stackoverflow.com/a/7723730/2566213 --- system/src/Grav/Common/Config.php | 2 +- system/src/Grav/Common/Page/Pages.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/system/src/Grav/Common/Config.php b/system/src/Grav/Common/Config.php index df25af870..c3abf1311 100644 --- a/system/src/Grav/Common/Config.php +++ b/system/src/Grav/Common/Config.php @@ -55,7 +55,7 @@ public function reload($force = true) { // Build file map. $files = $this->build(); - $key = md5(serialize($files) . GRAV_VERSION); + $key = md5(json_encode($files) . GRAV_VERSION); if ($force || $key != $this->key) { // First take non-blocking lock to the file. diff --git a/system/src/Grav/Common/Page/Pages.php b/system/src/Grav/Common/Page/Pages.php index 39a201d7a..9005ce911 100644 --- a/system/src/Grav/Common/Page/Pages.php +++ b/system/src/Grav/Common/Page/Pages.php @@ -173,7 +173,7 @@ public function sortCollection(Collection $collection, $orderBy, $orderDir = 'as { $items = $collection->toArray(); - $lookup = md5(serialize($items)); + $lookup = md5(json_encode($items)); if (!isset($this->sort[$lookup][$orderBy])) { $this->buildSort($lookup, $items, $orderBy, $orderManual); } From 217db86b10a1ace52621f0e90dc83c53b1ba5781 Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Fri, 5 Sep 2014 08:36:11 -0600 Subject: [PATCH 12/56] accidental commit reverted --- user/config/system.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user/config/system.yaml b/user/config/system.yaml index 9feefb105..bb0d73c73 100644 --- a/user/config/system.yaml +++ b/user/config/system.yaml @@ -22,7 +22,7 @@ twig: autoescape: false assets: - css_pipeline: true + css_pipeline: false css_minify: true css_rewrite: true js_pipeline: false From 57ab99fb138c4cd1804a28012df0a94a79c3b883 Mon Sep 17 00:00:00 2001 From: Djamil Legato Date: Fri, 5 Sep 2014 12:56:43 -0700 Subject: [PATCH 13/56] Getting away from providing vendor with the repo --- vendor/autoload.php | 7 - vendor/composer/ClassLoader.php | 383 --- vendor/composer/autoload_classmap.php | 415 ---- vendor/composer/autoload_files.php | 13 - vendor/composer/autoload_namespaces.php | 19 - vendor/composer/autoload_psr4.php | 10 - vendor/composer/autoload_real.php | 55 - vendor/composer/installed.json | 719 ------ vendor/doctrine/cache/LICENSE | 19 - vendor/doctrine/cache/README.md | 14 - .../lib/Doctrine/Common/Cache/ApcCache.php | 98 - .../lib/Doctrine/Common/Cache/ArrayCache.php | 93 - .../cache/lib/Doctrine/Common/Cache/Cache.php | 111 - .../Doctrine/Common/Cache/CacheProvider.php | 241 -- .../Doctrine/Common/Cache/CouchbaseCache.php | 121 - .../lib/Doctrine/Common/Cache/FileCache.php | 158 -- .../Doctrine/Common/Cache/FilesystemCache.php | 113 - .../Doctrine/Common/Cache/MemcacheCache.php | 121 - .../Doctrine/Common/Cache/MemcachedCache.php | 124 - .../Doctrine/Common/Cache/MongoDBCache.php | 191 -- .../Doctrine/Common/Cache/PhpFileCache.php | 107 - .../lib/Doctrine/Common/Cache/RedisCache.php | 131 -- .../lib/Doctrine/Common/Cache/RiakCache.php | 250 -- .../lib/Doctrine/Common/Cache/Version.php | 25 - .../Doctrine/Common/Cache/WinCacheCache.php | 91 - .../lib/Doctrine/Common/Cache/XcacheCache.php | 109 - .../Doctrine/Common/Cache/ZendDataCache.php | 83 - vendor/donatj/phpuseragentparser/LICENSE.md | 22 - vendor/donatj/phpuseragentparser/README.md | 110 - .../Source/UserAgentParser.php | 144 -- vendor/erusev/parsedown-extra/LICENSE.txt | 20 - .../erusev/parsedown-extra/ParsedownExtra.php | 420 ---- vendor/erusev/parsedown-extra/README.md | 17 - vendor/erusev/parsedown/LICENSE.txt | 20 - vendor/erusev/parsedown/Parsedown.php | 1402 ----------- vendor/erusev/parsedown/README.md | 40 - vendor/gregwar/cache/Gregwar/Cache/Cache.php | 291 --- .../cache/Gregwar/Cache/GarbageCollect.php | 86 - vendor/gregwar/cache/Gregwar/Cache/LICENSE | 19 - vendor/gregwar/cache/Gregwar/Cache/README.md | 162 -- .../gregwar/cache/Gregwar/Cache/autoload.php | 16 - .../image/Gregwar/Image/Adapter/Adapter.php | 58 - .../Image/Adapter/AdapterInterface.php | 378 --- .../image/Gregwar/Image/Adapter/Common.php | 275 --- .../image/Gregwar/Image/Adapter/GD.php | 516 ---- .../image/Gregwar/Image/Adapter/Imagick.php | 382 --- .../Image/Exceptions/GenerationError.php | 16 - .../image/Gregwar/Image/GarbageCollect.php | 83 - vendor/gregwar/image/Gregwar/Image/Image.php | 717 ------ .../image/Gregwar/Image/ImageColor.php | 93 - vendor/gregwar/image/Gregwar/Image/LICENSE | 19 - vendor/gregwar/image/Gregwar/Image/README.md | 271 --- .../image/Gregwar/Image/Source/Create.php | 38 - .../image/Gregwar/Image/Source/Data.php | 26 - .../image/Gregwar/Image/Source/File.php | 63 - .../image/Gregwar/Image/Source/Resource.php | 21 - .../image/Gregwar/Image/Source/Source.php | 34 - .../gregwar/image/Gregwar/Image/autoload.php | 21 - .../image/Gregwar/Image/images/error.jpg | Bin 1108 -> 0 bytes vendor/ircmaxell/password-compat/LICENSE.md | 7 - vendor/ircmaxell/password-compat/README.md | 75 - .../password-compat/lib/password.php | 222 -- vendor/mrclay/minify/HISTORY.txt | 141 -- vendor/mrclay/minify/LICENSE.txt | 26 - vendor/mrclay/minify/MIN.txt | 181 -- vendor/mrclay/minify/README.txt | 68 - vendor/mrclay/minify/UPGRADING.txt | 28 - vendor/mrclay/minify/min/lib/CSSmin.php | 779 ------ .../mrclay/minify/min/lib/DooDigestAuth.php | 121 - vendor/mrclay/minify/min/lib/FirePHP.php | 1370 ----------- .../minify/min/lib/HTTP/ConditionalGet.php | 366 --- vendor/mrclay/minify/min/lib/HTTP/Encoder.php | 335 --- vendor/mrclay/minify/min/lib/JSMin.php | 449 ---- vendor/mrclay/minify/min/lib/JSMinPlus.php | 2086 ----------------- vendor/mrclay/minify/min/lib/Minify.php | 608 ----- vendor/mrclay/minify/min/lib/Minify/Build.php | 101 - vendor/mrclay/minify/min/lib/Minify/CSS.php | 99 - .../minify/min/lib/Minify/CSS/Compressor.php | 249 -- .../minify/min/lib/Minify/CSS/UriRewriter.php | 307 --- .../mrclay/minify/min/lib/Minify/CSSmin.php | 85 - .../minify/min/lib/Minify/Cache/APC.php | 133 -- .../minify/min/lib/Minify/Cache/File.php | 197 -- .../minify/min/lib/Minify/Cache/Memcache.php | 140 -- .../minify/min/lib/Minify/Cache/XCache.php | 126 - .../min/lib/Minify/Cache/ZendPlatform.php | 142 -- .../minify/min/lib/Minify/ClosureCompiler.php | 139 -- .../min/lib/Minify/CommentPreserver.php | 89 - .../minify/min/lib/Minify/Controller/Base.php | 222 -- .../min/lib/Minify/Controller/Files.php | 76 - .../min/lib/Minify/Controller/Groups.php | 91 - .../min/lib/Minify/Controller/MinApp.php | 238 -- .../minify/min/lib/Minify/Controller/Page.php | 68 - .../min/lib/Minify/Controller/Version1.php | 119 - .../minify/min/lib/Minify/DebugDetector.php | 26 - vendor/mrclay/minify/min/lib/Minify/HTML.php | 255 -- .../minify/min/lib/Minify/HTML/Helper.php | 225 -- .../minify/min/lib/Minify/ImportProcessor.php | 216 -- .../min/lib/Minify/JS/ClosureCompiler.php | 230 -- vendor/mrclay/minify/min/lib/Minify/Lines.php | 143 -- .../mrclay/minify/min/lib/Minify/Loader.php | 28 - .../mrclay/minify/min/lib/Minify/Logger.php | 47 - .../mrclay/minify/min/lib/Minify/Packer.php | 37 - .../mrclay/minify/min/lib/Minify/Source.php | 187 -- .../min/lib/Minify/YUI/CssCompressor.java | 382 --- .../min/lib/Minify/YUI/CssCompressor.php | 171 -- .../minify/min/lib/Minify/YUICompressor.php | 156 -- vendor/mrclay/minify/min/lib/MrClay/Cli.php | 384 --- .../mrclay/minify/min/lib/MrClay/Cli/Arg.php | 183 -- vendor/pimple/pimple/CHANGELOG | 25 - vendor/pimple/pimple/LICENSE | 19 - vendor/pimple/pimple/README.rst | 200 -- vendor/pimple/pimple/src/Pimple/Container.php | 281 --- .../src/Pimple/ServiceProviderInterface.php | 46 - .../Symfony/Component/Console/Application.php | 1158 --------- .../Symfony/Component/Console/CHANGELOG.md | 56 - .../Component/Console/Command/Command.php | 652 ------ .../Component/Console/Command/HelpCommand.php | 91 - .../Component/Console/Command/ListCommand.php | 95 - .../Component/Console/ConsoleEvents.php | 55 - .../Descriptor/ApplicationDescription.php | 153 -- .../Console/Descriptor/Descriptor.php | 119 - .../Descriptor/DescriptorInterface.php | 31 - .../Console/Descriptor/JsonDescriptor.php | 165 -- .../Console/Descriptor/MarkdownDescriptor.php | 139 -- .../Console/Descriptor/TextDescriptor.php | 229 -- .../Console/Descriptor/XmlDescriptor.php | 264 --- .../Console/Event/ConsoleCommandEvent.php | 21 - .../Component/Console/Event/ConsoleEvent.php | 67 - .../Console/Event/ConsoleExceptionEvent.php | 67 - .../Console/Event/ConsoleTerminateEvent.php | 58 - .../Console/Formatter/OutputFormatter.php | 236 -- .../Formatter/OutputFormatterInterface.php | 83 - .../Formatter/OutputFormatterStyle.php | 228 -- .../OutputFormatterStyleInterface.php | 72 - .../Formatter/OutputFormatterStyleStack.php | 121 - .../Console/Helper/DescriptorHelper.php | 96 - .../Component/Console/Helper/DialogHelper.php | 476 ---- .../Console/Helper/FormatterHelper.php | 80 - .../Component/Console/Helper/Helper.php | 121 - .../Console/Helper/HelperInterface.php | 49 - .../Component/Console/Helper/HelperSet.php | 108 - .../Console/Helper/InputAwareHelper.php | 33 - .../Component/Console/Helper/ProgressBar.php | 559 ----- .../Console/Helper/ProgressHelper.php | 457 ---- .../Console/Helper/QuestionHelper.php | 411 ---- .../Component/Console/Helper/Table.php | 409 ---- .../Component/Console/Helper/TableHelper.php | 264 --- .../Console/Helper/TableSeparator.php | 21 - .../Component/Console/Helper/TableStyle.php | 251 -- .../Component/Console/Input/ArgvInput.php | 351 --- .../Component/Console/Input/ArrayInput.php | 209 -- .../Symfony/Component/Console/Input/Input.php | 226 -- .../Component/Console/Input/InputArgument.php | 132 -- .../Console/Input/InputAwareInterface.php | 28 - .../Console/Input/InputDefinition.php | 458 ---- .../Console/Input/InputInterface.php | 152 -- .../Component/Console/Input/InputOption.php | 212 -- .../Component/Console/Input/StringInput.php | 83 - .../console/Symfony/Component/Console/LICENSE | 19 - .../Console/Logger/ConsoleLogger.php | 116 - .../Console/Output/BufferedOutput.php | 48 - .../Console/Output/ConsoleOutput.php | 113 - .../Console/Output/ConsoleOutputInterface.php | 35 - .../Component/Console/Output/NullOutput.php | 113 - .../Component/Console/Output/Output.php | 165 -- .../Console/Output/OutputInterface.php | 113 - .../Component/Console/Output/StreamOutput.php | 103 - .../Console/Question/ChoiceQuestion.php | 138 -- .../Console/Question/ConfirmationQuestion.php | 44 - .../Component/Console/Question/Question.php | 238 -- .../Symfony/Component/Console/README.md | 63 - .../Console/Resources/bin/hiddeninput.exe | Bin 9216 -> 0 bytes .../Symfony/Component/Console/Shell.php | 228 -- .../Console/Tester/ApplicationTester.php | 128 - .../Console/Tester/CommandTester.php | 132 -- .../Component/EventDispatcher/CHANGELOG.md | 23 - .../ContainerAwareEventDispatcher.php | 202 -- .../Debug/TraceableEventDispatcher.php | 317 --- .../TraceableEventDispatcherInterface.php | 34 - .../EventDispatcher/Debug/WrappedListener.php | 69 - .../RegisterListenersPass.php | 106 - .../Component/EventDispatcher/Event.php | 129 - .../EventDispatcher/EventDispatcher.php | 185 -- .../EventDispatcherInterface.php | 96 - .../EventSubscriberInterface.php | 50 - .../EventDispatcher/GenericEvent.php | 186 -- .../ImmutableEventDispatcher.php | 92 - .../Symfony/Component/EventDispatcher/LICENSE | 19 - .../Component/EventDispatcher/README.md | 25 - .../yaml/Symfony/Component/Yaml/CHANGELOG.md | 8 - .../yaml/Symfony/Component/Yaml/Dumper.php | 73 - .../yaml/Symfony/Component/Yaml/Escaper.php | 89 - .../Yaml/Exception/DumpException.php | 23 - .../Yaml/Exception/ExceptionInterface.php | 23 - .../Yaml/Exception/ParseException.php | 148 -- .../Yaml/Exception/RuntimeException.php | 23 - .../yaml/Symfony/Component/Yaml/Inline.php | 489 ---- .../yaml/Symfony/Component/Yaml/LICENSE | 19 - .../yaml/Symfony/Component/Yaml/Parser.php | 673 ------ .../yaml/Symfony/Component/Yaml/README.md | 19 - .../yaml/Symfony/Component/Yaml/Unescaper.php | 141 -- .../yaml/Symfony/Component/Yaml/Yaml.php | 100 - vendor/tracy/tracy/license.md | 55 - vendor/tracy/tracy/readme.md | 226 -- vendor/tracy/tracy/src/Tracy/Bar.php | 112 - vendor/tracy/tracy/src/Tracy/BlueScreen.php | 172 -- vendor/tracy/tracy/src/Tracy/Debugger.php | 598 ----- .../tracy/tracy/src/Tracy/DefaultBarPanel.php | 57 - vendor/tracy/tracy/src/Tracy/Dumper.php | 337 --- vendor/tracy/tracy/src/Tracy/FireLogger.php | 181 -- vendor/tracy/tracy/src/Tracy/Helpers.php | 118 - vendor/tracy/tracy/src/Tracy/IBarPanel.php | 33 - vendor/tracy/tracy/src/Tracy/Logger.php | 98 - .../tracy/tracy/src/Tracy/OutputDebugger.php | 72 - .../tracy/tracy/src/Tracy/templates/bar.css | 318 --- .../src/Tracy/templates/bar.dumps.panel.phtml | 47 - .../src/Tracy/templates/bar.dumps.tab.phtml | 18 - .../Tracy/templates/bar.errors.panel.phtml | 26 - .../src/Tracy/templates/bar.errors.tab.phtml | 19 - vendor/tracy/tracy/src/Tracy/templates/bar.js | 293 --- .../src/Tracy/templates/bar.memory.tab.phtml | 15 - .../tracy/tracy/src/Tracy/templates/bar.phtml | 89 - .../src/Tracy/templates/bar.time.tab.phtml | 15 - .../tracy/src/Tracy/templates/bluescreen.css | 293 --- .../src/Tracy/templates/bluescreen.phtml | 401 ---- .../tracy/src/Tracy/templates/dumper.css | 73 - .../tracy/tracy/src/Tracy/templates/dumper.js | 54 - .../tracy/src/Tracy/templates/error.phtml | 36 - .../tracy/tracy/src/Tracy/templates/tracyQ.js | 294 --- vendor/tracy/tracy/src/shortcuts.php | 20 - vendor/tracy/tracy/src/tracy.php | 19 - .../tracy/tools/create-phar/create-phar.php | 26 - .../tracy/tools/open-in-editor/install.cmd | 8 - .../tracy/tools/open-in-editor/open-editor.js | 47 - vendor/twig/twig/CHANGELOG | 684 ------ vendor/twig/twig/LICENSE | 31 - vendor/twig/twig/README.rst | 15 - vendor/twig/twig/lib/Twig/Autoloader.php | 48 - vendor/twig/twig/lib/Twig/Compiler.php | 270 --- .../twig/twig/lib/Twig/CompilerInterface.php | 36 - vendor/twig/twig/lib/Twig/Environment.php | 1254 ---------- vendor/twig/twig/lib/Twig/Error.php | 248 -- vendor/twig/twig/lib/Twig/Error/Loader.php | 31 - vendor/twig/twig/lib/Twig/Error/Runtime.php | 20 - vendor/twig/twig/lib/Twig/Error/Syntax.php | 20 - .../twig/lib/Twig/ExistsLoaderInterface.php | 29 - .../twig/twig/lib/Twig/ExpressionParser.php | 598 ----- vendor/twig/twig/lib/Twig/Extension.php | 93 - vendor/twig/twig/lib/Twig/Extension/Core.php | 1462 ------------ vendor/twig/twig/lib/Twig/Extension/Debug.php | 71 - .../twig/twig/lib/Twig/Extension/Escaper.php | 107 - .../twig/lib/Twig/Extension/Optimizer.php | 35 - .../twig/twig/lib/Twig/Extension/Sandbox.php | 112 - .../twig/twig/lib/Twig/Extension/Staging.php | 113 - .../twig/lib/Twig/Extension/StringLoader.php | 64 - .../twig/twig/lib/Twig/ExtensionInterface.php | 83 - vendor/twig/twig/lib/Twig/Filter.php | 81 - vendor/twig/twig/lib/Twig/Filter/Function.php | 37 - vendor/twig/twig/lib/Twig/Filter/Method.php | 39 - vendor/twig/twig/lib/Twig/Filter/Node.php | 39 - .../twig/lib/Twig/FilterCallableInterface.php | 23 - vendor/twig/twig/lib/Twig/FilterInterface.php | 42 - vendor/twig/twig/lib/Twig/Function.php | 71 - .../twig/twig/lib/Twig/Function/Function.php | 38 - vendor/twig/twig/lib/Twig/Function/Method.php | 40 - vendor/twig/twig/lib/Twig/Function/Node.php | 39 - .../lib/Twig/FunctionCallableInterface.php | 23 - .../twig/twig/lib/Twig/FunctionInterface.php | 39 - vendor/twig/twig/lib/Twig/Lexer.php | 409 ---- vendor/twig/twig/lib/Twig/LexerInterface.php | 32 - vendor/twig/twig/lib/Twig/Loader/Array.php | 95 - vendor/twig/twig/lib/Twig/Loader/Chain.php | 138 -- .../twig/twig/lib/Twig/Loader/Filesystem.php | 236 -- vendor/twig/twig/lib/Twig/Loader/String.php | 59 - vendor/twig/twig/lib/Twig/LoaderInterface.php | 52 - vendor/twig/twig/lib/Twig/Markup.php | 37 - vendor/twig/twig/lib/Twig/Node.php | 226 -- vendor/twig/twig/lib/Twig/Node/AutoEscape.php | 39 - vendor/twig/twig/lib/Twig/Node/Block.php | 44 - .../twig/lib/Twig/Node/BlockReference.php | 37 - vendor/twig/twig/lib/Twig/Node/Body.php | 19 - vendor/twig/twig/lib/Twig/Node/Do.php | 38 - vendor/twig/twig/lib/Twig/Node/Embed.php | 38 - vendor/twig/twig/lib/Twig/Node/Expression.php | 20 - .../twig/lib/Twig/Node/Expression/Array.php | 86 - .../lib/Twig/Node/Expression/AssignName.php | 28 - .../twig/lib/Twig/Node/Expression/Binary.php | 40 - .../lib/Twig/Node/Expression/Binary/Add.php | 18 - .../lib/Twig/Node/Expression/Binary/And.php | 18 - .../Node/Expression/Binary/BitwiseAnd.php | 18 - .../Twig/Node/Expression/Binary/BitwiseOr.php | 18 - .../Node/Expression/Binary/BitwiseXor.php | 18 - .../Twig/Node/Expression/Binary/Concat.php | 18 - .../lib/Twig/Node/Expression/Binary/Div.php | 18 - .../Twig/Node/Expression/Binary/EndsWith.php | 30 - .../lib/Twig/Node/Expression/Binary/Equal.php | 17 - .../Twig/Node/Expression/Binary/FloorDiv.php | 29 - .../Twig/Node/Expression/Binary/Greater.php | 17 - .../Node/Expression/Binary/GreaterEqual.php | 17 - .../lib/Twig/Node/Expression/Binary/In.php | 33 - .../lib/Twig/Node/Expression/Binary/Less.php | 17 - .../Twig/Node/Expression/Binary/LessEqual.php | 17 - .../Twig/Node/Expression/Binary/Matches.php | 28 - .../lib/Twig/Node/Expression/Binary/Mod.php | 18 - .../lib/Twig/Node/Expression/Binary/Mul.php | 18 - .../Twig/Node/Expression/Binary/NotEqual.php | 17 - .../lib/Twig/Node/Expression/Binary/NotIn.php | 33 - .../lib/Twig/Node/Expression/Binary/Or.php | 18 - .../lib/Twig/Node/Expression/Binary/Power.php | 33 - .../lib/Twig/Node/Expression/Binary/Range.php | 33 - .../Node/Expression/Binary/StartsWith.php | 28 - .../lib/Twig/Node/Expression/Binary/Sub.php | 18 - .../Twig/Node/Expression/BlockReference.php | 51 - .../twig/lib/Twig/Node/Expression/Call.php | 176 -- .../lib/Twig/Node/Expression/Conditional.php | 31 - .../lib/Twig/Node/Expression/Constant.php | 23 - .../Node/Expression/ExtensionReference.php | 33 - .../twig/lib/Twig/Node/Expression/Filter.php | 36 - .../Twig/Node/Expression/Filter/Default.php | 43 - .../lib/Twig/Node/Expression/Function.php | 35 - .../twig/lib/Twig/Node/Expression/GetAttr.php | 53 - .../lib/Twig/Node/Expression/MethodCall.php | 41 - .../twig/lib/Twig/Node/Expression/Name.php | 88 - .../twig/lib/Twig/Node/Expression/Parent.php | 47 - .../lib/Twig/Node/Expression/TempName.php | 26 - .../twig/lib/Twig/Node/Expression/Test.php | 32 - .../Twig/Node/Expression/Test/Constant.php | 46 - .../lib/Twig/Node/Expression/Test/Defined.php | 54 - .../Twig/Node/Expression/Test/Divisibleby.php | 33 - .../lib/Twig/Node/Expression/Test/Even.php | 32 - .../lib/Twig/Node/Expression/Test/Null.php | 31 - .../lib/Twig/Node/Expression/Test/Odd.php | 32 - .../lib/Twig/Node/Expression/Test/Sameas.php | 29 - .../twig/lib/Twig/Node/Expression/Unary.php | 30 - .../lib/Twig/Node/Expression/Unary/Neg.php | 18 - .../lib/Twig/Node/Expression/Unary/Not.php | 18 - .../lib/Twig/Node/Expression/Unary/Pos.php | 18 - vendor/twig/twig/lib/Twig/Node/Flush.php | 36 - vendor/twig/twig/lib/Twig/Node/For.php | 112 - vendor/twig/twig/lib/Twig/Node/ForLoop.php | 55 - vendor/twig/twig/lib/Twig/Node/If.php | 66 - vendor/twig/twig/lib/Twig/Node/Import.php | 50 - vendor/twig/twig/lib/Twig/Node/Include.php | 99 - vendor/twig/twig/lib/Twig/Node/Macro.php | 96 - vendor/twig/twig/lib/Twig/Node/Module.php | 383 --- vendor/twig/twig/lib/Twig/Node/Print.php | 39 - vendor/twig/twig/lib/Twig/Node/Sandbox.php | 47 - .../twig/lib/Twig/Node/SandboxedModule.php | 60 - .../twig/lib/Twig/Node/SandboxedPrint.php | 59 - vendor/twig/twig/lib/Twig/Node/Set.php | 101 - vendor/twig/twig/lib/Twig/Node/SetTemp.php | 35 - vendor/twig/twig/lib/Twig/Node/Spaceless.php | 40 - vendor/twig/twig/lib/Twig/Node/Text.php | 39 - vendor/twig/twig/lib/Twig/NodeInterface.php | 31 - .../twig/lib/Twig/NodeOutputInterface.php | 19 - vendor/twig/twig/lib/Twig/NodeTraverser.php | 88 - .../twig/lib/Twig/NodeVisitor/Escaper.php | 167 -- .../twig/lib/Twig/NodeVisitor/Optimizer.php | 246 -- .../lib/Twig/NodeVisitor/SafeAnalysis.php | 139 -- .../twig/lib/Twig/NodeVisitor/Sandbox.php | 92 - .../twig/lib/Twig/NodeVisitorInterface.php | 47 - vendor/twig/twig/lib/Twig/Parser.php | 390 --- vendor/twig/twig/lib/Twig/ParserInterface.php | 31 - .../twig/lib/Twig/Sandbox/SecurityError.php | 19 - .../twig/lib/Twig/Sandbox/SecurityPolicy.php | 119 - .../Twig/Sandbox/SecurityPolicyInterface.php | 24 - vendor/twig/twig/lib/Twig/SimpleFilter.php | 94 - vendor/twig/twig/lib/Twig/SimpleFunction.php | 84 - vendor/twig/twig/lib/Twig/SimpleTest.php | 46 - vendor/twig/twig/lib/Twig/Template.php | 485 ---- .../twig/twig/lib/Twig/TemplateInterface.php | 48 - vendor/twig/twig/lib/Twig/Test.php | 34 - vendor/twig/twig/lib/Twig/Test/Function.php | 35 - .../lib/Twig/Test/IntegrationTestCase.php | 154 -- vendor/twig/twig/lib/Twig/Test/Method.php | 37 - vendor/twig/twig/lib/Twig/Test/Node.php | 37 - .../twig/twig/lib/Twig/Test/NodeTestCase.php | 58 - .../twig/lib/Twig/TestCallableInterface.php | 21 - vendor/twig/twig/lib/Twig/TestInterface.php | 26 - vendor/twig/twig/lib/Twig/Token.php | 216 -- vendor/twig/twig/lib/Twig/TokenParser.php | 33 - .../twig/lib/Twig/TokenParser/AutoEscape.php | 89 - .../twig/twig/lib/Twig/TokenParser/Block.php | 81 - vendor/twig/twig/lib/Twig/TokenParser/Do.php | 42 - .../twig/twig/lib/Twig/TokenParser/Embed.php | 66 - .../twig/lib/Twig/TokenParser/Extends.php | 52 - .../twig/twig/lib/Twig/TokenParser/Filter.php | 61 - .../twig/twig/lib/Twig/TokenParser/Flush.php | 42 - vendor/twig/twig/lib/Twig/TokenParser/For.php | 135 -- .../twig/twig/lib/Twig/TokenParser/From.php | 70 - vendor/twig/twig/lib/Twig/TokenParser/If.php | 94 - .../twig/twig/lib/Twig/TokenParser/Import.php | 49 - .../twig/lib/Twig/TokenParser/Include.php | 75 - .../twig/twig/lib/Twig/TokenParser/Macro.php | 68 - .../twig/lib/Twig/TokenParser/Sandbox.php | 68 - vendor/twig/twig/lib/Twig/TokenParser/Set.php | 83 - .../twig/lib/Twig/TokenParser/Spaceless.php | 59 - vendor/twig/twig/lib/Twig/TokenParser/Use.php | 76 - .../twig/twig/lib/Twig/TokenParserBroker.php | 136 -- .../lib/Twig/TokenParserBrokerInterface.php | 45 - .../twig/lib/Twig/TokenParserInterface.php | 43 - vendor/twig/twig/lib/Twig/TokenStream.php | 156 -- 402 files changed, 55936 deletions(-) delete mode 100644 vendor/autoload.php delete mode 100644 vendor/composer/ClassLoader.php delete mode 100644 vendor/composer/autoload_classmap.php delete mode 100644 vendor/composer/autoload_files.php delete mode 100644 vendor/composer/autoload_namespaces.php delete mode 100644 vendor/composer/autoload_psr4.php delete mode 100644 vendor/composer/autoload_real.php delete mode 100644 vendor/composer/installed.json delete mode 100644 vendor/doctrine/cache/LICENSE delete mode 100644 vendor/doctrine/cache/README.md delete mode 100644 vendor/doctrine/cache/lib/Doctrine/Common/Cache/ApcCache.php delete mode 100644 vendor/doctrine/cache/lib/Doctrine/Common/Cache/ArrayCache.php delete mode 100644 vendor/doctrine/cache/lib/Doctrine/Common/Cache/Cache.php delete mode 100644 vendor/doctrine/cache/lib/Doctrine/Common/Cache/CacheProvider.php delete mode 100644 vendor/doctrine/cache/lib/Doctrine/Common/Cache/CouchbaseCache.php delete mode 100644 vendor/doctrine/cache/lib/Doctrine/Common/Cache/FileCache.php delete mode 100644 vendor/doctrine/cache/lib/Doctrine/Common/Cache/FilesystemCache.php delete mode 100644 vendor/doctrine/cache/lib/Doctrine/Common/Cache/MemcacheCache.php delete mode 100644 vendor/doctrine/cache/lib/Doctrine/Common/Cache/MemcachedCache.php delete mode 100644 vendor/doctrine/cache/lib/Doctrine/Common/Cache/MongoDBCache.php delete mode 100644 vendor/doctrine/cache/lib/Doctrine/Common/Cache/PhpFileCache.php delete mode 100644 vendor/doctrine/cache/lib/Doctrine/Common/Cache/RedisCache.php delete mode 100644 vendor/doctrine/cache/lib/Doctrine/Common/Cache/RiakCache.php delete mode 100644 vendor/doctrine/cache/lib/Doctrine/Common/Cache/Version.php delete mode 100644 vendor/doctrine/cache/lib/Doctrine/Common/Cache/WinCacheCache.php delete mode 100644 vendor/doctrine/cache/lib/Doctrine/Common/Cache/XcacheCache.php delete mode 100644 vendor/doctrine/cache/lib/Doctrine/Common/Cache/ZendDataCache.php delete mode 100644 vendor/donatj/phpuseragentparser/LICENSE.md delete mode 100644 vendor/donatj/phpuseragentparser/README.md delete mode 100644 vendor/donatj/phpuseragentparser/Source/UserAgentParser.php delete mode 100644 vendor/erusev/parsedown-extra/LICENSE.txt delete mode 100644 vendor/erusev/parsedown-extra/ParsedownExtra.php delete mode 100644 vendor/erusev/parsedown-extra/README.md delete mode 100644 vendor/erusev/parsedown/LICENSE.txt delete mode 100755 vendor/erusev/parsedown/Parsedown.php delete mode 100644 vendor/erusev/parsedown/README.md delete mode 100644 vendor/gregwar/cache/Gregwar/Cache/Cache.php delete mode 100644 vendor/gregwar/cache/Gregwar/Cache/GarbageCollect.php delete mode 100644 vendor/gregwar/cache/Gregwar/Cache/LICENSE delete mode 100644 vendor/gregwar/cache/Gregwar/Cache/README.md delete mode 100644 vendor/gregwar/cache/Gregwar/Cache/autoload.php delete mode 100644 vendor/gregwar/image/Gregwar/Image/Adapter/Adapter.php delete mode 100644 vendor/gregwar/image/Gregwar/Image/Adapter/AdapterInterface.php delete mode 100644 vendor/gregwar/image/Gregwar/Image/Adapter/Common.php delete mode 100644 vendor/gregwar/image/Gregwar/Image/Adapter/GD.php delete mode 100644 vendor/gregwar/image/Gregwar/Image/Adapter/Imagick.php delete mode 100644 vendor/gregwar/image/Gregwar/Image/Exceptions/GenerationError.php delete mode 100644 vendor/gregwar/image/Gregwar/Image/GarbageCollect.php delete mode 100644 vendor/gregwar/image/Gregwar/Image/Image.php delete mode 100644 vendor/gregwar/image/Gregwar/Image/ImageColor.php delete mode 100644 vendor/gregwar/image/Gregwar/Image/LICENSE delete mode 100644 vendor/gregwar/image/Gregwar/Image/README.md delete mode 100644 vendor/gregwar/image/Gregwar/Image/Source/Create.php delete mode 100644 vendor/gregwar/image/Gregwar/Image/Source/Data.php delete mode 100644 vendor/gregwar/image/Gregwar/Image/Source/File.php delete mode 100644 vendor/gregwar/image/Gregwar/Image/Source/Resource.php delete mode 100644 vendor/gregwar/image/Gregwar/Image/Source/Source.php delete mode 100644 vendor/gregwar/image/Gregwar/Image/autoload.php delete mode 100644 vendor/gregwar/image/Gregwar/Image/images/error.jpg delete mode 100644 vendor/ircmaxell/password-compat/LICENSE.md delete mode 100644 vendor/ircmaxell/password-compat/README.md delete mode 100644 vendor/ircmaxell/password-compat/lib/password.php delete mode 100644 vendor/mrclay/minify/HISTORY.txt delete mode 100644 vendor/mrclay/minify/LICENSE.txt delete mode 100644 vendor/mrclay/minify/MIN.txt delete mode 100644 vendor/mrclay/minify/README.txt delete mode 100644 vendor/mrclay/minify/UPGRADING.txt delete mode 100644 vendor/mrclay/minify/min/lib/CSSmin.php delete mode 100644 vendor/mrclay/minify/min/lib/DooDigestAuth.php delete mode 100644 vendor/mrclay/minify/min/lib/FirePHP.php delete mode 100644 vendor/mrclay/minify/min/lib/HTTP/ConditionalGet.php delete mode 100644 vendor/mrclay/minify/min/lib/HTTP/Encoder.php delete mode 100644 vendor/mrclay/minify/min/lib/JSMin.php delete mode 100644 vendor/mrclay/minify/min/lib/JSMinPlus.php delete mode 100644 vendor/mrclay/minify/min/lib/Minify.php delete mode 100644 vendor/mrclay/minify/min/lib/Minify/Build.php delete mode 100644 vendor/mrclay/minify/min/lib/Minify/CSS.php delete mode 100644 vendor/mrclay/minify/min/lib/Minify/CSS/Compressor.php delete mode 100644 vendor/mrclay/minify/min/lib/Minify/CSS/UriRewriter.php delete mode 100644 vendor/mrclay/minify/min/lib/Minify/CSSmin.php delete mode 100644 vendor/mrclay/minify/min/lib/Minify/Cache/APC.php delete mode 100644 vendor/mrclay/minify/min/lib/Minify/Cache/File.php delete mode 100644 vendor/mrclay/minify/min/lib/Minify/Cache/Memcache.php delete mode 100644 vendor/mrclay/minify/min/lib/Minify/Cache/XCache.php delete mode 100644 vendor/mrclay/minify/min/lib/Minify/Cache/ZendPlatform.php delete mode 100644 vendor/mrclay/minify/min/lib/Minify/ClosureCompiler.php delete mode 100644 vendor/mrclay/minify/min/lib/Minify/CommentPreserver.php delete mode 100644 vendor/mrclay/minify/min/lib/Minify/Controller/Base.php delete mode 100644 vendor/mrclay/minify/min/lib/Minify/Controller/Files.php delete mode 100644 vendor/mrclay/minify/min/lib/Minify/Controller/Groups.php delete mode 100644 vendor/mrclay/minify/min/lib/Minify/Controller/MinApp.php delete mode 100644 vendor/mrclay/minify/min/lib/Minify/Controller/Page.php delete mode 100644 vendor/mrclay/minify/min/lib/Minify/Controller/Version1.php delete mode 100644 vendor/mrclay/minify/min/lib/Minify/DebugDetector.php delete mode 100644 vendor/mrclay/minify/min/lib/Minify/HTML.php delete mode 100644 vendor/mrclay/minify/min/lib/Minify/HTML/Helper.php delete mode 100644 vendor/mrclay/minify/min/lib/Minify/ImportProcessor.php delete mode 100644 vendor/mrclay/minify/min/lib/Minify/JS/ClosureCompiler.php delete mode 100644 vendor/mrclay/minify/min/lib/Minify/Lines.php delete mode 100644 vendor/mrclay/minify/min/lib/Minify/Loader.php delete mode 100644 vendor/mrclay/minify/min/lib/Minify/Logger.php delete mode 100644 vendor/mrclay/minify/min/lib/Minify/Packer.php delete mode 100644 vendor/mrclay/minify/min/lib/Minify/Source.php delete mode 100644 vendor/mrclay/minify/min/lib/Minify/YUI/CssCompressor.java delete mode 100644 vendor/mrclay/minify/min/lib/Minify/YUI/CssCompressor.php delete mode 100644 vendor/mrclay/minify/min/lib/Minify/YUICompressor.php delete mode 100644 vendor/mrclay/minify/min/lib/MrClay/Cli.php delete mode 100644 vendor/mrclay/minify/min/lib/MrClay/Cli/Arg.php delete mode 100644 vendor/pimple/pimple/CHANGELOG delete mode 100644 vendor/pimple/pimple/LICENSE delete mode 100644 vendor/pimple/pimple/README.rst delete mode 100644 vendor/pimple/pimple/src/Pimple/Container.php delete mode 100644 vendor/pimple/pimple/src/Pimple/ServiceProviderInterface.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Application.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/CHANGELOG.md delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Command/Command.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Command/HelpCommand.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Command/ListCommand.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/ConsoleEvents.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Descriptor/ApplicationDescription.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Descriptor/Descriptor.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Descriptor/DescriptorInterface.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Descriptor/JsonDescriptor.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Descriptor/MarkdownDescriptor.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Descriptor/TextDescriptor.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Descriptor/XmlDescriptor.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Event/ConsoleCommandEvent.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Event/ConsoleEvent.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Event/ConsoleExceptionEvent.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Event/ConsoleTerminateEvent.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Formatter/OutputFormatter.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Formatter/OutputFormatterInterface.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Formatter/OutputFormatterStyle.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Formatter/OutputFormatterStyleInterface.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Formatter/OutputFormatterStyleStack.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Helper/DescriptorHelper.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Helper/DialogHelper.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Helper/FormatterHelper.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Helper/Helper.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Helper/HelperInterface.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Helper/HelperSet.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Helper/InputAwareHelper.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Helper/ProgressBar.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Helper/ProgressHelper.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Helper/QuestionHelper.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Helper/Table.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Helper/TableHelper.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Helper/TableSeparator.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Helper/TableStyle.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Input/ArgvInput.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Input/ArrayInput.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Input/Input.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Input/InputArgument.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Input/InputAwareInterface.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Input/InputDefinition.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Input/InputInterface.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Input/InputOption.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Input/StringInput.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/LICENSE delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Logger/ConsoleLogger.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Output/BufferedOutput.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Output/ConsoleOutput.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Output/ConsoleOutputInterface.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Output/NullOutput.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Output/Output.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Output/OutputInterface.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Output/StreamOutput.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Question/ChoiceQuestion.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Question/ConfirmationQuestion.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Question/Question.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/README.md delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Resources/bin/hiddeninput.exe delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Shell.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Tester/ApplicationTester.php delete mode 100644 vendor/symfony/console/Symfony/Component/Console/Tester/CommandTester.php delete mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/CHANGELOG.md delete mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/ContainerAwareEventDispatcher.php delete mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcher.php delete mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcherInterface.php delete mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Debug/WrappedListener.php delete mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/DependencyInjection/RegisterListenersPass.php delete mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Event.php delete mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcher.php delete mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcherInterface.php delete mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventSubscriberInterface.php delete mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/GenericEvent.php delete mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/ImmutableEventDispatcher.php delete mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/LICENSE delete mode 100644 vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/README.md delete mode 100644 vendor/symfony/yaml/Symfony/Component/Yaml/CHANGELOG.md delete mode 100644 vendor/symfony/yaml/Symfony/Component/Yaml/Dumper.php delete mode 100644 vendor/symfony/yaml/Symfony/Component/Yaml/Escaper.php delete mode 100644 vendor/symfony/yaml/Symfony/Component/Yaml/Exception/DumpException.php delete mode 100644 vendor/symfony/yaml/Symfony/Component/Yaml/Exception/ExceptionInterface.php delete mode 100644 vendor/symfony/yaml/Symfony/Component/Yaml/Exception/ParseException.php delete mode 100644 vendor/symfony/yaml/Symfony/Component/Yaml/Exception/RuntimeException.php delete mode 100644 vendor/symfony/yaml/Symfony/Component/Yaml/Inline.php delete mode 100644 vendor/symfony/yaml/Symfony/Component/Yaml/LICENSE delete mode 100644 vendor/symfony/yaml/Symfony/Component/Yaml/Parser.php delete mode 100644 vendor/symfony/yaml/Symfony/Component/Yaml/README.md delete mode 100644 vendor/symfony/yaml/Symfony/Component/Yaml/Unescaper.php delete mode 100644 vendor/symfony/yaml/Symfony/Component/Yaml/Yaml.php delete mode 100644 vendor/tracy/tracy/license.md delete mode 100644 vendor/tracy/tracy/readme.md delete mode 100644 vendor/tracy/tracy/src/Tracy/Bar.php delete mode 100644 vendor/tracy/tracy/src/Tracy/BlueScreen.php delete mode 100644 vendor/tracy/tracy/src/Tracy/Debugger.php delete mode 100644 vendor/tracy/tracy/src/Tracy/DefaultBarPanel.php delete mode 100644 vendor/tracy/tracy/src/Tracy/Dumper.php delete mode 100644 vendor/tracy/tracy/src/Tracy/FireLogger.php delete mode 100644 vendor/tracy/tracy/src/Tracy/Helpers.php delete mode 100644 vendor/tracy/tracy/src/Tracy/IBarPanel.php delete mode 100644 vendor/tracy/tracy/src/Tracy/Logger.php delete mode 100644 vendor/tracy/tracy/src/Tracy/OutputDebugger.php delete mode 100644 vendor/tracy/tracy/src/Tracy/templates/bar.css delete mode 100644 vendor/tracy/tracy/src/Tracy/templates/bar.dumps.panel.phtml delete mode 100644 vendor/tracy/tracy/src/Tracy/templates/bar.dumps.tab.phtml delete mode 100644 vendor/tracy/tracy/src/Tracy/templates/bar.errors.panel.phtml delete mode 100644 vendor/tracy/tracy/src/Tracy/templates/bar.errors.tab.phtml delete mode 100644 vendor/tracy/tracy/src/Tracy/templates/bar.js delete mode 100644 vendor/tracy/tracy/src/Tracy/templates/bar.memory.tab.phtml delete mode 100644 vendor/tracy/tracy/src/Tracy/templates/bar.phtml delete mode 100644 vendor/tracy/tracy/src/Tracy/templates/bar.time.tab.phtml delete mode 100644 vendor/tracy/tracy/src/Tracy/templates/bluescreen.css delete mode 100644 vendor/tracy/tracy/src/Tracy/templates/bluescreen.phtml delete mode 100644 vendor/tracy/tracy/src/Tracy/templates/dumper.css delete mode 100644 vendor/tracy/tracy/src/Tracy/templates/dumper.js delete mode 100644 vendor/tracy/tracy/src/Tracy/templates/error.phtml delete mode 100644 vendor/tracy/tracy/src/Tracy/templates/tracyQ.js delete mode 100644 vendor/tracy/tracy/src/shortcuts.php delete mode 100644 vendor/tracy/tracy/src/tracy.php delete mode 100644 vendor/tracy/tracy/tools/create-phar/create-phar.php delete mode 100644 vendor/tracy/tracy/tools/open-in-editor/install.cmd delete mode 100644 vendor/tracy/tracy/tools/open-in-editor/open-editor.js delete mode 100644 vendor/twig/twig/CHANGELOG delete mode 100644 vendor/twig/twig/LICENSE delete mode 100644 vendor/twig/twig/README.rst delete mode 100644 vendor/twig/twig/lib/Twig/Autoloader.php delete mode 100644 vendor/twig/twig/lib/Twig/Compiler.php delete mode 100644 vendor/twig/twig/lib/Twig/CompilerInterface.php delete mode 100644 vendor/twig/twig/lib/Twig/Environment.php delete mode 100644 vendor/twig/twig/lib/Twig/Error.php delete mode 100644 vendor/twig/twig/lib/Twig/Error/Loader.php delete mode 100644 vendor/twig/twig/lib/Twig/Error/Runtime.php delete mode 100644 vendor/twig/twig/lib/Twig/Error/Syntax.php delete mode 100644 vendor/twig/twig/lib/Twig/ExistsLoaderInterface.php delete mode 100644 vendor/twig/twig/lib/Twig/ExpressionParser.php delete mode 100644 vendor/twig/twig/lib/Twig/Extension.php delete mode 100644 vendor/twig/twig/lib/Twig/Extension/Core.php delete mode 100644 vendor/twig/twig/lib/Twig/Extension/Debug.php delete mode 100644 vendor/twig/twig/lib/Twig/Extension/Escaper.php delete mode 100644 vendor/twig/twig/lib/Twig/Extension/Optimizer.php delete mode 100644 vendor/twig/twig/lib/Twig/Extension/Sandbox.php delete mode 100644 vendor/twig/twig/lib/Twig/Extension/Staging.php delete mode 100644 vendor/twig/twig/lib/Twig/Extension/StringLoader.php delete mode 100644 vendor/twig/twig/lib/Twig/ExtensionInterface.php delete mode 100644 vendor/twig/twig/lib/Twig/Filter.php delete mode 100644 vendor/twig/twig/lib/Twig/Filter/Function.php delete mode 100644 vendor/twig/twig/lib/Twig/Filter/Method.php delete mode 100644 vendor/twig/twig/lib/Twig/Filter/Node.php delete mode 100644 vendor/twig/twig/lib/Twig/FilterCallableInterface.php delete mode 100644 vendor/twig/twig/lib/Twig/FilterInterface.php delete mode 100644 vendor/twig/twig/lib/Twig/Function.php delete mode 100644 vendor/twig/twig/lib/Twig/Function/Function.php delete mode 100644 vendor/twig/twig/lib/Twig/Function/Method.php delete mode 100644 vendor/twig/twig/lib/Twig/Function/Node.php delete mode 100644 vendor/twig/twig/lib/Twig/FunctionCallableInterface.php delete mode 100644 vendor/twig/twig/lib/Twig/FunctionInterface.php delete mode 100644 vendor/twig/twig/lib/Twig/Lexer.php delete mode 100644 vendor/twig/twig/lib/Twig/LexerInterface.php delete mode 100644 vendor/twig/twig/lib/Twig/Loader/Array.php delete mode 100644 vendor/twig/twig/lib/Twig/Loader/Chain.php delete mode 100644 vendor/twig/twig/lib/Twig/Loader/Filesystem.php delete mode 100644 vendor/twig/twig/lib/Twig/Loader/String.php delete mode 100644 vendor/twig/twig/lib/Twig/LoaderInterface.php delete mode 100644 vendor/twig/twig/lib/Twig/Markup.php delete mode 100644 vendor/twig/twig/lib/Twig/Node.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/AutoEscape.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Block.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/BlockReference.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Body.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Do.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Embed.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Array.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/AssignName.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/Add.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/And.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseAnd.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseOr.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseXor.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/Concat.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/Div.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/EndsWith.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/Equal.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/FloorDiv.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/Greater.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/GreaterEqual.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/In.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/Less.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/LessEqual.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/Matches.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/Mod.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/Mul.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/NotEqual.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/NotIn.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/Or.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/Power.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/Range.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/StartsWith.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Binary/Sub.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/BlockReference.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Call.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Conditional.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Constant.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/ExtensionReference.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Filter.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Filter/Default.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Function.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/GetAttr.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/MethodCall.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Name.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Parent.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/TempName.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Test.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Test/Constant.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Test/Defined.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Test/Divisibleby.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Test/Even.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Test/Null.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Test/Odd.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Test/Sameas.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Unary.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Unary/Neg.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Unary/Not.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Expression/Unary/Pos.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Flush.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/For.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/ForLoop.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/If.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Import.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Include.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Macro.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Module.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Print.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Sandbox.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/SandboxedModule.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/SandboxedPrint.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Set.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/SetTemp.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Spaceless.php delete mode 100644 vendor/twig/twig/lib/Twig/Node/Text.php delete mode 100644 vendor/twig/twig/lib/Twig/NodeInterface.php delete mode 100644 vendor/twig/twig/lib/Twig/NodeOutputInterface.php delete mode 100644 vendor/twig/twig/lib/Twig/NodeTraverser.php delete mode 100644 vendor/twig/twig/lib/Twig/NodeVisitor/Escaper.php delete mode 100644 vendor/twig/twig/lib/Twig/NodeVisitor/Optimizer.php delete mode 100644 vendor/twig/twig/lib/Twig/NodeVisitor/SafeAnalysis.php delete mode 100644 vendor/twig/twig/lib/Twig/NodeVisitor/Sandbox.php delete mode 100644 vendor/twig/twig/lib/Twig/NodeVisitorInterface.php delete mode 100644 vendor/twig/twig/lib/Twig/Parser.php delete mode 100644 vendor/twig/twig/lib/Twig/ParserInterface.php delete mode 100644 vendor/twig/twig/lib/Twig/Sandbox/SecurityError.php delete mode 100644 vendor/twig/twig/lib/Twig/Sandbox/SecurityPolicy.php delete mode 100644 vendor/twig/twig/lib/Twig/Sandbox/SecurityPolicyInterface.php delete mode 100644 vendor/twig/twig/lib/Twig/SimpleFilter.php delete mode 100644 vendor/twig/twig/lib/Twig/SimpleFunction.php delete mode 100644 vendor/twig/twig/lib/Twig/SimpleTest.php delete mode 100644 vendor/twig/twig/lib/Twig/Template.php delete mode 100644 vendor/twig/twig/lib/Twig/TemplateInterface.php delete mode 100644 vendor/twig/twig/lib/Twig/Test.php delete mode 100644 vendor/twig/twig/lib/Twig/Test/Function.php delete mode 100644 vendor/twig/twig/lib/Twig/Test/IntegrationTestCase.php delete mode 100644 vendor/twig/twig/lib/Twig/Test/Method.php delete mode 100644 vendor/twig/twig/lib/Twig/Test/Node.php delete mode 100644 vendor/twig/twig/lib/Twig/Test/NodeTestCase.php delete mode 100644 vendor/twig/twig/lib/Twig/TestCallableInterface.php delete mode 100644 vendor/twig/twig/lib/Twig/TestInterface.php delete mode 100644 vendor/twig/twig/lib/Twig/Token.php delete mode 100644 vendor/twig/twig/lib/Twig/TokenParser.php delete mode 100644 vendor/twig/twig/lib/Twig/TokenParser/AutoEscape.php delete mode 100644 vendor/twig/twig/lib/Twig/TokenParser/Block.php delete mode 100644 vendor/twig/twig/lib/Twig/TokenParser/Do.php delete mode 100644 vendor/twig/twig/lib/Twig/TokenParser/Embed.php delete mode 100644 vendor/twig/twig/lib/Twig/TokenParser/Extends.php delete mode 100644 vendor/twig/twig/lib/Twig/TokenParser/Filter.php delete mode 100644 vendor/twig/twig/lib/Twig/TokenParser/Flush.php delete mode 100644 vendor/twig/twig/lib/Twig/TokenParser/For.php delete mode 100644 vendor/twig/twig/lib/Twig/TokenParser/From.php delete mode 100644 vendor/twig/twig/lib/Twig/TokenParser/If.php delete mode 100644 vendor/twig/twig/lib/Twig/TokenParser/Import.php delete mode 100644 vendor/twig/twig/lib/Twig/TokenParser/Include.php delete mode 100644 vendor/twig/twig/lib/Twig/TokenParser/Macro.php delete mode 100644 vendor/twig/twig/lib/Twig/TokenParser/Sandbox.php delete mode 100644 vendor/twig/twig/lib/Twig/TokenParser/Set.php delete mode 100644 vendor/twig/twig/lib/Twig/TokenParser/Spaceless.php delete mode 100644 vendor/twig/twig/lib/Twig/TokenParser/Use.php delete mode 100644 vendor/twig/twig/lib/Twig/TokenParserBroker.php delete mode 100644 vendor/twig/twig/lib/Twig/TokenParserBrokerInterface.php delete mode 100644 vendor/twig/twig/lib/Twig/TokenParserInterface.php delete mode 100644 vendor/twig/twig/lib/Twig/TokenStream.php diff --git a/vendor/autoload.php b/vendor/autoload.php deleted file mode 100644 index a4ce51c1c..000000000 --- a/vendor/autoload.php +++ /dev/null @@ -1,7 +0,0 @@ - - * Jordi Boggiano - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Composer\Autoload; - -/** - * ClassLoader implements a PSR-0 class loader - * - * See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md - * - * $loader = new \Composer\Autoload\ClassLoader(); - * - * // register classes with namespaces - * $loader->add('Symfony\Component', __DIR__.'/component'); - * $loader->add('Symfony', __DIR__.'/framework'); - * - * // activate the autoloader - * $loader->register(); - * - * // to enable searching the include path (eg. for PEAR packages) - * $loader->setUseIncludePath(true); - * - * In this example, if you try to use a class in the Symfony\Component - * namespace or one of its children (Symfony\Component\Console for instance), - * the autoloader will first look for the class under the component/ - * directory, and it will then fallback to the framework/ directory if not - * found before giving up. - * - * This class is loosely based on the Symfony UniversalClassLoader. - * - * @author Fabien Potencier - * @author Jordi Boggiano - */ -class ClassLoader -{ - // PSR-4 - private $prefixLengthsPsr4 = array(); - private $prefixDirsPsr4 = array(); - private $fallbackDirsPsr4 = array(); - - // PSR-0 - private $prefixesPsr0 = array(); - private $fallbackDirsPsr0 = array(); - - private $useIncludePath = false; - private $classMap = array(); - - public function getPrefixes() - { - return call_user_func_array('array_merge', $this->prefixesPsr0); - } - - public function getPrefixesPsr4() - { - return $this->prefixDirsPsr4; - } - - public function getFallbackDirs() - { - return $this->fallbackDirsPsr0; - } - - public function getFallbackDirsPsr4() - { - return $this->fallbackDirsPsr4; - } - - public function getClassMap() - { - return $this->classMap; - } - - /** - * @param array $classMap Class to filename map - */ - public function addClassMap(array $classMap) - { - if ($this->classMap) { - $this->classMap = array_merge($this->classMap, $classMap); - } else { - $this->classMap = $classMap; - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, either - * appending or prepending to the ones previously set for this prefix. - * - * @param string $prefix The prefix - * @param array|string $paths The PSR-0 root directories - * @param bool $prepend Whether to prepend the directories - */ - public function add($prefix, $paths, $prepend = false) - { - if (!$prefix) { - if ($prepend) { - $this->fallbackDirsPsr0 = array_merge( - (array) $paths, - $this->fallbackDirsPsr0 - ); - } else { - $this->fallbackDirsPsr0 = array_merge( - $this->fallbackDirsPsr0, - (array) $paths - ); - } - - return; - } - - $first = $prefix[0]; - if (!isset($this->prefixesPsr0[$first][$prefix])) { - $this->prefixesPsr0[$first][$prefix] = (array) $paths; - - return; - } - if ($prepend) { - $this->prefixesPsr0[$first][$prefix] = array_merge( - (array) $paths, - $this->prefixesPsr0[$first][$prefix] - ); - } else { - $this->prefixesPsr0[$first][$prefix] = array_merge( - $this->prefixesPsr0[$first][$prefix], - (array) $paths - ); - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, either - * appending or prepending to the ones previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param array|string $paths The PSR-0 base directories - * @param bool $prepend Whether to prepend the directories - * - * @throws \InvalidArgumentException - */ - public function addPsr4($prefix, $paths, $prepend = false) - { - if (!$prefix) { - // Register directories for the root namespace. - if ($prepend) { - $this->fallbackDirsPsr4 = array_merge( - (array) $paths, - $this->fallbackDirsPsr4 - ); - } else { - $this->fallbackDirsPsr4 = array_merge( - $this->fallbackDirsPsr4, - (array) $paths - ); - } - } elseif (!isset($this->prefixDirsPsr4[$prefix])) { - // Register directories for a new namespace. - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; - } elseif ($prepend) { - // Prepend directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - (array) $paths, - $this->prefixDirsPsr4[$prefix] - ); - } else { - // Append directories for an already registered namespace. - $this->prefixDirsPsr4[$prefix] = array_merge( - $this->prefixDirsPsr4[$prefix], - (array) $paths - ); - } - } - - /** - * Registers a set of PSR-0 directories for a given prefix, - * replacing any others previously set for this prefix. - * - * @param string $prefix The prefix - * @param array|string $paths The PSR-0 base directories - */ - public function set($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr0 = (array) $paths; - } else { - $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; - } - } - - /** - * Registers a set of PSR-4 directories for a given namespace, - * replacing any others previously set for this namespace. - * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param array|string $paths The PSR-4 base directories - * - * @throws \InvalidArgumentException - */ - public function setPsr4($prefix, $paths) - { - if (!$prefix) { - $this->fallbackDirsPsr4 = (array) $paths; - } else { - $length = strlen($prefix); - if ('\\' !== $prefix[$length - 1]) { - throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); - } - $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; - $this->prefixDirsPsr4[$prefix] = (array) $paths; - } - } - - /** - * Turns on searching the include path for class files. - * - * @param bool $useIncludePath - */ - public function setUseIncludePath($useIncludePath) - { - $this->useIncludePath = $useIncludePath; - } - - /** - * Can be used to check if the autoloader uses the include path to check - * for classes. - * - * @return bool - */ - public function getUseIncludePath() - { - return $this->useIncludePath; - } - - /** - * Registers this instance as an autoloader. - * - * @param bool $prepend Whether to prepend the autoloader or not - */ - public function register($prepend = false) - { - spl_autoload_register(array($this, 'loadClass'), true, $prepend); - } - - /** - * Unregisters this instance as an autoloader. - */ - public function unregister() - { - spl_autoload_unregister(array($this, 'loadClass')); - } - - /** - * Loads the given class or interface. - * - * @param string $class The name of the class - * @return bool|null True if loaded, null otherwise - */ - public function loadClass($class) - { - if ($file = $this->findFile($class)) { - includeFile($file); - - return true; - } - } - - /** - * Finds the path to the file where the class is defined. - * - * @param string $class The name of the class - * - * @return string|false The path if found, false otherwise - */ - public function findFile($class) - { - // work around for PHP 5.3.0 - 5.3.2 https://bugs.php.net/50731 - if ('\\' == $class[0]) { - $class = substr($class, 1); - } - - // class map lookup - if (isset($this->classMap[$class])) { - return $this->classMap[$class]; - } - - $file = $this->findFileWithExtension($class, '.php'); - - // Search for Hack files if we are running on HHVM - if ($file === null && defined('HHVM_VERSION')) { - $file = $this->findFileWithExtension($class, '.hh'); - } - - if ($file === null) { - // Remember that this class does not exist. - return $this->classMap[$class] = false; - } - - return $file; - } - - private function findFileWithExtension($class, $ext) - { - // PSR-4 lookup - $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; - - $first = $class[0]; - if (isset($this->prefixLengthsPsr4[$first])) { - foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) { - if (0 === strpos($class, $prefix)) { - foreach ($this->prefixDirsPsr4[$prefix] as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) { - return $file; - } - } - } - } - } - - // PSR-4 fallback dirs - foreach ($this->fallbackDirsPsr4 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { - return $file; - } - } - - // PSR-0 lookup - if (false !== $pos = strrpos($class, '\\')) { - // namespaced class name - $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) - . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); - } else { - // PEAR-like class name - $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; - } - - if (isset($this->prefixesPsr0[$first])) { - foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { - if (0 === strpos($class, $prefix)) { - foreach ($dirs as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - } - } - } - - // PSR-0 fallback dirs - foreach ($this->fallbackDirsPsr0 as $dir) { - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { - return $file; - } - } - - // PSR-0 include paths. - if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { - return $file; - } - } -} - -/** - * Scope isolated include. - * - * Prevents access to $this/self from included files. - */ -function includeFile($file) -{ - include $file; -} diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php deleted file mode 100644 index 3c0e85148..000000000 --- a/vendor/composer/autoload_classmap.php +++ /dev/null @@ -1,415 +0,0 @@ - $vendorDir . '/mrclay/minify/min/lib/CSSmin.php', - 'Doctrine\\Common\\Cache\\ApcCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/ApcCache.php', - 'Doctrine\\Common\\Cache\\ArrayCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/ArrayCache.php', - 'Doctrine\\Common\\Cache\\Cache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/Cache.php', - 'Doctrine\\Common\\Cache\\CacheProvider' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/CacheProvider.php', - 'Doctrine\\Common\\Cache\\CouchbaseCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/CouchbaseCache.php', - 'Doctrine\\Common\\Cache\\FileCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/FileCache.php', - 'Doctrine\\Common\\Cache\\FilesystemCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/FilesystemCache.php', - 'Doctrine\\Common\\Cache\\MemcacheCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/MemcacheCache.php', - 'Doctrine\\Common\\Cache\\MemcachedCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/MemcachedCache.php', - 'Doctrine\\Common\\Cache\\MongoDBCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/MongoDBCache.php', - 'Doctrine\\Common\\Cache\\PhpFileCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/PhpFileCache.php', - 'Doctrine\\Common\\Cache\\RedisCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/RedisCache.php', - 'Doctrine\\Common\\Cache\\RiakCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/RiakCache.php', - 'Doctrine\\Common\\Cache\\Version' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/Version.php', - 'Doctrine\\Common\\Cache\\WinCacheCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/WinCacheCache.php', - 'Doctrine\\Common\\Cache\\XcacheCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/XcacheCache.php', - 'Doctrine\\Common\\Cache\\ZendDataCache' => $vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache/ZendDataCache.php', - 'DooDigestAuth' => $vendorDir . '/mrclay/minify/min/lib/DooDigestAuth.php', - 'FirePHP' => $vendorDir . '/mrclay/minify/min/lib/FirePHP.php', - 'Grav\\Common\\Assets' => $baseDir . '/system/src/Grav/Common/Assets.php', - 'Grav\\Common\\Browser' => $baseDir . '/system/src/Grav/Common/Browser.php', - 'Grav\\Common\\Cache' => $baseDir . '/system/src/Grav/Common/Cache.php', - 'Grav\\Common\\Config' => $baseDir . '/system/src/Grav/Common/Config.php', - 'Grav\\Common\\Data\\Blueprint' => $baseDir . '/system/src/Grav/Common/Data/Blueprint.php', - 'Grav\\Common\\Data\\Blueprints' => $baseDir . '/system/src/Grav/Common/Data/Blueprints.php', - 'Grav\\Common\\Data\\Data' => $baseDir . '/system/src/Grav/Common/Data/Data.php', - 'Grav\\Common\\Data\\DataInterface' => $baseDir . '/system/src/Grav/Common/Data/DataInterface.php', - 'Grav\\Common\\Data\\Validation' => $baseDir . '/system/src/Grav/Common/Data/Validation.php', - 'Grav\\Common\\Debugger' => $baseDir . '/system/src/Grav/Common/Debugger.php', - 'Grav\\Common\\Filesystem\\FileInterface' => $baseDir . '/system/src/Grav/Common/Filesystem/FileInterface.php', - 'Grav\\Common\\Filesystem\\File\\Config' => $baseDir . '/system/src/Grav/Common/Filesystem/File/Config.php', - 'Grav\\Common\\Filesystem\\File\\General' => $baseDir . '/system/src/Grav/Common/Filesystem/File/General.php', - 'Grav\\Common\\Filesystem\\File\\Json' => $baseDir . '/system/src/Grav/Common/Filesystem/File/Json.php', - 'Grav\\Common\\Filesystem\\File\\Log' => $baseDir . '/system/src/Grav/Common/Filesystem/File/Log.php', - 'Grav\\Common\\Filesystem\\File\\Markdown' => $baseDir . '/system/src/Grav/Common/Filesystem/File/Markdown.php', - 'Grav\\Common\\Filesystem\\File\\Yaml' => $baseDir . '/system/src/Grav/Common/Filesystem/File/Yaml.php', - 'Grav\\Common\\Filesystem\\Folder' => $baseDir . '/system/src/Grav/Common/Filesystem/Folder.php', - 'Grav\\Common\\Filesystem\\GravRecursiveFilterIterator' => $baseDir . '/system/src/Grav/Common/Filesystem/Folder.php', - 'Grav\\Common\\Getters' => $baseDir . '/system/src/Grav/Common/Getters.php', - 'Grav\\Common\\Grav' => $baseDir . '/system/src/Grav/Common/Grav.php', - 'Grav\\Common\\GravTrait' => $baseDir . '/system/src/Grav/Common/GravTrait.php', - 'Grav\\Common\\Inflector' => $baseDir . '/system/src/Grav/Common/Inflector.php', - 'Grav\\Common\\Iterator' => $baseDir . '/system/src/Grav/Common/Iterator.php', - 'Grav\\Common\\Markdown\\Markdown' => $baseDir . '/system/src/Grav/Common/Markdown/Markdown.php', - 'Grav\\Common\\Markdown\\MarkdownExtra' => $baseDir . '/system/src/Grav/Common/Markdown/MarkdownExtra.php', - 'Grav\\Common\\Markdown\\MarkdownGravLinkTrait' => $baseDir . '/system/src/Grav/Common/Markdown/MarkdownGravLinkTrait.php', - 'Grav\\Common\\Page\\Collection' => $baseDir . '/system/src/Grav/Common/Page/Collection.php', - 'Grav\\Common\\Page\\Media' => $baseDir . '/system/src/Grav/Common/Page/Media.php', - 'Grav\\Common\\Page\\Medium' => $baseDir . '/system/src/Grav/Common/Page/Medium.php', - 'Grav\\Common\\Page\\Page' => $baseDir . '/system/src/Grav/Common/Page/Page.php', - 'Grav\\Common\\Page\\Pages' => $baseDir . '/system/src/Grav/Common/Page/Pages.php', - 'Grav\\Common\\Plugin' => $baseDir . '/system/src/Grav/Common/Plugin.php', - 'Grav\\Common\\Plugins' => $baseDir . '/system/src/Grav/Common/Plugins.php', - 'Grav\\Common\\Registry' => $baseDir . '/system/src/Grav/Common/Registry.php', - 'Grav\\Common\\Service\\StreamsServiceProvider' => $baseDir . '/system/src/Grav/Common/Service/StreamsServiceProvider.php', - 'Grav\\Common\\Session\\Message' => $baseDir . '/system/src/Grav/Common/Session/Message.php', - 'Grav\\Common\\Session\\Session' => $baseDir . '/system/src/Grav/Common/Session/Session.php', - 'Grav\\Common\\Taxonomy' => $baseDir . '/system/src/Grav/Common/Taxonomy.php', - 'Grav\\Common\\Theme' => $baseDir . '/system/src/Grav/Common/Theme.php', - 'Grav\\Common\\Themes' => $baseDir . '/system/src/Grav/Common/Themes.php', - 'Grav\\Common\\Twig' => $baseDir . '/system/src/Grav/Common/Twig.php', - 'Grav\\Common\\TwigExtension' => $baseDir . '/system/src/Grav/Common/TwigExtension.php', - 'Grav\\Common\\Uri' => $baseDir . '/system/src/Grav/Common/Uri.php', - 'Grav\\Common\\User\\Authentication' => $baseDir . '/system/src/Grav/Common/User/Authentication.php', - 'Grav\\Common\\User\\User' => $baseDir . '/system/src/Grav/Common/User/User.php', - 'Grav\\Common\\Utils' => $baseDir . '/system/src/Grav/Common/Utils.php', - 'Grav\\Component\\ArrayTraits\\ArrayAccess' => $baseDir . '/system/src/Grav/Component/ArrayTraits/ArrayAccess.php', - 'Grav\\Component\\ArrayTraits\\Constructor' => $baseDir . '/system/src/Grav/Component/ArrayTraits/Constructor.php', - 'Grav\\Component\\ArrayTraits\\Countable' => $baseDir . '/system/src/Grav/Component/ArrayTraits/Countable.php', - 'Grav\\Component\\ArrayTraits\\Getters' => $baseDir . '/system/src/Grav/Component/ArrayTraits/Getters.php', - 'Grav\\Component\\DI\\Container' => $baseDir . '/system/src/Grav/Component/DI/Container.php', - 'Grav\\Component\\DI\\ServiceProviderInterface' => $baseDir . '/system/src/Grav/Component/DI/ServiceProviderInterface.php', - 'Grav\\Component\\EventDispatcher\\Event' => $baseDir . '/system/src/Grav/Component/EventDispatcher/Event.php', - 'Grav\\Component\\EventDispatcher\\EventDispatcher' => $baseDir . '/system/src/Grav/Component/EventDispatcher/EventDispatcher.php', - 'Grav\\Component\\EventDispatcher\\EventSubscriberInterface' => $baseDir . '/system/src/Grav/Component/EventDispatcher/EventSubscriberInterface.php', - 'Grav\\Component\\Filesystem\\ResourceLocator' => $baseDir . '/system/src/Grav/Component/Filesystem/ResourceLocator.php', - 'Grav\\Component\\Filesystem\\StreamWrapper\\ReadOnlyStream' => $baseDir . '/system/src/Grav/Component/Filesystem/StreamWrapper/ReadOnlyStream.php', - 'Grav\\Component\\Filesystem\\StreamWrapper\\Stream' => $baseDir . '/system/src/Grav/Component/Filesystem/StreamWrapper/Stream.php', - 'Grav\\Component\\Filesystem\\StreamWrapper\\StreamInterface' => $baseDir . '/system/src/Grav/Component/Filesystem/StreamWrapper/StreamInterface.php', - 'Grav\\Console\\BackupCommand' => $baseDir . '/system/src/Grav/Console/BackupCommand.php', - 'Grav\\Console\\CleanCommand' => $baseDir . '/system/src/Grav/Console/CleanCommand.php', - 'Grav\\Console\\ClearCacheCommand' => $baseDir . '/system/src/Grav/Console/ClearCacheCommand.php', - 'Grav\\Console\\InstallCommand' => $baseDir . '/system/src/Grav/Console/InstallCommand.php', - 'Grav\\Console\\NewProjectCommand' => $baseDir . '/system/src/Grav/Console/NewProjectCommand.php', - 'Grav\\Console\\SetupCommand' => $baseDir . '/system/src/Grav/Console/SetupCommand.php', - 'Gregwar\\Cache\\Cache' => $vendorDir . '/gregwar/cache/Gregwar/Cache/Cache.php', - 'Gregwar\\Cache\\GarbageCollect' => $vendorDir . '/gregwar/cache/Gregwar/Cache/GarbageCollect.php', - 'Gregwar\\Image\\Adapter\\Adapter' => $vendorDir . '/gregwar/image/Gregwar/Image/Adapter/Adapter.php', - 'Gregwar\\Image\\Adapter\\AdapterInterface' => $vendorDir . '/gregwar/image/Gregwar/Image/Adapter/AdapterInterface.php', - 'Gregwar\\Image\\Adapter\\Common' => $vendorDir . '/gregwar/image/Gregwar/Image/Adapter/Common.php', - 'Gregwar\\Image\\Adapter\\GD' => $vendorDir . '/gregwar/image/Gregwar/Image/Adapter/GD.php', - 'Gregwar\\Image\\Adapter\\Imagick' => $vendorDir . '/gregwar/image/Gregwar/Image/Adapter/Imagick.php', - 'Gregwar\\Image\\Exceptions\\GenerationError' => $vendorDir . '/gregwar/image/Gregwar/Image/Exceptions/GenerationError.php', - 'Gregwar\\Image\\GarbageCollect' => $vendorDir . '/gregwar/image/Gregwar/Image/GarbageCollect.php', - 'Gregwar\\Image\\Image' => $vendorDir . '/gregwar/image/Gregwar/Image/Image.php', - 'Gregwar\\Image\\ImageColor' => $vendorDir . '/gregwar/image/Gregwar/Image/ImageColor.php', - 'Gregwar\\Image\\Source\\Create' => $vendorDir . '/gregwar/image/Gregwar/Image/Source/Create.php', - 'Gregwar\\Image\\Source\\Data' => $vendorDir . '/gregwar/image/Gregwar/Image/Source/Data.php', - 'Gregwar\\Image\\Source\\File' => $vendorDir . '/gregwar/image/Gregwar/Image/Source/File.php', - 'Gregwar\\Image\\Source\\Resource' => $vendorDir . '/gregwar/image/Gregwar/Image/Source/Resource.php', - 'Gregwar\\Image\\Source\\Source' => $vendorDir . '/gregwar/image/Gregwar/Image/Source/Source.php', - 'HTTP_ConditionalGet' => $vendorDir . '/mrclay/minify/min/lib/HTTP/ConditionalGet.php', - 'HTTP_Encoder' => $vendorDir . '/mrclay/minify/min/lib/HTTP/Encoder.php', - 'JSCompilerContext' => $vendorDir . '/mrclay/minify/min/lib/JSMinPlus.php', - 'JSMin' => $vendorDir . '/mrclay/minify/min/lib/JSMin.php', - 'JSMinPlus' => $vendorDir . '/mrclay/minify/min/lib/JSMinPlus.php', - 'JSMin_UnterminatedCommentException' => $vendorDir . '/mrclay/minify/min/lib/JSMin.php', - 'JSMin_UnterminatedRegExpException' => $vendorDir . '/mrclay/minify/min/lib/JSMin.php', - 'JSMin_UnterminatedStringException' => $vendorDir . '/mrclay/minify/min/lib/JSMin.php', - 'JSNode' => $vendorDir . '/mrclay/minify/min/lib/JSMinPlus.php', - 'JSParser' => $vendorDir . '/mrclay/minify/min/lib/JSMinPlus.php', - 'JSToken' => $vendorDir . '/mrclay/minify/min/lib/JSMinPlus.php', - 'JSTokenizer' => $vendorDir . '/mrclay/minify/min/lib/JSMinPlus.php', - 'Minify' => $vendorDir . '/mrclay/minify/min/lib/Minify.php', - 'Minify_Build' => $vendorDir . '/mrclay/minify/min/lib/Minify/Build.php', - 'Minify_CSS' => $vendorDir . '/mrclay/minify/min/lib/Minify/CSS.php', - 'Minify_CSS_Compressor' => $vendorDir . '/mrclay/minify/min/lib/Minify/CSS/Compressor.php', - 'Minify_CSS_UriRewriter' => $vendorDir . '/mrclay/minify/min/lib/Minify/CSS/UriRewriter.php', - 'Minify_CSSmin' => $vendorDir . '/mrclay/minify/min/lib/Minify/CSSmin.php', - 'Minify_Cache_APC' => $vendorDir . '/mrclay/minify/min/lib/Minify/Cache/APC.php', - 'Minify_Cache_File' => $vendorDir . '/mrclay/minify/min/lib/Minify/Cache/File.php', - 'Minify_Cache_Memcache' => $vendorDir . '/mrclay/minify/min/lib/Minify/Cache/Memcache.php', - 'Minify_Cache_XCache' => $vendorDir . '/mrclay/minify/min/lib/Minify/Cache/XCache.php', - 'Minify_Cache_ZendPlatform' => $vendorDir . '/mrclay/minify/min/lib/Minify/Cache/ZendPlatform.php', - 'Minify_ClosureCompiler' => $vendorDir . '/mrclay/minify/min/lib/Minify/ClosureCompiler.php', - 'Minify_ClosureCompiler_Exception' => $vendorDir . '/mrclay/minify/min/lib/Minify/ClosureCompiler.php', - 'Minify_CommentPreserver' => $vendorDir . '/mrclay/minify/min/lib/Minify/CommentPreserver.php', - 'Minify_Controller_Base' => $vendorDir . '/mrclay/minify/min/lib/Minify/Controller/Base.php', - 'Minify_Controller_Files' => $vendorDir . '/mrclay/minify/min/lib/Minify/Controller/Files.php', - 'Minify_Controller_Groups' => $vendorDir . '/mrclay/minify/min/lib/Minify/Controller/Groups.php', - 'Minify_Controller_MinApp' => $vendorDir . '/mrclay/minify/min/lib/Minify/Controller/MinApp.php', - 'Minify_Controller_Page' => $vendorDir . '/mrclay/minify/min/lib/Minify/Controller/Page.php', - 'Minify_Controller_Version1' => $vendorDir . '/mrclay/minify/min/lib/Minify/Controller/Version1.php', - 'Minify_DebugDetector' => $vendorDir . '/mrclay/minify/min/lib/Minify/DebugDetector.php', - 'Minify_HTML' => $vendorDir . '/mrclay/minify/min/lib/Minify/HTML.php', - 'Minify_HTML_Helper' => $vendorDir . '/mrclay/minify/min/lib/Minify/HTML/Helper.php', - 'Minify_ImportProcessor' => $vendorDir . '/mrclay/minify/min/lib/Minify/ImportProcessor.php', - 'Minify_JS_ClosureCompiler' => $vendorDir . '/mrclay/minify/min/lib/Minify/JS/ClosureCompiler.php', - 'Minify_JS_ClosureCompiler_Exception' => $vendorDir . '/mrclay/minify/min/lib/Minify/JS/ClosureCompiler.php', - 'Minify_Lines' => $vendorDir . '/mrclay/minify/min/lib/Minify/Lines.php', - 'Minify_Loader' => $vendorDir . '/mrclay/minify/min/lib/Minify/Loader.php', - 'Minify_Logger' => $vendorDir . '/mrclay/minify/min/lib/Minify/Logger.php', - 'Minify_Packer' => $vendorDir . '/mrclay/minify/min/lib/Minify/Packer.php', - 'Minify_Source' => $vendorDir . '/mrclay/minify/min/lib/Minify/Source.php', - 'Minify_YUICompressor' => $vendorDir . '/mrclay/minify/min/lib/Minify/YUICompressor.php', - 'Minify_YUI_CssCompressor' => $vendorDir . '/mrclay/minify/min/lib/Minify/YUI/CssCompressor.php', - 'MrClay\\Cli' => $vendorDir . '/mrclay/minify/min/lib/MrClay/Cli.php', - 'MrClay\\Cli\\Arg' => $vendorDir . '/mrclay/minify/min/lib/MrClay/Cli/Arg.php', - 'Parsedown' => $vendorDir . '/erusev/parsedown/Parsedown.php', - 'ParsedownExtra' => $vendorDir . '/erusev/parsedown-extra/ParsedownExtra.php', - 'Pimple\\Container' => $vendorDir . '/pimple/pimple/src/Pimple/Container.php', - 'Pimple\\ServiceProviderInterface' => $vendorDir . '/pimple/pimple/src/Pimple/ServiceProviderInterface.php', - 'Symfony\\Component\\Console\\Application' => $vendorDir . '/symfony/console/Symfony/Component/Console/Application.php', - 'Symfony\\Component\\Console\\Command\\Command' => $vendorDir . '/symfony/console/Symfony/Component/Console/Command/Command.php', - 'Symfony\\Component\\Console\\Command\\HelpCommand' => $vendorDir . '/symfony/console/Symfony/Component/Console/Command/HelpCommand.php', - 'Symfony\\Component\\Console\\Command\\ListCommand' => $vendorDir . '/symfony/console/Symfony/Component/Console/Command/ListCommand.php', - 'Symfony\\Component\\Console\\ConsoleEvents' => $vendorDir . '/symfony/console/Symfony/Component/Console/ConsoleEvents.php', - 'Symfony\\Component\\Console\\Descriptor\\ApplicationDescription' => $vendorDir . '/symfony/console/Symfony/Component/Console/Descriptor/ApplicationDescription.php', - 'Symfony\\Component\\Console\\Descriptor\\Descriptor' => $vendorDir . '/symfony/console/Symfony/Component/Console/Descriptor/Descriptor.php', - 'Symfony\\Component\\Console\\Descriptor\\DescriptorInterface' => $vendorDir . '/symfony/console/Symfony/Component/Console/Descriptor/DescriptorInterface.php', - 'Symfony\\Component\\Console\\Descriptor\\JsonDescriptor' => $vendorDir . '/symfony/console/Symfony/Component/Console/Descriptor/JsonDescriptor.php', - 'Symfony\\Component\\Console\\Descriptor\\MarkdownDescriptor' => $vendorDir . '/symfony/console/Symfony/Component/Console/Descriptor/MarkdownDescriptor.php', - 'Symfony\\Component\\Console\\Descriptor\\TextDescriptor' => $vendorDir . '/symfony/console/Symfony/Component/Console/Descriptor/TextDescriptor.php', - 'Symfony\\Component\\Console\\Descriptor\\XmlDescriptor' => $vendorDir . '/symfony/console/Symfony/Component/Console/Descriptor/XmlDescriptor.php', - 'Symfony\\Component\\Console\\Event\\ConsoleCommandEvent' => $vendorDir . '/symfony/console/Symfony/Component/Console/Event/ConsoleCommandEvent.php', - 'Symfony\\Component\\Console\\Event\\ConsoleEvent' => $vendorDir . '/symfony/console/Symfony/Component/Console/Event/ConsoleEvent.php', - 'Symfony\\Component\\Console\\Event\\ConsoleExceptionEvent' => $vendorDir . '/symfony/console/Symfony/Component/Console/Event/ConsoleExceptionEvent.php', - 'Symfony\\Component\\Console\\Event\\ConsoleTerminateEvent' => $vendorDir . '/symfony/console/Symfony/Component/Console/Event/ConsoleTerminateEvent.php', - 'Symfony\\Component\\Console\\Formatter\\OutputFormatter' => $vendorDir . '/symfony/console/Symfony/Component/Console/Formatter/OutputFormatter.php', - 'Symfony\\Component\\Console\\Formatter\\OutputFormatterInterface' => $vendorDir . '/symfony/console/Symfony/Component/Console/Formatter/OutputFormatterInterface.php', - 'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyle' => $vendorDir . '/symfony/console/Symfony/Component/Console/Formatter/OutputFormatterStyle.php', - 'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleInterface' => $vendorDir . '/symfony/console/Symfony/Component/Console/Formatter/OutputFormatterStyleInterface.php', - 'Symfony\\Component\\Console\\Formatter\\OutputFormatterStyleStack' => $vendorDir . '/symfony/console/Symfony/Component/Console/Formatter/OutputFormatterStyleStack.php', - 'Symfony\\Component\\Console\\Helper\\DescriptorHelper' => $vendorDir . '/symfony/console/Symfony/Component/Console/Helper/DescriptorHelper.php', - 'Symfony\\Component\\Console\\Helper\\DialogHelper' => $vendorDir . '/symfony/console/Symfony/Component/Console/Helper/DialogHelper.php', - 'Symfony\\Component\\Console\\Helper\\FormatterHelper' => $vendorDir . '/symfony/console/Symfony/Component/Console/Helper/FormatterHelper.php', - 'Symfony\\Component\\Console\\Helper\\Helper' => $vendorDir . '/symfony/console/Symfony/Component/Console/Helper/Helper.php', - 'Symfony\\Component\\Console\\Helper\\HelperInterface' => $vendorDir . '/symfony/console/Symfony/Component/Console/Helper/HelperInterface.php', - 'Symfony\\Component\\Console\\Helper\\HelperSet' => $vendorDir . '/symfony/console/Symfony/Component/Console/Helper/HelperSet.php', - 'Symfony\\Component\\Console\\Helper\\InputAwareHelper' => $vendorDir . '/symfony/console/Symfony/Component/Console/Helper/InputAwareHelper.php', - 'Symfony\\Component\\Console\\Helper\\ProgressBar' => $vendorDir . '/symfony/console/Symfony/Component/Console/Helper/ProgressBar.php', - 'Symfony\\Component\\Console\\Helper\\ProgressHelper' => $vendorDir . '/symfony/console/Symfony/Component/Console/Helper/ProgressHelper.php', - 'Symfony\\Component\\Console\\Helper\\QuestionHelper' => $vendorDir . '/symfony/console/Symfony/Component/Console/Helper/QuestionHelper.php', - 'Symfony\\Component\\Console\\Helper\\Table' => $vendorDir . '/symfony/console/Symfony/Component/Console/Helper/Table.php', - 'Symfony\\Component\\Console\\Helper\\TableHelper' => $vendorDir . '/symfony/console/Symfony/Component/Console/Helper/TableHelper.php', - 'Symfony\\Component\\Console\\Helper\\TableSeparator' => $vendorDir . '/symfony/console/Symfony/Component/Console/Helper/TableSeparator.php', - 'Symfony\\Component\\Console\\Helper\\TableStyle' => $vendorDir . '/symfony/console/Symfony/Component/Console/Helper/TableStyle.php', - 'Symfony\\Component\\Console\\Input\\ArgvInput' => $vendorDir . '/symfony/console/Symfony/Component/Console/Input/ArgvInput.php', - 'Symfony\\Component\\Console\\Input\\ArrayInput' => $vendorDir . '/symfony/console/Symfony/Component/Console/Input/ArrayInput.php', - 'Symfony\\Component\\Console\\Input\\Input' => $vendorDir . '/symfony/console/Symfony/Component/Console/Input/Input.php', - 'Symfony\\Component\\Console\\Input\\InputArgument' => $vendorDir . '/symfony/console/Symfony/Component/Console/Input/InputArgument.php', - 'Symfony\\Component\\Console\\Input\\InputAwareInterface' => $vendorDir . '/symfony/console/Symfony/Component/Console/Input/InputAwareInterface.php', - 'Symfony\\Component\\Console\\Input\\InputDefinition' => $vendorDir . '/symfony/console/Symfony/Component/Console/Input/InputDefinition.php', - 'Symfony\\Component\\Console\\Input\\InputInterface' => $vendorDir . '/symfony/console/Symfony/Component/Console/Input/InputInterface.php', - 'Symfony\\Component\\Console\\Input\\InputOption' => $vendorDir . '/symfony/console/Symfony/Component/Console/Input/InputOption.php', - 'Symfony\\Component\\Console\\Input\\StringInput' => $vendorDir . '/symfony/console/Symfony/Component/Console/Input/StringInput.php', - 'Symfony\\Component\\Console\\Logger\\ConsoleLogger' => $vendorDir . '/symfony/console/Symfony/Component/Console/Logger/ConsoleLogger.php', - 'Symfony\\Component\\Console\\Output\\BufferedOutput' => $vendorDir . '/symfony/console/Symfony/Component/Console/Output/BufferedOutput.php', - 'Symfony\\Component\\Console\\Output\\ConsoleOutput' => $vendorDir . '/symfony/console/Symfony/Component/Console/Output/ConsoleOutput.php', - 'Symfony\\Component\\Console\\Output\\ConsoleOutputInterface' => $vendorDir . '/symfony/console/Symfony/Component/Console/Output/ConsoleOutputInterface.php', - 'Symfony\\Component\\Console\\Output\\NullOutput' => $vendorDir . '/symfony/console/Symfony/Component/Console/Output/NullOutput.php', - 'Symfony\\Component\\Console\\Output\\Output' => $vendorDir . '/symfony/console/Symfony/Component/Console/Output/Output.php', - 'Symfony\\Component\\Console\\Output\\OutputInterface' => $vendorDir . '/symfony/console/Symfony/Component/Console/Output/OutputInterface.php', - 'Symfony\\Component\\Console\\Output\\StreamOutput' => $vendorDir . '/symfony/console/Symfony/Component/Console/Output/StreamOutput.php', - 'Symfony\\Component\\Console\\Question\\ChoiceQuestion' => $vendorDir . '/symfony/console/Symfony/Component/Console/Question/ChoiceQuestion.php', - 'Symfony\\Component\\Console\\Question\\ConfirmationQuestion' => $vendorDir . '/symfony/console/Symfony/Component/Console/Question/ConfirmationQuestion.php', - 'Symfony\\Component\\Console\\Question\\Question' => $vendorDir . '/symfony/console/Symfony/Component/Console/Question/Question.php', - 'Symfony\\Component\\Console\\Shell' => $vendorDir . '/symfony/console/Symfony/Component/Console/Shell.php', - 'Symfony\\Component\\Console\\Tester\\ApplicationTester' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tester/ApplicationTester.php', - 'Symfony\\Component\\Console\\Tester\\CommandTester' => $vendorDir . '/symfony/console/Symfony/Component/Console/Tester/CommandTester.php', - 'Symfony\\Component\\EventDispatcher\\ContainerAwareEventDispatcher' => $vendorDir . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/ContainerAwareEventDispatcher.php', - 'Symfony\\Component\\EventDispatcher\\Debug\\TraceableEventDispatcher' => $vendorDir . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcher.php', - 'Symfony\\Component\\EventDispatcher\\Debug\\TraceableEventDispatcherInterface' => $vendorDir . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcherInterface.php', - 'Symfony\\Component\\EventDispatcher\\Debug\\WrappedListener' => $vendorDir . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Debug/WrappedListener.php', - 'Symfony\\Component\\EventDispatcher\\DependencyInjection\\RegisterListenersPass' => $vendorDir . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/DependencyInjection/RegisterListenersPass.php', - 'Symfony\\Component\\EventDispatcher\\Event' => $vendorDir . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Event.php', - 'Symfony\\Component\\EventDispatcher\\EventDispatcher' => $vendorDir . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcher.php', - 'Symfony\\Component\\EventDispatcher\\EventDispatcherInterface' => $vendorDir . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcherInterface.php', - 'Symfony\\Component\\EventDispatcher\\EventSubscriberInterface' => $vendorDir . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventSubscriberInterface.php', - 'Symfony\\Component\\EventDispatcher\\GenericEvent' => $vendorDir . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/GenericEvent.php', - 'Symfony\\Component\\EventDispatcher\\ImmutableEventDispatcher' => $vendorDir . '/symfony/event-dispatcher/Symfony/Component/EventDispatcher/ImmutableEventDispatcher.php', - 'Symfony\\Component\\Yaml\\Dumper' => $vendorDir . '/symfony/yaml/Symfony/Component/Yaml/Dumper.php', - 'Symfony\\Component\\Yaml\\Escaper' => $vendorDir . '/symfony/yaml/Symfony/Component/Yaml/Escaper.php', - 'Symfony\\Component\\Yaml\\Exception\\DumpException' => $vendorDir . '/symfony/yaml/Symfony/Component/Yaml/Exception/DumpException.php', - 'Symfony\\Component\\Yaml\\Exception\\ExceptionInterface' => $vendorDir . '/symfony/yaml/Symfony/Component/Yaml/Exception/ExceptionInterface.php', - 'Symfony\\Component\\Yaml\\Exception\\ParseException' => $vendorDir . '/symfony/yaml/Symfony/Component/Yaml/Exception/ParseException.php', - 'Symfony\\Component\\Yaml\\Exception\\RuntimeException' => $vendorDir . '/symfony/yaml/Symfony/Component/Yaml/Exception/RuntimeException.php', - 'Symfony\\Component\\Yaml\\Inline' => $vendorDir . '/symfony/yaml/Symfony/Component/Yaml/Inline.php', - 'Symfony\\Component\\Yaml\\Parser' => $vendorDir . '/symfony/yaml/Symfony/Component/Yaml/Parser.php', - 'Symfony\\Component\\Yaml\\Unescaper' => $vendorDir . '/symfony/yaml/Symfony/Component/Yaml/Unescaper.php', - 'Symfony\\Component\\Yaml\\Yaml' => $vendorDir . '/symfony/yaml/Symfony/Component/Yaml/Yaml.php', - 'Tracy\\Bar' => $vendorDir . '/tracy/tracy/src/Tracy/Bar.php', - 'Tracy\\BlueScreen' => $vendorDir . '/tracy/tracy/src/Tracy/BlueScreen.php', - 'Tracy\\Debugger' => $vendorDir . '/tracy/tracy/src/Tracy/Debugger.php', - 'Tracy\\DefaultBarPanel' => $vendorDir . '/tracy/tracy/src/Tracy/DefaultBarPanel.php', - 'Tracy\\Dumper' => $vendorDir . '/tracy/tracy/src/Tracy/Dumper.php', - 'Tracy\\FireLogger' => $vendorDir . '/tracy/tracy/src/Tracy/FireLogger.php', - 'Tracy\\Helpers' => $vendorDir . '/tracy/tracy/src/Tracy/Helpers.php', - 'Tracy\\IBarPanel' => $vendorDir . '/tracy/tracy/src/Tracy/IBarPanel.php', - 'Tracy\\Logger' => $vendorDir . '/tracy/tracy/src/Tracy/Logger.php', - 'Tracy\\OutputDebugger' => $vendorDir . '/tracy/tracy/src/Tracy/OutputDebugger.php', - 'Twig_Autoloader' => $vendorDir . '/twig/twig/lib/Twig/Autoloader.php', - 'Twig_Compiler' => $vendorDir . '/twig/twig/lib/Twig/Compiler.php', - 'Twig_CompilerInterface' => $vendorDir . '/twig/twig/lib/Twig/CompilerInterface.php', - 'Twig_Environment' => $vendorDir . '/twig/twig/lib/Twig/Environment.php', - 'Twig_Error' => $vendorDir . '/twig/twig/lib/Twig/Error.php', - 'Twig_Error_Loader' => $vendorDir . '/twig/twig/lib/Twig/Error/Loader.php', - 'Twig_Error_Runtime' => $vendorDir . '/twig/twig/lib/Twig/Error/Runtime.php', - 'Twig_Error_Syntax' => $vendorDir . '/twig/twig/lib/Twig/Error/Syntax.php', - 'Twig_ExistsLoaderInterface' => $vendorDir . '/twig/twig/lib/Twig/ExistsLoaderInterface.php', - 'Twig_ExpressionParser' => $vendorDir . '/twig/twig/lib/Twig/ExpressionParser.php', - 'Twig_Extension' => $vendorDir . '/twig/twig/lib/Twig/Extension.php', - 'Twig_ExtensionInterface' => $vendorDir . '/twig/twig/lib/Twig/ExtensionInterface.php', - 'Twig_Extension_Core' => $vendorDir . '/twig/twig/lib/Twig/Extension/Core.php', - 'Twig_Extension_Debug' => $vendorDir . '/twig/twig/lib/Twig/Extension/Debug.php', - 'Twig_Extension_Escaper' => $vendorDir . '/twig/twig/lib/Twig/Extension/Escaper.php', - 'Twig_Extension_Optimizer' => $vendorDir . '/twig/twig/lib/Twig/Extension/Optimizer.php', - 'Twig_Extension_Sandbox' => $vendorDir . '/twig/twig/lib/Twig/Extension/Sandbox.php', - 'Twig_Extension_Staging' => $vendorDir . '/twig/twig/lib/Twig/Extension/Staging.php', - 'Twig_Extension_StringLoader' => $vendorDir . '/twig/twig/lib/Twig/Extension/StringLoader.php', - 'Twig_Filter' => $vendorDir . '/twig/twig/lib/Twig/Filter.php', - 'Twig_FilterCallableInterface' => $vendorDir . '/twig/twig/lib/Twig/FilterCallableInterface.php', - 'Twig_FilterInterface' => $vendorDir . '/twig/twig/lib/Twig/FilterInterface.php', - 'Twig_Filter_Function' => $vendorDir . '/twig/twig/lib/Twig/Filter/Function.php', - 'Twig_Filter_Method' => $vendorDir . '/twig/twig/lib/Twig/Filter/Method.php', - 'Twig_Filter_Node' => $vendorDir . '/twig/twig/lib/Twig/Filter/Node.php', - 'Twig_Function' => $vendorDir . '/twig/twig/lib/Twig/Function.php', - 'Twig_FunctionCallableInterface' => $vendorDir . '/twig/twig/lib/Twig/FunctionCallableInterface.php', - 'Twig_FunctionInterface' => $vendorDir . '/twig/twig/lib/Twig/FunctionInterface.php', - 'Twig_Function_Function' => $vendorDir . '/twig/twig/lib/Twig/Function/Function.php', - 'Twig_Function_Method' => $vendorDir . '/twig/twig/lib/Twig/Function/Method.php', - 'Twig_Function_Node' => $vendorDir . '/twig/twig/lib/Twig/Function/Node.php', - 'Twig_Lexer' => $vendorDir . '/twig/twig/lib/Twig/Lexer.php', - 'Twig_LexerInterface' => $vendorDir . '/twig/twig/lib/Twig/LexerInterface.php', - 'Twig_LoaderInterface' => $vendorDir . '/twig/twig/lib/Twig/LoaderInterface.php', - 'Twig_Loader_Array' => $vendorDir . '/twig/twig/lib/Twig/Loader/Array.php', - 'Twig_Loader_Chain' => $vendorDir . '/twig/twig/lib/Twig/Loader/Chain.php', - 'Twig_Loader_Filesystem' => $vendorDir . '/twig/twig/lib/Twig/Loader/Filesystem.php', - 'Twig_Loader_String' => $vendorDir . '/twig/twig/lib/Twig/Loader/String.php', - 'Twig_Markup' => $vendorDir . '/twig/twig/lib/Twig/Markup.php', - 'Twig_Node' => $vendorDir . '/twig/twig/lib/Twig/Node.php', - 'Twig_NodeInterface' => $vendorDir . '/twig/twig/lib/Twig/NodeInterface.php', - 'Twig_NodeOutputInterface' => $vendorDir . '/twig/twig/lib/Twig/NodeOutputInterface.php', - 'Twig_NodeTraverser' => $vendorDir . '/twig/twig/lib/Twig/NodeTraverser.php', - 'Twig_NodeVisitorInterface' => $vendorDir . '/twig/twig/lib/Twig/NodeVisitorInterface.php', - 'Twig_NodeVisitor_Escaper' => $vendorDir . '/twig/twig/lib/Twig/NodeVisitor/Escaper.php', - 'Twig_NodeVisitor_Optimizer' => $vendorDir . '/twig/twig/lib/Twig/NodeVisitor/Optimizer.php', - 'Twig_NodeVisitor_SafeAnalysis' => $vendorDir . '/twig/twig/lib/Twig/NodeVisitor/SafeAnalysis.php', - 'Twig_NodeVisitor_Sandbox' => $vendorDir . '/twig/twig/lib/Twig/NodeVisitor/Sandbox.php', - 'Twig_Node_AutoEscape' => $vendorDir . '/twig/twig/lib/Twig/Node/AutoEscape.php', - 'Twig_Node_Block' => $vendorDir . '/twig/twig/lib/Twig/Node/Block.php', - 'Twig_Node_BlockReference' => $vendorDir . '/twig/twig/lib/Twig/Node/BlockReference.php', - 'Twig_Node_Body' => $vendorDir . '/twig/twig/lib/Twig/Node/Body.php', - 'Twig_Node_Do' => $vendorDir . '/twig/twig/lib/Twig/Node/Do.php', - 'Twig_Node_Embed' => $vendorDir . '/twig/twig/lib/Twig/Node/Embed.php', - 'Twig_Node_Expression' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression.php', - 'Twig_Node_Expression_Array' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Array.php', - 'Twig_Node_Expression_AssignName' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/AssignName.php', - 'Twig_Node_Expression_Binary' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary.php', - 'Twig_Node_Expression_Binary_Add' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Add.php', - 'Twig_Node_Expression_Binary_And' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/And.php', - 'Twig_Node_Expression_Binary_BitwiseAnd' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseAnd.php', - 'Twig_Node_Expression_Binary_BitwiseOr' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseOr.php', - 'Twig_Node_Expression_Binary_BitwiseXor' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseXor.php', - 'Twig_Node_Expression_Binary_Concat' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Concat.php', - 'Twig_Node_Expression_Binary_Div' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Div.php', - 'Twig_Node_Expression_Binary_EndsWith' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/EndsWith.php', - 'Twig_Node_Expression_Binary_Equal' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Equal.php', - 'Twig_Node_Expression_Binary_FloorDiv' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/FloorDiv.php', - 'Twig_Node_Expression_Binary_Greater' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Greater.php', - 'Twig_Node_Expression_Binary_GreaterEqual' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/GreaterEqual.php', - 'Twig_Node_Expression_Binary_In' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/In.php', - 'Twig_Node_Expression_Binary_Less' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Less.php', - 'Twig_Node_Expression_Binary_LessEqual' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/LessEqual.php', - 'Twig_Node_Expression_Binary_Matches' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Matches.php', - 'Twig_Node_Expression_Binary_Mod' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Mod.php', - 'Twig_Node_Expression_Binary_Mul' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Mul.php', - 'Twig_Node_Expression_Binary_NotEqual' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/NotEqual.php', - 'Twig_Node_Expression_Binary_NotIn' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/NotIn.php', - 'Twig_Node_Expression_Binary_Or' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Or.php', - 'Twig_Node_Expression_Binary_Power' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Power.php', - 'Twig_Node_Expression_Binary_Range' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Range.php', - 'Twig_Node_Expression_Binary_StartsWith' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/StartsWith.php', - 'Twig_Node_Expression_Binary_Sub' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Binary/Sub.php', - 'Twig_Node_Expression_BlockReference' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/BlockReference.php', - 'Twig_Node_Expression_Call' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Call.php', - 'Twig_Node_Expression_Conditional' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Conditional.php', - 'Twig_Node_Expression_Constant' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Constant.php', - 'Twig_Node_Expression_ExtensionReference' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/ExtensionReference.php', - 'Twig_Node_Expression_Filter' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Filter.php', - 'Twig_Node_Expression_Filter_Default' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Filter/Default.php', - 'Twig_Node_Expression_Function' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Function.php', - 'Twig_Node_Expression_GetAttr' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/GetAttr.php', - 'Twig_Node_Expression_MethodCall' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/MethodCall.php', - 'Twig_Node_Expression_Name' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Name.php', - 'Twig_Node_Expression_Parent' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Parent.php', - 'Twig_Node_Expression_TempName' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/TempName.php', - 'Twig_Node_Expression_Test' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test.php', - 'Twig_Node_Expression_Test_Constant' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test/Constant.php', - 'Twig_Node_Expression_Test_Defined' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test/Defined.php', - 'Twig_Node_Expression_Test_Divisibleby' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test/Divisibleby.php', - 'Twig_Node_Expression_Test_Even' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test/Even.php', - 'Twig_Node_Expression_Test_Null' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test/Null.php', - 'Twig_Node_Expression_Test_Odd' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test/Odd.php', - 'Twig_Node_Expression_Test_Sameas' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Test/Sameas.php', - 'Twig_Node_Expression_Unary' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Unary.php', - 'Twig_Node_Expression_Unary_Neg' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Unary/Neg.php', - 'Twig_Node_Expression_Unary_Not' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Unary/Not.php', - 'Twig_Node_Expression_Unary_Pos' => $vendorDir . '/twig/twig/lib/Twig/Node/Expression/Unary/Pos.php', - 'Twig_Node_Flush' => $vendorDir . '/twig/twig/lib/Twig/Node/Flush.php', - 'Twig_Node_For' => $vendorDir . '/twig/twig/lib/Twig/Node/For.php', - 'Twig_Node_ForLoop' => $vendorDir . '/twig/twig/lib/Twig/Node/ForLoop.php', - 'Twig_Node_If' => $vendorDir . '/twig/twig/lib/Twig/Node/If.php', - 'Twig_Node_Import' => $vendorDir . '/twig/twig/lib/Twig/Node/Import.php', - 'Twig_Node_Include' => $vendorDir . '/twig/twig/lib/Twig/Node/Include.php', - 'Twig_Node_Macro' => $vendorDir . '/twig/twig/lib/Twig/Node/Macro.php', - 'Twig_Node_Module' => $vendorDir . '/twig/twig/lib/Twig/Node/Module.php', - 'Twig_Node_Print' => $vendorDir . '/twig/twig/lib/Twig/Node/Print.php', - 'Twig_Node_Sandbox' => $vendorDir . '/twig/twig/lib/Twig/Node/Sandbox.php', - 'Twig_Node_SandboxedModule' => $vendorDir . '/twig/twig/lib/Twig/Node/SandboxedModule.php', - 'Twig_Node_SandboxedPrint' => $vendorDir . '/twig/twig/lib/Twig/Node/SandboxedPrint.php', - 'Twig_Node_Set' => $vendorDir . '/twig/twig/lib/Twig/Node/Set.php', - 'Twig_Node_SetTemp' => $vendorDir . '/twig/twig/lib/Twig/Node/SetTemp.php', - 'Twig_Node_Spaceless' => $vendorDir . '/twig/twig/lib/Twig/Node/Spaceless.php', - 'Twig_Node_Text' => $vendorDir . '/twig/twig/lib/Twig/Node/Text.php', - 'Twig_Parser' => $vendorDir . '/twig/twig/lib/Twig/Parser.php', - 'Twig_ParserInterface' => $vendorDir . '/twig/twig/lib/Twig/ParserInterface.php', - 'Twig_Sandbox_SecurityError' => $vendorDir . '/twig/twig/lib/Twig/Sandbox/SecurityError.php', - 'Twig_Sandbox_SecurityPolicy' => $vendorDir . '/twig/twig/lib/Twig/Sandbox/SecurityPolicy.php', - 'Twig_Sandbox_SecurityPolicyInterface' => $vendorDir . '/twig/twig/lib/Twig/Sandbox/SecurityPolicyInterface.php', - 'Twig_SimpleFilter' => $vendorDir . '/twig/twig/lib/Twig/SimpleFilter.php', - 'Twig_SimpleFunction' => $vendorDir . '/twig/twig/lib/Twig/SimpleFunction.php', - 'Twig_Template' => $vendorDir . '/twig/twig/lib/Twig/Template.php', - 'Twig_TemplateInterface' => $vendorDir . '/twig/twig/lib/Twig/TemplateInterface.php', - 'Twig_Test' => $vendorDir . '/twig/twig/lib/Twig/Test.php', - 'Twig_TestCallableInterface' => $vendorDir . '/twig/twig/lib/Twig/TestCallableInterface.php', - 'Twig_TestInterface' => $vendorDir . '/twig/twig/lib/Twig/TestInterface.php', - 'Twig_Test_Function' => $vendorDir . '/twig/twig/lib/Twig/Test/Function.php', - 'Twig_Test_IntegrationTestCase' => $vendorDir . '/twig/twig/lib/Twig/Test/IntegrationTestCase.php', - 'Twig_Test_Method' => $vendorDir . '/twig/twig/lib/Twig/Test/Method.php', - 'Twig_Test_Node' => $vendorDir . '/twig/twig/lib/Twig/Test/Node.php', - 'Twig_Test_NodeTestCase' => $vendorDir . '/twig/twig/lib/Twig/Test/NodeTestCase.php', - 'Twig_Token' => $vendorDir . '/twig/twig/lib/Twig/Token.php', - 'Twig_TokenParser' => $vendorDir . '/twig/twig/lib/Twig/TokenParser.php', - 'Twig_TokenParserBroker' => $vendorDir . '/twig/twig/lib/Twig/TokenParserBroker.php', - 'Twig_TokenParserBrokerInterface' => $vendorDir . '/twig/twig/lib/Twig/TokenParserBrokerInterface.php', - 'Twig_TokenParserInterface' => $vendorDir . '/twig/twig/lib/Twig/TokenParserInterface.php', - 'Twig_TokenParser_AutoEscape' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/AutoEscape.php', - 'Twig_TokenParser_Block' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Block.php', - 'Twig_TokenParser_Do' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Do.php', - 'Twig_TokenParser_Embed' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Embed.php', - 'Twig_TokenParser_Extends' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Extends.php', - 'Twig_TokenParser_Filter' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Filter.php', - 'Twig_TokenParser_Flush' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Flush.php', - 'Twig_TokenParser_For' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/For.php', - 'Twig_TokenParser_From' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/From.php', - 'Twig_TokenParser_If' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/If.php', - 'Twig_TokenParser_Import' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Import.php', - 'Twig_TokenParser_Include' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Include.php', - 'Twig_TokenParser_Macro' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Macro.php', - 'Twig_TokenParser_Sandbox' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Sandbox.php', - 'Twig_TokenParser_Set' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Set.php', - 'Twig_TokenParser_Spaceless' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Spaceless.php', - 'Twig_TokenParser_Use' => $vendorDir . '/twig/twig/lib/Twig/TokenParser/Use.php', - 'Twig_TokenStream' => $vendorDir . '/twig/twig/lib/Twig/TokenStream.php', -); diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php deleted file mode 100644 index 7ee214947..000000000 --- a/vendor/composer/autoload_files.php +++ /dev/null @@ -1,13 +0,0 @@ - array($vendorDir . '/twig/twig/lib'), - 'Symfony\\Component\\Yaml\\' => array($vendorDir . '/symfony/yaml'), - 'Symfony\\Component\\EventDispatcher\\' => array($vendorDir . '/symfony/event-dispatcher'), - 'Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'), - 'Pimple' => array($vendorDir . '/pimple/pimple/src'), - 'ParsedownExtra' => array($vendorDir . '/erusev/parsedown-extra'), - 'Parsedown' => array($vendorDir . '/erusev/parsedown'), - 'Gregwar\\Image' => array($vendorDir . '/gregwar/image'), - 'Gregwar\\Cache' => array($vendorDir . '/gregwar/cache'), - 'Doctrine\\Common\\Cache\\' => array($vendorDir . '/doctrine/cache/lib'), -); diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php deleted file mode 100644 index 687a12874..000000000 --- a/vendor/composer/autoload_psr4.php +++ /dev/null @@ -1,10 +0,0 @@ - array($baseDir . '/system/src'), -); diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php deleted file mode 100644 index b808f53c6..000000000 --- a/vendor/composer/autoload_real.php +++ /dev/null @@ -1,55 +0,0 @@ - $path) { - $loader->set($namespace, $path); - } - - $map = require __DIR__ . '/autoload_psr4.php'; - foreach ($map as $namespace => $path) { - $loader->setPsr4($namespace, $path); - } - - $classMap = require __DIR__ . '/autoload_classmap.php'; - if ($classMap) { - $loader->addClassMap($classMap); - } - - $loader->register(true); - - $includeFiles = require __DIR__ . '/autoload_files.php'; - foreach ($includeFiles as $file) { - composerRequire836e000af2692cba78dada56c083fe42($file); - } - - return $loader; - } -} - -function composerRequire836e000af2692cba78dada56c083fe42($file) -{ - require $file; -} diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json deleted file mode 100644 index f11d29f8d..000000000 --- a/vendor/composer/installed.json +++ /dev/null @@ -1,719 +0,0 @@ -[ - { - "name": "erusev/parsedown", - "version": "1.0.1", - "version_normalized": "1.0.1.0", - "source": { - "type": "git", - "url": "https://github.com/erusev/parsedown.git", - "reference": "d24439ada0704948deef0d3eda2ea20fd8db1747" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/erusev/parsedown/zipball/d24439ada0704948deef0d3eda2ea20fd8db1747", - "reference": "d24439ada0704948deef0d3eda2ea20fd8db1747", - "shasum": "" - }, - "time": "2014-05-21 20:20:46", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-0": { - "Parsedown": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Emanuil Rusev", - "email": "hello@erusev.com", - "homepage": "http://erusev.com" - } - ], - "description": "Parser for Markdown.", - "homepage": "http://parsedown.org", - "keywords": [ - "markdown", - "parser" - ] - }, - { - "name": "doctrine/cache", - "version": "v1.3.0", - "version_normalized": "1.3.0.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/cache.git", - "reference": "e16d7adf45664a50fa86f515b6d5e7f670130449" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/e16d7adf45664a50fa86f515b6d5e7f670130449", - "reference": "e16d7adf45664a50fa86f515b6d5e7f670130449", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "conflict": { - "doctrine/common": ">2.2,<2.4" - }, - "require-dev": { - "phpunit/phpunit": ">=3.7", - "satooshi/php-coveralls": "~0.6" - }, - "time": "2013-10-25 19:04:14", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-0": { - "Doctrine\\Common\\Cache\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jonathan Wage", - "email": "jonwage@gmail.com", - "homepage": "http://www.jwage.com/", - "role": "Creator" - }, - { - "name": "Guilherme Blanco", - "email": "guilhermeblanco@gmail.com", - "homepage": "http://www.instaclick.com" - }, - { - "name": "Roman Borschel", - "email": "roman@code-factory.org" - }, - { - "name": "Benjamin Eberlei", - "email": "kontakt@beberlei.de" - }, - { - "name": "Johannes Schmitt", - "email": "schmittjoh@gmail.com", - "homepage": "https://github.com/schmittjoh", - "role": "Developer of wrapped JMSSerializerBundle" - } - ], - "description": "Caching library offering an object-oriented API for many cache backends", - "homepage": "http://www.doctrine-project.org", - "keywords": [ - "cache", - "caching" - ] - }, - { - "name": "pimple/pimple", - "version": "v3.0.0", - "version_normalized": "3.0.0.0", - "source": { - "type": "git", - "url": "https://github.com/fabpot/Pimple.git", - "reference": "876bf0899d01feacd2a2e83f04641e51350099ef" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/fabpot/Pimple/zipball/876bf0899d01feacd2a2e83f04641e51350099ef", - "reference": "876bf0899d01feacd2a2e83f04641e51350099ef", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "time": "2014-07-24 09:48:15", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.0.x-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-0": { - "Pimple": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Pimple is a simple Dependency Injection Container for PHP 5.3", - "homepage": "http://pimple.sensiolabs.org", - "keywords": [ - "container", - "dependency injection" - ] - }, - { - "name": "symfony/yaml", - "version": "v2.5.3", - "version_normalized": "2.5.3.0", - "target-dir": "Symfony/Component/Yaml", - "source": { - "type": "git", - "url": "https://github.com/symfony/Yaml.git", - "reference": "5a75366ae9ca8b4792cd0083e4ca4dff9fe96f1f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Yaml/zipball/5a75366ae9ca8b4792cd0083e4ca4dff9fe96f1f", - "reference": "5a75366ae9ca8b4792cd0083e4ca4dff9fe96f1f", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "time": "2014-08-05 09:00:40", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.5-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-0": { - "Symfony\\Component\\Yaml\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Symfony Yaml Component", - "homepage": "http://symfony.com" - }, - { - "name": "symfony/console", - "version": "v2.5.3", - "version_normalized": "2.5.3.0", - "target-dir": "Symfony/Component/Console", - "source": { - "type": "git", - "url": "https://github.com/symfony/Console.git", - "reference": "cd2d1e4bac2206b337326b0140ff475fe9ad5f63" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/Console/zipball/cd2d1e4bac2206b337326b0140ff475fe9ad5f63", - "reference": "cd2d1e4bac2206b337326b0140ff475fe9ad5f63", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/event-dispatcher": "~2.1" - }, - "suggest": { - "psr/log": "For using the console logger", - "symfony/event-dispatcher": "" - }, - "time": "2014-08-05 09:00:40", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.5-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-0": { - "Symfony\\Component\\Console\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Symfony Console Component", - "homepage": "http://symfony.com" - }, - { - "name": "symfony/event-dispatcher", - "version": "v2.5.3", - "version_normalized": "2.5.3.0", - "target-dir": "Symfony/Component/EventDispatcher", - "source": { - "type": "git", - "url": "https://github.com/symfony/EventDispatcher.git", - "reference": "8faf5cc7e80fde74a650a36e60d32ce3c3e0457b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/8faf5cc7e80fde74a650a36e60d32ce3c3e0457b", - "reference": "8faf5cc7e80fde74a650a36e60d32ce3c3e0457b", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "psr/log": "~1.0", - "symfony/config": "~2.0", - "symfony/dependency-injection": "~2.0", - "symfony/stopwatch": "~2.2" - }, - "suggest": { - "symfony/dependency-injection": "", - "symfony/http-kernel": "" - }, - "time": "2014-07-28 13:20:46", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.5-dev" - } - }, - "installation-source": "dist", - "autoload": { - "psr-0": { - "Symfony\\Component\\EventDispatcher\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Symfony EventDispatcher Component", - "homepage": "http://symfony.com" - }, - { - "name": "gregwar/cache", - "version": "v1.0.7", - "version_normalized": "1.0.7.0", - "target-dir": "Gregwar/Cache", - "source": { - "type": "git", - "url": "https://github.com/Gregwar/Cache.git", - "reference": "b2d0197c07cc1ccf7436e1ae7bf64f9948e02052" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Gregwar/Cache/zipball/b2d0197c07cc1ccf7436e1ae7bf64f9948e02052", - "reference": "b2d0197c07cc1ccf7436e1ae7bf64f9948e02052", - "shasum": "" - }, - "time": "2014-02-20 20:04:58", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-0": { - "Gregwar\\Cache": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Grégoire Passault", - "email": "g.passault@gmail.com", - "homepage": "http://www.gregwar.com/" - } - ], - "description": "A lightweight file-system cache system", - "keywords": [ - "cache", - "caching", - "file-system", - "system" - ] - }, - { - "name": "gregwar/image", - "version": "v2.0.17", - "version_normalized": "2.0.17.0", - "target-dir": "Gregwar/Image", - "source": { - "type": "git", - "url": "https://github.com/Gregwar/Image.git", - "reference": "a7bba10ed0e3004c098bb7fde3a3e5bcafca8a2c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Gregwar/Image/zipball/a7bba10ed0e3004c098bb7fde3a3e5bcafca8a2c", - "reference": "a7bba10ed0e3004c098bb7fde3a3e5bcafca8a2c", - "shasum": "" - }, - "require": { - "ext-gd": "*", - "gregwar/cache": "v1.0.7", - "php": ">=5.3.0" - }, - "time": "2014-02-20 22:20:45", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-0": { - "Gregwar\\Image": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Grégoire Passault", - "email": "g.passault@gmail.com", - "homepage": "http://www.gregwar.com/" - } - ], - "description": "Image handling", - "homepage": "https://github.com/Gregwar/Image", - "keywords": [ - "gd", - "image" - ] - }, - { - "name": "ircmaxell/password-compat", - "version": "1.0.3", - "version_normalized": "1.0.3.0", - "source": { - "type": "git", - "url": "https://github.com/ircmaxell/password_compat.git", - "reference": "1fc1521b5e9794ea77e4eca30717be9635f1d4f4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/ircmaxell/password_compat/zipball/1fc1521b5e9794ea77e4eca30717be9635f1d4f4", - "reference": "1fc1521b5e9794ea77e4eca30717be9635f1d4f4", - "shasum": "" - }, - "time": "2013-04-30 19:58:08", - "type": "library", - "installation-source": "dist", - "autoload": { - "files": [ - "lib/password.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Anthony Ferrara", - "email": "ircmaxell@ircmaxell.com", - "homepage": "http://blog.ircmaxell.com" - } - ], - "description": "A compatibility library for the proposed simplified password hashing algorithm: https://wiki.php.net/rfc/password_hash", - "homepage": "https://github.com/ircmaxell/password_compat", - "keywords": [ - "hashing", - "password" - ] - }, - { - "name": "twig/twig", - "version": "v1.16.0", - "version_normalized": "1.16.0.0", - "source": { - "type": "git", - "url": "https://github.com/fabpot/Twig.git", - "reference": "8ce37115802e257a984a82d38254884085060024" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/fabpot/Twig/zipball/8ce37115802e257a984a82d38254884085060024", - "reference": "8ce37115802e257a984a82d38254884085060024", - "shasum": "" - }, - "require": { - "php": ">=5.2.4" - }, - "time": "2014-07-05 12:19:05", - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.16-dev" - } - }, - "installation-source": "source", - "autoload": { - "psr-0": { - "Twig_": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com", - "homepage": "http://fabien.potencier.org", - "role": "Lead Developer" - }, - { - "name": "Armin Ronacher", - "email": "armin.ronacher@active-4.com", - "role": "Project Founder" - }, - { - "name": "Twig Team", - "homepage": "https://github.com/fabpot/Twig/graphs/contributors", - "role": "Contributors" - } - ], - "description": "Twig, the flexible, fast, and secure template language for PHP", - "homepage": "http://twig.sensiolabs.org", - "keywords": [ - "templating" - ] - }, - { - "name": "donatj/phpuseragentparser", - "version": "dev-master", - "version_normalized": "9999999-dev", - "source": { - "type": "git", - "url": "https://github.com/donatj/PhpUserAgent.git", - "reference": "abbd69a119f067e4afc3c4baf28d04646114a668" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/donatj/PhpUserAgent/zipball/abbd69a119f067e4afc3c4baf28d04646114a668", - "reference": "abbd69a119f067e4afc3c4baf28d04646114a668", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "camspiers/json-pretty": "0.1.*" - }, - "time": "2014-08-06 03:39:39", - "type": "library", - "installation-source": "source", - "autoload": { - "files": [ - "Source/UserAgentParser.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jesse G. Donat", - "email": "donatj@gmail.com", - "homepage": "http://donatstudios.com", - "role": "Developer" - } - ], - "description": "Simple, streamlined PHP user-agent parser", - "homepage": "http://donatstudios.com/PHP-Parser-HTTP_USER_AGENT", - "keywords": [ - "parser", - "user agent", - "useragent" - ] - }, - { - "name": "tracy/tracy", - "version": "v2.2.3", - "version_normalized": "2.2.3.0", - "source": { - "type": "git", - "url": "https://github.com/nette/tracy.git", - "reference": "97889d2b8cfb7607cc370ca0ddb97c6f5b43deb9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nette/tracy/zipball/97889d2b8cfb7607cc370ca0ddb97c6f5b43deb9", - "reference": "97889d2b8cfb7607cc370ca0ddb97c6f5b43deb9", - "shasum": "" - }, - "require": { - "php": ">=5.3.1" - }, - "require-dev": { - "nette/tester": "~1.0" - }, - "time": "2014-08-24 23:36:30", - "type": "library", - "installation-source": "dist", - "autoload": { - "classmap": [ - "src/Tracy" - ], - "files": [ - "src/shortcuts.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause", - "GPL-2.0", - "GPL-3.0" - ], - "authors": [ - { - "name": "David Grudl", - "homepage": "http://davidgrudl.com" - }, - { - "name": "Nette Community", - "homepage": "http://nette.org/contributors" - } - ], - "description": "Tracy: useful PHP debugger", - "homepage": "http://tracy.nette.org", - "keywords": [ - "debug", - "debugger", - "nette" - ] - }, - { - "name": "erusev/parsedown-extra", - "version": "dev-master", - "version_normalized": "9999999-dev", - "source": { - "type": "git", - "url": "https://github.com/erusev/parsedown-extra.git", - "reference": "424e63fef5299f2a5a0464cd22a666b7a7b48657" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/erusev/parsedown-extra/zipball/424e63fef5299f2a5a0464cd22a666b7a7b48657", - "reference": "424e63fef5299f2a5a0464cd22a666b7a7b48657", - "shasum": "" - }, - "require": { - "erusev/parsedown": "~1.0" - }, - "time": "2014-08-25 10:49:57", - "type": "library", - "installation-source": "source", - "autoload": { - "psr-0": { - "ParsedownExtra": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Emanuil Rusev", - "email": "hello@erusev.com", - "homepage": "http://erusev.com" - } - ], - "description": "An extension of Parsedown that adds support for Markdown Extra.", - "homepage": "https://github.com/erusev/parsedown-extra", - "keywords": [ - "markdown", - "markdown extra", - "parsedown", - "parser" - ] - }, - { - "name": "mrclay/minify", - "version": "dev-master", - "version_normalized": "9999999-dev", - "source": { - "type": "git", - "url": "https://github.com/rhukster/minify.git", - "reference": "fdf68abf30ccd86a65f66fa6eb98434eb29bef74" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/rhukster/minify/zipball/fdf68abf30ccd86a65f66fa6eb98434eb29bef74", - "reference": "fdf68abf30ccd86a65f66fa6eb98434eb29bef74", - "shasum": "" - }, - "require": { - "ext-pcre": "*", - "php": ">=5.2.1" - }, - "time": "2014-08-29 23:07:55", - "type": "library", - "installation-source": "source", - "autoload": { - "classmap": [ - "min/lib/" - ] - }, - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Stephen Clay", - "email": "steve@mrclay.org", - "role": "Developer" - } - ], - "description": "Minify is a PHP5 app that helps you follow several rules for client-side performance. It combines multiple CSS or Javascript files, removes unnecessary whitespace and comments, and serves them with gzip encoding and optimal client-side cache headers", - "homepage": "http://code.google.com/p/minify/", - "support": { - "email": "minify@googlegroups.com", - "issues": "http://code.google.com/p/minify/issues/list", - "wiki": "http://code.google.com/p/minify/w/list", - "source": "https://github.com/rhukster/minify/tree/master" - } - } -] diff --git a/vendor/doctrine/cache/LICENSE b/vendor/doctrine/cache/LICENSE deleted file mode 100644 index 4a91f0bf2..000000000 --- a/vendor/doctrine/cache/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2006-2012 Doctrine Project - -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/vendor/doctrine/cache/README.md b/vendor/doctrine/cache/README.md deleted file mode 100644 index 94f80a30e..000000000 --- a/vendor/doctrine/cache/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# Doctrine Cache - -Master: [![Build Status](https://secure.travis-ci.org/doctrine/cache.png?branch=master)](http://travis-ci.org/doctrine/cache) [![Coverage Status](https://coveralls.io/repos/doctrine/cache/badge.png?branch=master)](https://coveralls.io/r/doctrine/cache?branch=master) - -[![Latest Stable Version](https://poser.pugx.org/doctrine/cache/v/stable.png)](https://packagist.org/packages/doctrine/cache) [![Total Downloads](https://poser.pugx.org/doctrine/cache/downloads.png)](https://packagist.org/packages/doctrine/cache) - -Cache component extracted from the Doctrine Common project. - -## Changelog - -### v1.2 - -* Added support for MongoDB as Cache Provider -* Fix namespace version reset diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ApcCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ApcCache.php deleted file mode 100644 index 1f19db675..000000000 --- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ApcCache.php +++ /dev/null @@ -1,98 +0,0 @@ -. - */ - -namespace Doctrine\Common\Cache; - -/** - * APC cache provider. - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author David Abdemoulaie - */ -class ApcCache extends CacheProvider -{ - /** - * {@inheritdoc} - */ - protected function doFetch($id) - { - return apc_fetch($id); - } - - /** - * {@inheritdoc} - */ - protected function doContains($id) - { - return apc_exists($id); - } - - /** - * {@inheritdoc} - */ - protected function doSave($id, $data, $lifeTime = 0) - { - return (bool) apc_store($id, $data, (int) $lifeTime); - } - - /** - * {@inheritdoc} - */ - protected function doDelete($id) - { - return apc_delete($id); - } - - /** - * {@inheritdoc} - */ - protected function doFlush() - { - return apc_clear_cache() && apc_clear_cache('user'); - } - - /** - * {@inheritdoc} - */ - protected function doGetStats() - { - $info = apc_cache_info(); - $sma = apc_sma_info(); - - // @TODO - Temporary fix @see https://github.com/krakjoe/apcu/pull/42 - if (PHP_VERSION_ID >= 50500) { - $info['num_hits'] = isset($info['num_hits']) ? $info['num_hits'] : $info['nhits']; - $info['num_misses'] = isset($info['num_misses']) ? $info['num_misses'] : $info['nmisses']; - $info['start_time'] = isset($info['start_time']) ? $info['start_time'] : $info['stime']; - } - - return array( - Cache::STATS_HITS => $info['num_hits'], - Cache::STATS_MISSES => $info['num_misses'], - Cache::STATS_UPTIME => $info['start_time'], - Cache::STATS_MEMORY_USAGE => $info['mem_size'], - Cache::STATS_MEMORY_AVAILABLE => $sma['avail_mem'], - ); - } -} diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ArrayCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ArrayCache.php deleted file mode 100644 index e9f08a24b..000000000 --- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ArrayCache.php +++ /dev/null @@ -1,93 +0,0 @@ -. - */ - -namespace Doctrine\Common\Cache; - -/** - * Array cache driver. - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author David Abdemoulaie - */ -class ArrayCache extends CacheProvider -{ - /** - * @var array $data - */ - private $data = array(); - - /** - * {@inheritdoc} - */ - protected function doFetch($id) - { - return (isset($this->data[$id])) ? $this->data[$id] : false; - } - - /** - * {@inheritdoc} - */ - protected function doContains($id) - { - return isset($this->data[$id]); - } - - /** - * {@inheritdoc} - */ - protected function doSave($id, $data, $lifeTime = 0) - { - $this->data[$id] = $data; - - return true; - } - - /** - * {@inheritdoc} - */ - protected function doDelete($id) - { - unset($this->data[$id]); - - return true; - } - - /** - * {@inheritdoc} - */ - protected function doFlush() - { - $this->data = array(); - - return true; - } - - /** - * {@inheritdoc} - */ - protected function doGetStats() - { - return null; - } -} diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/Cache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/Cache.php deleted file mode 100644 index 0785f263b..000000000 --- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/Cache.php +++ /dev/null @@ -1,111 +0,0 @@ -. - */ - -namespace Doctrine\Common\Cache; - -/** - * Interface for cache drivers. - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Fabio B. Silva - */ -interface Cache -{ - const STATS_HITS = 'hits'; - const STATS_MISSES = 'misses'; - const STATS_UPTIME = 'uptime'; - const STATS_MEMORY_USAGE = 'memory_usage'; - const STATS_MEMORY_AVAILABLE = 'memory_available'; - /** - * Only for backward compatibility (may be removed in next major release) - * - * @deprecated - */ - const STATS_MEMORY_AVAILIABLE = 'memory_available'; - - /** - * Fetches an entry from the cache. - * - * @param string $id The id of the cache entry to fetch. - * - * @return mixed The cached data or FALSE, if no cache entry exists for the given id. - */ - function fetch($id); - - /** - * Tests if an entry exists in the cache. - * - * @param string $id The cache id of the entry to check for. - * - * @return boolean TRUE if a cache entry exists for the given cache id, FALSE otherwise. - */ - function contains($id); - - /** - * Puts data into the cache. - * - * @param string $id The cache id. - * @param mixed $data The cache entry/data. - * @param int $lifeTime The cache lifetime. - * If != 0, sets a specific lifetime for this cache entry (0 => infinite lifeTime). - * - * @return boolean TRUE if the entry was successfully stored in the cache, FALSE otherwise. - */ - function save($id, $data, $lifeTime = 0); - - /** - * Deletes a cache entry. - * - * @param string $id The cache id. - * - * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise. - */ - function delete($id); - - /** - * Retrieves cached information from the data store. - * - * The server's statistics array has the following values: - * - * - hits - * Number of keys that have been requested and found present. - * - * - misses - * Number of items that have been requested and not found. - * - * - uptime - * Time that the server is running. - * - * - memory_usage - * Memory used by this server to store items. - * - * - memory_available - * Memory allowed to use for storage. - * - * @since 2.2 - * - * @return array|null An associative array with server's statistics if available, NULL otherwise. - */ - function getStats(); -} diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/CacheProvider.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/CacheProvider.php deleted file mode 100644 index ce88e4922..000000000 --- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/CacheProvider.php +++ /dev/null @@ -1,241 +0,0 @@ -. - */ - -namespace Doctrine\Common\Cache; - -/** - * Base class for cache provider implementations. - * - * @since 2.2 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Fabio B. Silva - */ -abstract class CacheProvider implements Cache -{ - const DOCTRINE_NAMESPACE_CACHEKEY = 'DoctrineNamespaceCacheKey[%s]'; - - /** - * The namespace to prefix all cache ids with. - * - * @var string - */ - private $namespace = ''; - - /** - * The namespace version. - * - * @var string - */ - private $namespaceVersion; - - /** - * Sets the namespace to prefix all cache ids with. - * - * @param string $namespace - * - * @return void - */ - public function setNamespace($namespace) - { - $this->namespace = (string) $namespace; - $this->namespaceVersion = null; - } - - /** - * Retrieves the namespace that prefixes all cache ids. - * - * @return string - */ - public function getNamespace() - { - return $this->namespace; - } - - /** - * {@inheritdoc} - */ - public function fetch($id) - { - return $this->doFetch($this->getNamespacedId($id)); - } - - /** - * {@inheritdoc} - */ - public function contains($id) - { - return $this->doContains($this->getNamespacedId($id)); - } - - /** - * {@inheritdoc} - */ - public function save($id, $data, $lifeTime = 0) - { - return $this->doSave($this->getNamespacedId($id), $data, $lifeTime); - } - - /** - * {@inheritdoc} - */ - public function delete($id) - { - return $this->doDelete($this->getNamespacedId($id)); - } - - /** - * {@inheritdoc} - */ - public function getStats() - { - return $this->doGetStats(); - } - - /** - * Flushes all cache entries. - * - * @return boolean TRUE if the cache entries were successfully flushed, FALSE otherwise. - */ - public function flushAll() - { - return $this->doFlush(); - } - - /** - * Deletes all cache entries. - * - * @return boolean TRUE if the cache entries were successfully deleted, FALSE otherwise. - */ - public function deleteAll() - { - $namespaceCacheKey = $this->getNamespaceCacheKey(); - $namespaceVersion = $this->getNamespaceVersion() + 1; - - $this->namespaceVersion = $namespaceVersion; - - return $this->doSave($namespaceCacheKey, $namespaceVersion); - } - - /** - * Prefixes the passed id with the configured namespace value. - * - * @param string $id The id to namespace. - * - * @return string The namespaced id. - */ - private function getNamespacedId($id) - { - $namespaceVersion = $this->getNamespaceVersion(); - - return sprintf('%s[%s][%s]', $this->namespace, $id, $namespaceVersion); - } - - /** - * Returns the namespace cache key. - * - * @return string - */ - private function getNamespaceCacheKey() - { - return sprintf(self::DOCTRINE_NAMESPACE_CACHEKEY, $this->namespace); - } - - /** - * Returns the namespace version. - * - * @return string - */ - private function getNamespaceVersion() - { - if (null !== $this->namespaceVersion) { - return $this->namespaceVersion; - } - - $namespaceCacheKey = $this->getNamespaceCacheKey(); - $namespaceVersion = $this->doFetch($namespaceCacheKey); - - if (false === $namespaceVersion) { - $namespaceVersion = 1; - - $this->doSave($namespaceCacheKey, $namespaceVersion); - } - - $this->namespaceVersion = $namespaceVersion; - - return $this->namespaceVersion; - } - - /** - * Fetches an entry from the cache. - * - * @param string $id The id of the cache entry to fetch. - * - * @return string|bool The cached data or FALSE, if no cache entry exists for the given id. - */ - abstract protected function doFetch($id); - - /** - * Tests if an entry exists in the cache. - * - * @param string $id The cache id of the entry to check for. - * - * @return boolean TRUE if a cache entry exists for the given cache id, FALSE otherwise. - */ - abstract protected function doContains($id); - - /** - * Puts data into the cache. - * - * @param string $id The cache id. - * @param string $data The cache entry/data. - * @param int $lifeTime The lifetime. If != 0, sets a specific lifetime for this - * cache entry (0 => infinite lifeTime). - * - * @return boolean TRUE if the entry was successfully stored in the cache, FALSE otherwise. - */ - abstract protected function doSave($id, $data, $lifeTime = 0); - - /** - * Deletes a cache entry. - * - * @param string $id The cache id. - * - * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise. - */ - abstract protected function doDelete($id); - - /** - * Flushes all cache entries. - * - * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise. - */ - abstract protected function doFlush(); - - /** - * Retrieves cached information from the data store. - * - * @since 2.2 - * - * @return array|null An associative array with server's statistics if available, NULL otherwise. - */ - abstract protected function doGetStats(); -} diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/CouchbaseCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/CouchbaseCache.php deleted file mode 100644 index c21691df9..000000000 --- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/CouchbaseCache.php +++ /dev/null @@ -1,121 +0,0 @@ -. - */ - -namespace Doctrine\Common\Cache; - -use \Couchbase; - -/** - * Couchbase cache provider. - * - * @link www.doctrine-project.org - * @since 2.4 - * @author Michael Nitschinger - */ -class CouchbaseCache extends CacheProvider -{ - /** - * @var Couchbase|null - */ - private $couchbase; - - /** - * Sets the Couchbase instance to use. - * - * @param Couchbase $couchbase - * - * @return void - */ - public function setCouchbase(Couchbase $couchbase) - { - $this->couchbase = $couchbase; - } - - /** - * Gets the Couchbase instance used by the cache. - * - * @return Couchbase|null - */ - public function getCouchbase() - { - return $this->couchbase; - } - - /** - * {@inheritdoc} - */ - protected function doFetch($id) - { - return $this->couchbase->get($id) ?: false; - } - - /** - * {@inheritdoc} - */ - protected function doContains($id) - { - return (null !== $this->couchbase->get($id)); - } - - /** - * {@inheritdoc} - */ - protected function doSave($id, $data, $lifeTime = 0) - { - if ($lifeTime > 30 * 24 * 3600) { - $lifeTime = time() + $lifeTime; - } - return $this->couchbase->set($id, $data, (int) $lifeTime); - } - - /** - * {@inheritdoc} - */ - protected function doDelete($id) - { - return $this->couchbase->delete($id); - } - - /** - * {@inheritdoc} - */ - protected function doFlush() - { - return $this->couchbase->flush(); - } - - /** - * {@inheritdoc} - */ - protected function doGetStats() - { - $stats = $this->couchbase->getStats(); - $servers = $this->couchbase->getServers(); - $server = explode(":", $servers[0]); - $key = $server[0] . ":" . "11210"; - $stats = $stats[$key]; - return array( - Cache::STATS_HITS => $stats['get_hits'], - Cache::STATS_MISSES => $stats['get_misses'], - Cache::STATS_UPTIME => $stats['uptime'], - Cache::STATS_MEMORY_USAGE => $stats['bytes'], - Cache::STATS_MEMORY_AVAILABLE => $stats['limit_maxbytes'], - ); - } -} diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FileCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FileCache.php deleted file mode 100644 index 1aa4d7911..000000000 --- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FileCache.php +++ /dev/null @@ -1,158 +0,0 @@ -. - */ - -namespace Doctrine\Common\Cache; - -/** - * Base file cache driver. - * - * @since 2.3 - * @author Fabio B. Silva - */ -abstract class FileCache extends CacheProvider -{ - /** - * The cache directory. - * - * @var string - */ - protected $directory; - - /** - * The cache file extension. - * - * @var string|null - */ - protected $extension; - - /** - * Constructor. - * - * @param string $directory The cache directory. - * @param string|null $extension The cache file extension. - * - * @throws \InvalidArgumentException - */ - public function __construct($directory, $extension = null) - { - if ( ! is_dir($directory) && ! @mkdir($directory, 0777, true)) { - throw new \InvalidArgumentException(sprintf( - 'The directory "%s" does not exist and could not be created.', - $directory - )); - } - - if ( ! is_writable($directory)) { - throw new \InvalidArgumentException(sprintf( - 'The directory "%s" is not writable.', - $directory - )); - } - - $this->directory = realpath($directory); - $this->extension = $extension ?: $this->extension; - } - - /** - * Gets the cache directory. - * - * @return string - */ - public function getDirectory() - { - return $this->directory; - } - - /** - * Gets the cache file extension. - * - * @return string|null - */ - public function getExtension() - { - return $this->extension; - } - - /** - * @param string $id - * - * @return string - */ - protected function getFilename($id) - { - $hash = hash('sha256', $id); - $path = implode(str_split($hash, 16), DIRECTORY_SEPARATOR); - $path = $this->directory . DIRECTORY_SEPARATOR . $path; - $id = preg_replace('@[\\\/:"*?<>|]+@', '', $id); - - return $path . DIRECTORY_SEPARATOR . $id . $this->extension; - } - - /** - * {@inheritdoc} - */ - protected function doDelete($id) - { - return @unlink($this->getFilename($id)); - } - - /** - * {@inheritdoc} - */ - protected function doFlush() - { - foreach ($this->getIterator() as $name => $file) { - @unlink($name); - } - - return true; - } - - /** - * {@inheritdoc} - */ - protected function doGetStats() - { - $usage = 0; - foreach ($this->getIterator() as $name => $file) { - $usage += $file->getSize(); - } - - $free = disk_free_space($this->directory); - - return array( - Cache::STATS_HITS => null, - Cache::STATS_MISSES => null, - Cache::STATS_UPTIME => null, - Cache::STATS_MEMORY_USAGE => $usage, - Cache::STATS_MEMORY_AVAILABLE => $free, - ); - } - - /** - * @return \Iterator - */ - private function getIterator() - { - $pattern = '/^.+\\' . $this->extension . '$/i'; - $iterator = new \RecursiveDirectoryIterator($this->directory); - $iterator = new \RecursiveIteratorIterator($iterator); - return new \RegexIterator($iterator, $pattern); - } -} diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FilesystemCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FilesystemCache.php deleted file mode 100644 index 23aaa37bd..000000000 --- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FilesystemCache.php +++ /dev/null @@ -1,113 +0,0 @@ -. - */ - -namespace Doctrine\Common\Cache; - -/** - * Filesystem cache driver. - * - * @since 2.3 - * @author Fabio B. Silva - */ -class FilesystemCache extends FileCache -{ - const EXTENSION = '.doctrinecache.data'; - - /** - * {@inheritdoc} - */ - protected $extension = self::EXTENSION; - - /** - * {@inheritdoc} - */ - protected function doFetch($id) - { - $data = ''; - $lifetime = -1; - $filename = $this->getFilename($id); - - if ( ! is_file($filename)) { - return false; - } - - $resource = fopen($filename, "r"); - - if (false !== ($line = fgets($resource))) { - $lifetime = (integer) $line; - } - - if ($lifetime !== 0 && $lifetime < time()) { - fclose($resource); - - return false; - } - - while (false !== ($line = fgets($resource))) { - $data .= $line; - } - - fclose($resource); - - return unserialize($data); - } - - /** - * {@inheritdoc} - */ - protected function doContains($id) - { - $lifetime = -1; - $filename = $this->getFilename($id); - - if ( ! is_file($filename)) { - return false; - } - - $resource = fopen($filename, "r"); - - if (false !== ($line = fgets($resource))) { - $lifetime = (integer) $line; - } - - fclose($resource); - - return $lifetime === 0 || $lifetime > time(); - } - - /** - * {@inheritdoc} - */ - protected function doSave($id, $data, $lifeTime = 0) - { - if ($lifeTime > 0) { - $lifeTime = time() + $lifeTime; - } - - $data = serialize($data); - $filename = $this->getFilename($id); - $filepath = pathinfo($filename, PATHINFO_DIRNAME); - - if ( ! is_dir($filepath)) { - mkdir($filepath, 0777, true); - } - - return file_put_contents($filename, $lifeTime . PHP_EOL . $data) !== false; - } -} diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MemcacheCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MemcacheCache.php deleted file mode 100644 index f839a6591..000000000 --- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MemcacheCache.php +++ /dev/null @@ -1,121 +0,0 @@ -. - */ - -namespace Doctrine\Common\Cache; - -use \Memcache; - -/** - * Memcache cache provider. - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author David Abdemoulaie - */ -class MemcacheCache extends CacheProvider -{ - /** - * @var Memcache|null - */ - private $memcache; - - /** - * Sets the memcache instance to use. - * - * @param Memcache $memcache - * - * @return void - */ - public function setMemcache(Memcache $memcache) - { - $this->memcache = $memcache; - } - - /** - * Gets the memcache instance used by the cache. - * - * @return Memcache|null - */ - public function getMemcache() - { - return $this->memcache; - } - - /** - * {@inheritdoc} - */ - protected function doFetch($id) - { - return $this->memcache->get($id); - } - - /** - * {@inheritdoc} - */ - protected function doContains($id) - { - return (bool) $this->memcache->get($id); - } - - /** - * {@inheritdoc} - */ - protected function doSave($id, $data, $lifeTime = 0) - { - if ($lifeTime > 30 * 24 * 3600) { - $lifeTime = time() + $lifeTime; - } - return $this->memcache->set($id, $data, 0, (int) $lifeTime); - } - - /** - * {@inheritdoc} - */ - protected function doDelete($id) - { - return $this->memcache->delete($id); - } - - /** - * {@inheritdoc} - */ - protected function doFlush() - { - return $this->memcache->flush(); - } - - /** - * {@inheritdoc} - */ - protected function doGetStats() - { - $stats = $this->memcache->getStats(); - return array( - Cache::STATS_HITS => $stats['get_hits'], - Cache::STATS_MISSES => $stats['get_misses'], - Cache::STATS_UPTIME => $stats['uptime'], - Cache::STATS_MEMORY_USAGE => $stats['bytes'], - Cache::STATS_MEMORY_AVAILABLE => $stats['limit_maxbytes'], - ); - } -} diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MemcachedCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MemcachedCache.php deleted file mode 100644 index f7e5500a1..000000000 --- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MemcachedCache.php +++ /dev/null @@ -1,124 +0,0 @@ -. - */ - -namespace Doctrine\Common\Cache; - -use \Memcached; - -/** - * Memcached cache provider. - * - * @link www.doctrine-project.org - * @since 2.2 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author David Abdemoulaie - */ -class MemcachedCache extends CacheProvider -{ - /** - * @var Memcached|null - */ - private $memcached; - - /** - * Sets the memcache instance to use. - * - * @param Memcached $memcached - * - * @return void - */ - public function setMemcached(Memcached $memcached) - { - $this->memcached = $memcached; - } - - /** - * Gets the memcached instance used by the cache. - * - * @return Memcached|null - */ - public function getMemcached() - { - return $this->memcached; - } - - /** - * {@inheritdoc} - */ - protected function doFetch($id) - { - return $this->memcached->get($id); - } - - /** - * {@inheritdoc} - */ - protected function doContains($id) - { - return (false !== $this->memcached->get($id)); - } - - /** - * {@inheritdoc} - */ - protected function doSave($id, $data, $lifeTime = 0) - { - if ($lifeTime > 30 * 24 * 3600) { - $lifeTime = time() + $lifeTime; - } - return $this->memcached->set($id, $data, (int) $lifeTime); - } - - /** - * {@inheritdoc} - */ - protected function doDelete($id) - { - return $this->memcached->delete($id); - } - - /** - * {@inheritdoc} - */ - protected function doFlush() - { - return $this->memcached->flush(); - } - - /** - * {@inheritdoc} - */ - protected function doGetStats() - { - $stats = $this->memcached->getStats(); - $servers = $this->memcached->getServerList(); - $key = $servers[0]['host'] . ':' . $servers[0]['port']; - $stats = $stats[$key]; - return array( - Cache::STATS_HITS => $stats['get_hits'], - Cache::STATS_MISSES => $stats['get_misses'], - Cache::STATS_UPTIME => $stats['uptime'], - Cache::STATS_MEMORY_USAGE => $stats['bytes'], - Cache::STATS_MEMORY_AVAILABLE => $stats['limit_maxbytes'], - ); - } -} diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MongoDBCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MongoDBCache.php deleted file mode 100644 index 0c7ac0a09..000000000 --- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MongoDBCache.php +++ /dev/null @@ -1,191 +0,0 @@ -. - */ - -namespace Doctrine\Common\Cache; - -use MongoBinData; -use MongoCollection; -use MongoDate; - -/** - * MongoDB cache provider. - * - * @since 1.1 - * @author Jeremy Mikola - */ -class MongoDBCache extends CacheProvider -{ - /** - * The data field will store the serialized PHP value. - */ - const DATA_FIELD = 'd'; - - /** - * The expiration field will store a MongoDate value indicating when the - * cache entry should expire. - * - * With MongoDB 2.2+, entries can be automatically deleted by MongoDB by - * indexing this field wit the "expireAfterSeconds" option equal to zero. - * This will direct MongoDB to regularly query for and delete any entries - * whose date is older than the current time. Entries without a date value - * in this field will be ignored. - * - * The cache provider will also check dates on its own, in case expired - * entries are fetched before MongoDB's TTLMonitor pass can expire them. - * - * @see http://docs.mongodb.org/manual/tutorial/expire-data/ - */ - const EXPIRATION_FIELD = 'e'; - - /** - * @var MongoCollection - */ - private $collection; - - /** - * Constructor. - * - * This provider will default to the write concern and read preference - * options set on the MongoCollection instance (or inherited from MongoDB or - * MongoClient). Using an unacknowledged write concern (< 1) may make the - * return values of delete() and save() unreliable. Reading from secondaries - * may make contain() and fetch() unreliable. - * - * @see http://www.php.net/manual/en/mongo.readpreferences.php - * @see http://www.php.net/manual/en/mongo.writeconcerns.php - * @param MongoCollection $collection - */ - public function __construct(MongoCollection $collection) - { - $this->collection = $collection; - } - - /** - * {@inheritdoc} - */ - protected function doFetch($id) - { - $document = $this->collection->findOne(array('_id' => $id), array(self::DATA_FIELD, self::EXPIRATION_FIELD)); - - if ($document === null) { - return false; - } - - if ($this->isExpired($document)) { - $this->doDelete($id); - return false; - } - - return unserialize($document[self::DATA_FIELD]->bin); - } - - /** - * {@inheritdoc} - */ - protected function doContains($id) - { - $document = $this->collection->findOne(array('_id' => $id), array(self::EXPIRATION_FIELD)); - - if ($document === null) { - return false; - } - - if ($this->isExpired($document)) { - $this->doDelete($id); - return false; - } - - return true; - } - - /** - * {@inheritdoc} - */ - protected function doSave($id, $data, $lifeTime = 0) - { - $result = $this->collection->update( - array('_id' => $id), - array('$set' => array( - self::EXPIRATION_FIELD => ($lifeTime > 0 ? new MongoDate(time() + $lifeTime) : null), - self::DATA_FIELD => new MongoBinData(serialize($data), MongoBinData::BYTE_ARRAY), - )), - array('upsert' => true, 'multiple' => false) - ); - - return isset($result['ok']) ? $result['ok'] == 1 : true; - } - - /** - * {@inheritdoc} - */ - protected function doDelete($id) - { - $result = $this->collection->remove(array('_id' => $id)); - - return isset($result['n']) ? $result['n'] == 1 : true; - } - - /** - * {@inheritdoc} - */ - protected function doFlush() - { - // Use remove() in lieu of drop() to maintain any collection indexes - $result = $this->collection->remove(); - - return isset($result['ok']) ? $result['ok'] == 1 : true; - } - - /** - * {@inheritdoc} - */ - protected function doGetStats() - { - $serverStatus = $this->collection->db->command(array( - 'serverStatus' => 1, - 'locks' => 0, - 'metrics' => 0, - 'recordStats' => 0, - 'repl' => 0, - )); - - $collStats = $this->collection->db->command(array('collStats' => 1)); - - return array( - Cache::STATS_HITS => null, - Cache::STATS_MISSES => null, - Cache::STATS_UPTIME => (isset($serverStatus['uptime']) ? (integer) $serverStatus['uptime'] : null), - Cache::STATS_MEMORY_USAGE => (isset($collStats['size']) ? (integer) $collStats['size'] : null), - Cache::STATS_MEMORY_AVAILABLE => null, - ); - } - - /** - * Check if the document is expired. - * - * @param array $document - * @return boolean - */ - private function isExpired(array $document) - { - return isset($document[self::EXPIRATION_FIELD]) && - $document[self::EXPIRATION_FIELD] instanceof MongoDate && - $document[self::EXPIRATION_FIELD]->sec < time(); - } -} diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/PhpFileCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/PhpFileCache.php deleted file mode 100644 index f017d8332..000000000 --- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/PhpFileCache.php +++ /dev/null @@ -1,107 +0,0 @@ -. - */ - -namespace Doctrine\Common\Cache; - -/** - * Php file cache driver. - * - * @since 2.3 - * @author Fabio B. Silva - */ -class PhpFileCache extends FileCache -{ - const EXTENSION = '.doctrinecache.php'; - - /** - * {@inheritdoc} - */ - protected $extension = self::EXTENSION; - - /** - * {@inheritdoc} - */ - protected function doFetch($id) - { - $filename = $this->getFilename($id); - - if ( ! is_file($filename)) { - return false; - } - - $value = include $filename; - - if ($value['lifetime'] !== 0 && $value['lifetime'] < time()) { - return false; - } - - return $value['data']; - } - - /** - * {@inheritdoc} - */ - protected function doContains($id) - { - $filename = $this->getFilename($id); - - if ( ! is_file($filename)) { - return false; - } - - $value = include $filename; - - return $value['lifetime'] === 0 || $value['lifetime'] > time(); - } - - /** - * {@inheritdoc} - */ - protected function doSave($id, $data, $lifeTime = 0) - { - if ($lifeTime > 0) { - $lifeTime = time() + $lifeTime; - } - - if (is_object($data) && ! method_exists($data, '__set_state')) { - throw new \InvalidArgumentException( - "Invalid argument given, PhpFileCache only allows objects that implement __set_state() " . - "and fully support var_export(). You can use the FilesystemCache to save arbitrary object " . - "graphs using serialize()/deserialize()." - ); - } - - $filename = $this->getFilename($id); - $filepath = pathinfo($filename, PATHINFO_DIRNAME); - - if ( ! is_dir($filepath)) { - mkdir($filepath, 0777, true); - } - - $value = array( - 'lifetime' => $lifeTime, - 'data' => $data - ); - - $value = var_export($value, true); - $code = sprintf('. - */ - -namespace Doctrine\Common\Cache; - -use Redis; - -/** - * Redis cache provider. - * - * @link www.doctrine-project.org - * @since 2.2 - * @author Osman Ungur - */ -class RedisCache extends CacheProvider -{ - /** - * @var Redis|null - */ - private $redis; - - /** - * Sets the redis instance to use. - * - * @param Redis $redis - * - * @return void - */ - public function setRedis(Redis $redis) - { - $redis->setOption(Redis::OPT_SERIALIZER, $this->getSerializerValue()); - $this->redis = $redis; - } - - /** - * Gets the redis instance used by the cache. - * - * @return Redis|null - */ - public function getRedis() - { - return $this->redis; - } - - /** - * {@inheritdoc} - */ - protected function doFetch($id) - { - return $this->redis->get($id); - } - - /** - * {@inheritdoc} - */ - protected function doContains($id) - { - return $this->redis->exists($id); - } - - /** - * {@inheritdoc} - */ - protected function doSave($id, $data, $lifeTime = 0) - { - if ($lifeTime > 0) { - return $this->redis->setex($id, $lifeTime, $data); - } - - return $this->redis->set($id, $data); - } - - /** - * {@inheritdoc} - */ - protected function doDelete($id) - { - return $this->redis->delete($id) > 0; - } - - /** - * {@inheritdoc} - */ - protected function doFlush() - { - return $this->redis->flushDB(); - } - - /** - * {@inheritdoc} - */ - protected function doGetStats() - { - $info = $this->redis->info(); - return array( - Cache::STATS_HITS => false, - Cache::STATS_MISSES => false, - Cache::STATS_UPTIME => $info['uptime_in_seconds'], - Cache::STATS_MEMORY_USAGE => $info['used_memory'], - Cache::STATS_MEMORY_AVAILABLE => false - ); - } - - /** - * Returns the serializer constant to use. If Redis is compiled with - * igbinary support, that is used. Otherwise the default PHP serializer is - * used. - * - * @return integer One of the Redis::SERIALIZER_* constants - */ - protected function getSerializerValue() - { - return defined('Redis::SERIALIZER_IGBINARY') ? Redis::SERIALIZER_IGBINARY : Redis::SERIALIZER_PHP; - } -} diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/RiakCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/RiakCache.php deleted file mode 100644 index 8bb6b4bf9..000000000 --- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/RiakCache.php +++ /dev/null @@ -1,250 +0,0 @@ -. - */ - -namespace Doctrine\Common\Cache; - -use Riak\Bucket; -use Riak\Connection; -use Riak\Input; -use Riak\Exception; -use Riak\Object; - -/** - * Riak cache provider. - * - * @link www.doctrine-project.org - * @since 1.1 - * @author Guilherme Blanco - */ -class RiakCache extends CacheProvider -{ - const EXPIRES_HEADER = 'X-Riak-Meta-Expires'; - - /** - * @var \Riak\Bucket - */ - private $bucket; - - /** - * Sets the riak bucket instance to use. - * - * @param \Riak\Bucket $bucket - */ - public function __construct(Bucket $bucket) - { - $this->bucket = $bucket; - } - - /** - * {@inheritdoc} - */ - protected function doFetch($id) - { - try { - $response = $this->bucket->get($id); - - // No objects found - if ( ! $response->hasObject()) { - return false; - } - - // Check for attempted siblings - $object = ($response->hasSiblings()) - ? $this->resolveConflict($id, $response->getVClock(), $response->getObjectList()) - : $response->getFirstObject(); - - // Check for expired object - if ($this->isExpired($object)) { - $this->bucket->delete($object); - - return false; - } - - return unserialize($object->getContent()); - } catch (Exception\RiakException $e) { - // Covers: - // - Riak\ConnectionException - // - Riak\CommunicationException - // - Riak\UnexpectedResponseException - // - Riak\NotFoundException - } - - return false; - } - - /** - * {@inheritdoc} - */ - protected function doContains($id) - { - try { - // We only need the HEAD, not the entire object - $input = new Input\GetInput(); - - $input->setReturnHead(true); - - $response = $this->bucket->get($id, $input); - - // No objects found - if ( ! $response->hasObject()) { - return false; - } - - $object = $response->getFirstObject(); - - // Check for expired object - if ($this->isExpired($object)) { - $this->bucket->delete($object); - - return false; - } - - return true; - } catch (Exception\RiakException $e) { - // Do nothing - } - - return false; - } - - /** - * {@inheritdoc} - */ - protected function doSave($id, $data, $lifeTime = 0) - { - try { - $object = new Object($id); - - $object->setContent(serialize($data)); - - if ($lifeTime > 0) { - $object->addMetadata(self::EXPIRES_HEADER, (string) (time() + $lifeTime)); - } - - $this->bucket->put($object); - - return true; - } catch (Exception\RiakException $e) { - // Do nothing - } - - return false; - } - - /** - * {@inheritdoc} - */ - protected function doDelete($id) - { - try { - $this->bucket->delete($id); - - return true; - } catch (Exception\BadArgumentsException $e) { - // Key did not exist on cluster already - } catch (Exception\RiakException $e) { - // Covers: - // - Riak\Exception\ConnectionException - // - Riak\Exception\CommunicationException - // - Riak\Exception\UnexpectedResponseException - } - - return false; - } - - /** - * {@inheritdoc} - */ - protected function doFlush() - { - try { - $keyList = $this->bucket->getKeyList(); - - foreach ($keyList as $key) { - $this->bucket->delete($key); - } - - return true; - } catch (Exception\RiakException $e) { - // Do nothing - } - - return false; - } - - /** - * {@inheritdoc} - */ - protected function doGetStats() - { - // Only exposed through HTTP stats API, not Protocol Buffers API - return null; - } - - /** - * Check if a given Riak Object have expired. - * - * @param \Riak\Object $object - * - * @return boolean - */ - private function isExpired(Object $object) - { - $metadataMap = $object->getMetadataMap(); - - return isset($metadataMap[self::EXPIRES_HEADER]) - && $metadataMap[self::EXPIRES_HEADER] < time(); - } - - /** - * On-read conflict resolution. Applied approach here is last write wins. - * Specific needs may override this method to apply alternate conflict resolutions. - * - * {@internal Riak does not attempt to resolve a write conflict, and store - * it as sibling of conflicted one. By following this approach, it is up to - * the next read to resolve the conflict. When this happens, your fetched - * object will have a list of siblings (read as a list of objects). - * In our specific case, we do not care about the intermediate ones since - * they are all the same read from storage, and we do apply a last sibling - * (last write) wins logic. - * If by any means our resolution generates another conflict, it'll up to - * next read to properly solve it.} - * - * @param string $id - * @param string $vClock - * @param array $objectList - * - * @return \Riak\Object - */ - protected function resolveConflict($id, $vClock, array $objectList) - { - // Our approach here is last-write wins - $winner = $objectList[count($objectList)]; - - $putInput = new Input\PutInput(); - $putInput->setVClock($vClock); - - $mergedObject = new Object($id); - $mergedObject->setContent($winner->getContent()); - - $this->bucket->put($mergedObject, $putInput); - - return $mergedObject; - } -} diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/Version.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/Version.php deleted file mode 100644 index e35fbcc5a..000000000 --- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/Version.php +++ /dev/null @@ -1,25 +0,0 @@ -. - */ - -namespace Doctrine\Common\Cache; - -class Version -{ - const VERSION = '1.3.0'; -} diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/WinCacheCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/WinCacheCache.php deleted file mode 100644 index ae3277293..000000000 --- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/WinCacheCache.php +++ /dev/null @@ -1,91 +0,0 @@ -. - */ - -namespace Doctrine\Common\Cache; - -/** - * WinCache cache provider. - * - * @link www.doctrine-project.org - * @since 2.2 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author David Abdemoulaie - */ -class WinCacheCache extends CacheProvider -{ - /** - * {@inheritdoc} - */ - protected function doFetch($id) - { - return wincache_ucache_get($id); - } - - /** - * {@inheritdoc} - */ - protected function doContains($id) - { - return wincache_ucache_exists($id); - } - - /** - * {@inheritdoc} - */ - protected function doSave($id, $data, $lifeTime = 0) - { - return (bool) wincache_ucache_set($id, $data, (int) $lifeTime); - } - - /** - * {@inheritdoc} - */ - protected function doDelete($id) - { - return wincache_ucache_delete($id); - } - - /** - * {@inheritdoc} - */ - protected function doFlush() - { - return wincache_ucache_clear(); - } - - /** - * {@inheritdoc} - */ - protected function doGetStats() - { - $info = wincache_ucache_info(); - $meminfo = wincache_ucache_meminfo(); - - return array( - Cache::STATS_HITS => $info['total_hit_count'], - Cache::STATS_MISSES => $info['total_miss_count'], - Cache::STATS_UPTIME => $info['total_cache_uptime'], - Cache::STATS_MEMORY_USAGE => $meminfo['memory_total'], - Cache::STATS_MEMORY_AVAILABLE => $meminfo['memory_free'], - ); - } -} diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/XcacheCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/XcacheCache.php deleted file mode 100644 index 833b02a89..000000000 --- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/XcacheCache.php +++ /dev/null @@ -1,109 +0,0 @@ -. - */ - -namespace Doctrine\Common\Cache; - -/** - * Xcache cache driver. - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Benjamin Eberlei - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author David Abdemoulaie - */ -class XcacheCache extends CacheProvider -{ - /** - * {@inheritdoc} - */ - protected function doFetch($id) - { - return $this->doContains($id) ? unserialize(xcache_get($id)) : false; - } - - /** - * {@inheritdoc} - */ - protected function doContains($id) - { - return xcache_isset($id); - } - - /** - * {@inheritdoc} - */ - protected function doSave($id, $data, $lifeTime = 0) - { - return xcache_set($id, serialize($data), (int) $lifeTime); - } - - /** - * {@inheritdoc} - */ - protected function doDelete($id) - { - return xcache_unset($id); - } - - /** - * {@inheritdoc} - */ - protected function doFlush() - { - $this->checkAuthorization(); - - xcache_clear_cache(XC_TYPE_VAR, 0); - - return true; - } - - /** - * Checks that xcache.admin.enable_auth is Off. - * - * @return void - * - * @throws \BadMethodCallException When xcache.admin.enable_auth is On. - */ - protected function checkAuthorization() - { - if (ini_get('xcache.admin.enable_auth')) { - throw new \BadMethodCallException('To use all features of \Doctrine\Common\Cache\XcacheCache, you must set "xcache.admin.enable_auth" to "Off" in your php.ini.'); - } - } - - /** - * {@inheritdoc} - */ - protected function doGetStats() - { - $this->checkAuthorization(); - - $info = xcache_info(XC_TYPE_VAR, 0); - return array( - Cache::STATS_HITS => $info['hits'], - Cache::STATS_MISSES => $info['misses'], - Cache::STATS_UPTIME => null, - Cache::STATS_MEMORY_USAGE => $info['size'], - Cache::STATS_MEMORY_AVAILABLE => $info['avail'], - ); - } -} diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ZendDataCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ZendDataCache.php deleted file mode 100644 index 6e35ac823..000000000 --- a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ZendDataCache.php +++ /dev/null @@ -1,83 +0,0 @@ -. - */ - -namespace Doctrine\Common\Cache; - -/** - * Zend Data Cache cache driver. - * - * @link www.doctrine-project.org - * @since 2.0 - * @author Ralph Schindler - * @author Guilherme Blanco - */ -class ZendDataCache extends CacheProvider -{ - /** - * {@inheritdoc} - */ - protected function doFetch($id) - { - return zend_shm_cache_fetch($id); - } - - /** - * {@inheritdoc} - */ - protected function doContains($id) - { - return (false !== zend_shm_cache_fetch($id)); - } - - /** - * {@inheritdoc} - */ - protected function doSave($id, $data, $lifeTime = 0) - { - return zend_shm_cache_store($id, $data, $lifeTime); - } - - /** - * {@inheritdoc} - */ - protected function doDelete($id) - { - return zend_shm_cache_delete($id); - } - - /** - * {@inheritdoc} - */ - protected function doFlush() - { - $namespace = $this->getNamespace(); - if (empty($namespace)) { - return zend_shm_cache_clear(); - } - return zend_shm_cache_clear($namespace); - } - - /** - * {@inheritdoc} - */ - protected function doGetStats() - { - return null; - } -} diff --git a/vendor/donatj/phpuseragentparser/LICENSE.md b/vendor/donatj/phpuseragentparser/LICENSE.md deleted file mode 100644 index 305b6996c..000000000 --- a/vendor/donatj/phpuseragentparser/LICENSE.md +++ /dev/null @@ -1,22 +0,0 @@ -The MIT License -=============== - -Copyright (c) 2013 Jesse G. Donat - -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. \ No newline at end of file diff --git a/vendor/donatj/phpuseragentparser/README.md b/vendor/donatj/phpuseragentparser/README.md deleted file mode 100644 index 0d0210215..000000000 --- a/vendor/donatj/phpuseragentparser/README.md +++ /dev/null @@ -1,110 +0,0 @@ -# PHP User Agent Parser - -[![Latest Stable Version](https://poser.pugx.org/donatj/phpuseragentparser/v/stable.png)](https://packagist.org/packages/donatj/phpuseragentparser) [![Total Downloads](https://poser.pugx.org/donatj/phpuseragentparser/downloads.png)](https://packagist.org/packages/donatj/phpuseragentparser) [![Latest Unstable Version](https://poser.pugx.org/donatj/phpuseragentparser/v/unstable.png)](https://packagist.org/packages/donatj/phpuseragentparser) [![License](https://poser.pugx.org/donatj/phpuseragentparser/license.png)](https://packagist.org/packages/donatj/phpuseragentparser) -[![Build Status](https://travis-ci.org/donatj/PhpUserAgent.png?branch=master)](https://travis-ci.org/donatj/PhpUserAgent) -[![HHVM Status](http://hhvm.h4cc.de/badge/donatj/phpuseragentparser.png)](http://hhvm.h4cc.de/package/donatj/phpuseragentparser) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/donatj/PhpUserAgent/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/donatj/PhpUserAgent/?branch=master) - -## What It Is - -A simple, streamlined PHP user-agent parser! - -Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php - - -## Why Use This - -You have your choice in user-agent parsers. This one detects **all modern browsers** in a very light, quick, understandable fashion. -It is less than 150 lines of code, and consists of just two regular expressions! -It can also correctly identify exotic versions of IE others fail on. - -It offers 100% unit test coverage, is installable via Composer, and is very easy to use. - -## What It Doesn't Do - -### OS Versions - -User-agent strings **are not** a reliable source of OS Version! - -- Many agents simply don't send the information. -- Others provide varying levels of accuracy. -- Parsing Windows versions alone almost nearly doubles the size of the code. - -I'm much more interested in keeping this thing *tiny* and accurate than adding niché features and would rather focus on things that can be **done well**. - -All that said, there is the start of a [branch to do it](https://github.com/donatj/PhpUserAgent/tree/os_version_detection) I created for a client if you want to poke it, I update it from time to time, but frankly if you need to *reliably detect OS Version*, using user-agent isn't the way to do it. I'd go with JavaScript. - -## Requirements - - - PHP 5.3.0+ - -## Installing - -PHP User Agent is available through Packagist via Composer. - -```json -{ - "require": { - "donatj/phpuseragentparser": "*" - } -} -``` - -## Sample Usage - -```php -$ua_info = parse_user_agent(); -/* -array( - 'platform' => '[Detected Platform]', - 'browser' => '[Detected Browser]', - 'version' => '[Detected Browser Version]', -); -*/ -``` - -## Currently Detected Platforms - -- Desktop - - Windows - - Linux - - Macintosh - - Chrome OS -- Mobile - - Android - - iPhone - - iPad - - Windows Phone OS - - Kindle - - Kindle Fire - - BlackBerry - - Playbook -- Console - - Nintendo 3DS - - Nintendo Wii - - Nintendo WiiU - - PlayStation 3 - - PlayStation 4 - - PlayStation Vita - - Xbox 360 - - Xbox One - -## Currently Detected Browsers - -- Android Browser -- BlackBerry Browser -- Camino -- Kindle / Silk -- Firefox / Iceweasel -- Safari -- Internet Explorer -- IEMobile -- Chrome -- Opera -- Midori -- Lynx -- Wget -- Curl - - - -More information is available at [Donat Studios](http://donatstudios.com/PHP-Parser-HTTP_USER_AGENT). diff --git a/vendor/donatj/phpuseragentparser/Source/UserAgentParser.php b/vendor/donatj/phpuseragentparser/Source/UserAgentParser.php deleted file mode 100644 index 06178e42e..000000000 --- a/vendor/donatj/phpuseragentparser/Source/UserAgentParser.php +++ /dev/null @@ -1,144 +0,0 @@ - - * @link https://github.com/donatj/PhpUserAgent - * @link http://donatstudios.com/PHP-Parser-HTTP_USER_AGENT - * @param string|null $u_agent User agent string to parse or null. Uses $_SERVER['HTTP_USER_AGENT'] on NULL - * @throws InvalidArgumentException on not having a proper user agent to parse. - * @return array an array with browser, version and platform keys - */ -function parse_user_agent( $u_agent = null ) { - if( is_null($u_agent) ) { - if( isset($_SERVER['HTTP_USER_AGENT']) ) { - $u_agent = $_SERVER['HTTP_USER_AGENT']; - } else { - throw new \InvalidArgumentException('parse_user_agent requires a user agent'); - } - } - - $platform = null; - $browser = null; - $version = null; - - $empty = array( 'platform' => $platform, 'browser' => $browser, 'version' => $version ); - - if( !$u_agent ) return $empty; - - if( preg_match('/\((.*?)\)/im', $u_agent, $parent_matches) ) { - - preg_match_all('/(?PBB\d+;|Android|CrOS|iPhone|iPad|Linux|Macintosh|Windows(\ Phone)?|Silk|linux-gnu|BlackBerry|PlayBook|Nintendo\ (WiiU?|3DS)|Xbox(\ One)?) - (?:\ [^;]*)? - (?:;|$)/imx', $parent_matches[1], $result, PREG_PATTERN_ORDER); - - $priority = array( 'Android', 'Xbox One', 'Xbox' ); - $result['platform'] = array_unique($result['platform']); - if( count($result['platform']) > 1 ) { - if( $keys = array_intersect($priority, $result['platform']) ) { - $platform = reset($keys); - } else { - $platform = $result['platform'][0]; - } - } elseif( isset($result['platform'][0]) ) { - $platform = $result['platform'][0]; - } - } - - if( $platform == 'linux-gnu' ) { - $platform = 'Linux'; - } elseif( $platform == 'CrOS' ) { - $platform = 'Chrome OS'; - } - - preg_match_all('%(?PCamino|Kindle(\ Fire\ Build)?|Firefox|Iceweasel|Safari|MSIE|Trident/.*rv|AppleWebKit|Chrome|IEMobile|Opera|OPR|Silk|Lynx|Midori|Version|Wget|curl|NintendoBrowser|PLAYSTATION\ (\d|Vita)+) - (?:\)?;?) - (?:(?:[:/ ])(?P[0-9A-Z.]+)|/(?:[A-Z]*))%ix', - $u_agent, $result, PREG_PATTERN_ORDER); - - - // If nothing matched, return null (to avoid undefined index errors) - if( !isset($result['browser'][0]) || !isset($result['version'][0]) ) { - return $empty; - } - - $browser = $result['browser'][0]; - $version = $result['version'][0]; - - $find = function ( $search, &$key ) use ( $result ) { - $xkey = array_search(strtolower($search), array_map('strtolower', $result['browser'])); - if( $xkey !== false ) { - $key = $xkey; - - return true; - } - - return false; - }; - - $key = 0; - if( $browser == 'Iceweasel' ) { - $browser = 'Firefox'; - } elseif( $find('Playstation Vita', $key) ) { - $platform = 'PlayStation Vita'; - $browser = 'Browser'; - } elseif( $find('Kindle Fire Build', $key) || $find('Silk', $key) ) { - $browser = $result['browser'][$key] == 'Silk' ? 'Silk' : 'Kindle'; - $platform = 'Kindle Fire'; - if( !($version = $result['version'][$key]) || !is_numeric($version[0]) ) { - $version = $result['version'][array_search('Version', $result['browser'])]; - } - } elseif( $find('NintendoBrowser', $key) || $platform == 'Nintendo 3DS' ) { - $browser = 'NintendoBrowser'; - $version = $result['version'][$key]; - } elseif( $find('Kindle', $key) ) { - $browser = $result['browser'][$key]; - $platform = 'Kindle'; - $version = $result['version'][$key]; - } elseif( $find('OPR', $key) ) { - $browser = 'Opera Next'; - $version = $result['version'][$key]; - } elseif( $find('Opera', $key) ) { - $browser = 'Opera'; - $find('Version', $key); - $version = $result['version'][$key]; - } elseif( $find('Midori', $key) ) { - $browser = 'Midori'; - $version = $result['version'][$key]; - } elseif( $browser == 'MSIE' || strpos($browser, 'Trident') !== false ) { - if( $find('IEMobile', $key) ) { - $browser = 'IEMobile'; - } else { - $browser = 'MSIE'; - $key = 0; - } - $version = $result['version'][$key]; - } elseif( $find('Chrome', $key) ) { - $browser = 'Chrome'; - $version = $result['version'][$key]; - } elseif( $browser == 'AppleWebKit' ) { - if( ($platform == 'Android' && !($key = 0)) ) { - $browser = 'Android Browser'; - } elseif( strpos($platform, 'BB') === 0 ) { - $browser = 'BlackBerry Browser'; - $platform = 'BlackBerry'; - } elseif( $platform == 'BlackBerry' || $platform == 'PlayBook' ) { - $browser = 'BlackBerry Browser'; - } elseif( $find('Safari', $key) ) { - $browser = 'Safari'; - } - - $find('Version', $key); - - $version = $result['version'][$key]; - } elseif( $key = preg_grep('/playstation \d/i', array_map('strtolower', $result['browser'])) ) { - $key = reset($key); - - $platform = 'PlayStation ' . preg_replace('/[^\d]/i', '', $key); - $browser = 'NetFront'; - } - - return array( 'platform' => $platform, 'browser' => $browser, 'version' => $version ); - -} diff --git a/vendor/erusev/parsedown-extra/LICENSE.txt b/vendor/erusev/parsedown-extra/LICENSE.txt deleted file mode 100644 index baca86f5b..000000000 --- a/vendor/erusev/parsedown-extra/LICENSE.txt +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013 Emanuil Rusev, erusev.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 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. \ No newline at end of file diff --git a/vendor/erusev/parsedown-extra/ParsedownExtra.php b/vendor/erusev/parsedown-extra/ParsedownExtra.php deleted file mode 100644 index ef6c6ee2e..000000000 --- a/vendor/erusev/parsedown-extra/ParsedownExtra.php +++ /dev/null @@ -1,420 +0,0 @@ -BlockTypes[':'] []= 'DefinitionList'; - - $this->DefinitionTypes['*'] []= 'Abbreviation'; - - # identify footnote definitions before reference definitions - array_unshift($this->DefinitionTypes['['], 'Footnote'); - - # identify footnote markers before before links - array_unshift($this->SpanTypes['['], 'FootnoteMarker'); - } - - # - # ~ - - function text($text) - { - $markup = parent::text($text); - - # merge consecutive dl elements - - $markup = preg_replace('/<\/dl>\s+
\s+/', '', $markup); - - # add footnotes - - if (isset($this->Definitions['Footnote'])) - { - $Element = $this->buildFootnoteElement(); - - $markup .= "\n" . $this->element($Element); - } - - return $markup; - } - - # - # Blocks - # - - # - # Atx - - protected function identifyAtx($Line) - { - $Block = parent::identifyAtx($Line); - - if (preg_match('/[ ]*'.$this->attributesPattern.'[ ]*$/', $Block['element']['text'], $matches, PREG_OFFSET_CAPTURE)) - { - $attributeString = $matches[1][0]; - - $Block['element']['attributes'] = $this->parseAttributes($attributeString); - - $Block['element']['text'] = substr($Block['element']['text'], 0, $matches[0][1]); - } - - return $Block; - } - - # - # Definition List - - protected function identifyDefinitionList($Line, $Block) - { - if (isset($Block['type'])) - { - return; - } - - $Element = array( - 'name' => 'dl', - 'handler' => 'elements', - 'text' => array(), - ); - - $terms = explode("\n", $Block['element']['text']); - - foreach ($terms as $term) - { - $Element['text'] []= array( - 'name' => 'dt', - 'handler' => 'line', - 'text' => $term, - ); - } - - $Element['text'] []= array( - 'name' => 'dd', - 'handler' => 'line', - 'text' => ltrim($Line['text'], ' :'), - ); - - $Block['element'] = $Element; - - return $Block; - } - - protected function addToDefinitionList($Line, array $Block) - { - if ($Line['text'][0] === ':') - { - $Block['element']['text'] []= array( - 'name' => 'dd', - 'handler' => 'line', - 'text' => ltrim($Line['text'], ' :'), - ); - - return $Block; - } - - if ( ! isset($Block['interrupted'])) - { - $Element = array_pop($Block['element']['text']); - - $Element['text'] .= "\n" . chop($Line['text']); - - $Block['element']['text'] []= $Element; - - return $Block; - } - } - - # - # Setext - - protected function identifySetext($Line, array $Block = null) - { - $Block = parent::identifySetext($Line, $Block); - - if (preg_match('/[ ]*'.$this->attributesPattern.'[ ]*$/', $Block['element']['text'], $matches, PREG_OFFSET_CAPTURE)) - { - $attributeString = $matches[1][0]; - - $Block['element']['attributes'] = $this->parseAttributes($attributeString); - - $Block['element']['text'] = substr($Block['element']['text'], 0, $matches[0][1]); - } - - return $Block; - } - - # - # Markup - - protected function completeMarkup($Block) - { - $DOMDocument = new DOMDocument; - - $DOMDocument->loadXML($Block['element'], LIBXML_NOERROR | LIBXML_NOWARNING); - - if ($DOMDocument->documentElement === null) - { - return $Block; - } - - $result = $DOMDocument->documentElement->getAttribute('markdown'); - - if ($result !== '1') - { - return $Block; - } - - $DOMDocument->documentElement->removeAttribute('markdown'); - - $index = 0; - $texts = array(); - - foreach ($DOMDocument->documentElement->childNodes as $Node) - { - if ($Node instanceof DOMText) - { - $texts [] = $this->text($Node->nodeValue); - - # replaces the text of the node with a placeholder - $Node->nodeValue = '\x1A'.$index ++; - } - } - - $markup = $DOMDocument->saveXML($DOMDocument->documentElement); - - foreach ($texts as $index => $text) - { - $markup = str_replace('\x1A'.$index, $text, $markup); - } - - $Block['element'] = $markup; - - return $Block; - } - - # - # Definitions - # - - # - # Abbreviation - - protected function identifyAbbreviation($Line) - { - if (preg_match('/^\*\[(.+?)\]:[ ]*(.+?)[ ]*$/', $Line['text'], $matches)) - { - $Abbreviation = array( - 'id' => $matches[1], - 'data' => $matches[2], - ); - - return $Abbreviation; - } - } - - # - # Footnote - - protected function identifyFootnote($Line) - { - if (preg_match('/^\[\^(.+?)\]:[ ]?(.+)$/', $Line['text'], $matches)) - { - $Footnote = array( - 'id' => $matches[1], - 'data' => array( - 'text' => $matches[2], - 'count' => null, - 'number' => null, - ), - ); - - return $Footnote; - } - } - - # - # Spans - # - - # - # Footnote Marker - - protected function identifyFootnoteMarker($Excerpt) - { - if (preg_match('/^\[\^(.+?)\]/', $Excerpt['text'], $matches)) - { - $name = $matches[1]; - - if ( ! isset($this->Definitions['Footnote'][$name])) - { - return; - } - - $this->Definitions['Footnote'][$name]['count'] ++; - - if ( ! isset($this->Definitions['Footnote'][$name]['number'])) - { - $this->Definitions['Footnote'][$name]['number'] = ++ $this->footnoteCount; # » & - } - - $Element = array( - 'name' => 'sup', - 'attributes' => array('id' => 'fnref'.$this->Definitions['Footnote'][$name]['count'].':'.$name), - 'handler' => 'element', - 'text' => array( - 'name' => 'a', - 'attributes' => array('href' => '#fn:'.$name, 'class' => 'footnote-ref'), - 'text' => $this->Definitions['Footnote'][$name]['number'], - ), - ); - - return array( - 'extent' => strlen($matches[0]), - 'element' => $Element, - ); - } - } - - private $footnoteCount = 0; - - # - # Link - - protected function identifyLink($Excerpt) - { - $Span = parent::identifyLink($Excerpt); - - $remainder = substr($Excerpt['text'], $Span['extent']); - - if (preg_match('/^[ ]*'.$this->attributesPattern.'/', $remainder, $matches)) - { - $Span['element']['attributes'] += $this->parseAttributes($matches[1]); - - $Span['extent'] += strlen($matches[0]); - } - - return $Span; - } - - # - # ~ - - protected function readPlainText($text) - { - $text = parent::readPlainText($text); - - if (isset($this->Definitions['Abbreviation'])) - { - foreach ($this->Definitions['Abbreviation'] as $abbreviation => $phrase) - { - $text = str_replace($abbreviation, ''.$abbreviation.'', $text); - } - } - - return $text; - } - - # - # ~ - # - - protected function buildFootnoteElement() - { - $Element = array( - 'name' => 'div', - 'attributes' => array('class' => 'footnotes'), - 'handler' => 'elements', - 'text' => array( - array( - 'name' => 'hr', - ), - array( - 'name' => 'ol', - 'handler' => 'elements', - 'text' => array(), - ), - ), - ); - - usort($this->Definitions['Footnote'], function($A, $B) { - return $A['number'] - $B['number']; - }); - - foreach ($this->Definitions['Footnote'] as $name => $Data) - { - if ( ! isset($Data['number'])) - { - continue; - } - - $text = $Data['text']; - - foreach (range(1, $Data['count']) as $number) - { - $text .= ' '; - } - - $Element['text'][1]['text'] []= array( - 'name' => 'li', - 'attributes' => array('id' => 'fn:'.$name), - 'handler' => 'elements', - 'text' => array( - array( - 'name' => 'p', - 'text' => $text, - ), - ), - ); - } - - return $Element; - } - - # - # Private - # - - private function parseAttributes($attributeString) - { - $Data = array(); - - $attributes = preg_split('/[ ]+/', $attributeString, - 1, PREG_SPLIT_NO_EMPTY); - - foreach ($attributes as $attribute) - { - if ($attribute[0] === '#') - { - $Data['id'] = substr($attribute, 1); - } - else # "." - { - $classes []= substr($attribute, 1); - } - } - - if (isset($classes)) - { - $Data['class'] = implode(' ', $classes); - } - - return $Data; - } - - private $attributesPattern = '{((?:[#.][-\w]+[ ]*)+)}'; -} diff --git a/vendor/erusev/parsedown-extra/README.md b/vendor/erusev/parsedown-extra/README.md deleted file mode 100644 index 931ea2f9c..000000000 --- a/vendor/erusev/parsedown-extra/README.md +++ /dev/null @@ -1,17 +0,0 @@ -## Parsedown Extra - -An extension of [Parsedown](http://parsedown.org) that adds support for [Markdown Extra](http://en.wikipedia.org/wiki/Markdown_Extra). - -[[ demo ]](http://parsedown.org/demo?extra=1) - -### Installation - -Include both `Parsedown.php` and `ParsedownExtra.php` or install [the composer package](https://packagist.org/packages/erusev/parsedown-extra). - -### Example - -``` php -$Instance = new ParsedownExtra(); - -echo $Instance->text('Hello _Parsedown Extra_!'); # prints:

Hello Parsedown Extra!

-``` diff --git a/vendor/erusev/parsedown/LICENSE.txt b/vendor/erusev/parsedown/LICENSE.txt deleted file mode 100644 index baca86f5b..000000000 --- a/vendor/erusev/parsedown/LICENSE.txt +++ /dev/null @@ -1,20 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013 Emanuil Rusev, erusev.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 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. \ No newline at end of file diff --git a/vendor/erusev/parsedown/Parsedown.php b/vendor/erusev/parsedown/Parsedown.php deleted file mode 100755 index f877c4871..000000000 --- a/vendor/erusev/parsedown/Parsedown.php +++ /dev/null @@ -1,1402 +0,0 @@ -Definitions = array(); - - # standardize line breaks - $text = str_replace("\r\n", "\n", $text); - $text = str_replace("\r", "\n", $text); - - # replace tabs with spaces - $text = str_replace("\t", ' ', $text); - - # remove surrounding line breaks - $text = trim($text, "\n"); - - # split text into lines - $lines = explode("\n", $text); - - # iterate through lines to identify blocks - $markup = $this->lines($lines); - - # trim line breaks - $markup = trim($markup, "\n"); - - return $markup; - } - - # - # Setters - # - - private $breaksEnabled; - - function setBreaksEnabled($breaksEnabled) - { - $this->breaksEnabled = $breaksEnabled; - - return $this; - } - - # - # Lines - # - - protected $BlockTypes = array( - '#' => array('Atx'), - '*' => array('Rule', 'List'), - '+' => array('List'), - '-' => array('Setext', 'Table', 'Rule', 'List'), - '0' => array('List'), - '1' => array('List'), - '2' => array('List'), - '3' => array('List'), - '4' => array('List'), - '5' => array('List'), - '6' => array('List'), - '7' => array('List'), - '8' => array('List'), - '9' => array('List'), - ':' => array('Table'), - '<' => array('Comment', 'Markup'), - '=' => array('Setext'), - '>' => array('Quote'), - '_' => array('Rule'), - '`' => array('FencedCode'), - '|' => array('Table'), - '~' => array('FencedCode'), - ); - - # ~ - - protected $DefinitionTypes = array( - '[' => array('Reference'), - ); - - # ~ - - protected $unmarkedBlockTypes = array( - 'CodeBlock', - ); - - # - # Blocks - # - - private function lines(array $lines) - { - $CurrentBlock = null; - - foreach ($lines as $line) - { - if (chop($line) === '') - { - if (isset($CurrentBlock)) - { - $CurrentBlock['interrupted'] = true; - } - - continue; - } - - $indent = 0; - - while (isset($line[$indent]) and $line[$indent] === ' ') - { - $indent ++; - } - - $text = $indent > 0 ? substr($line, $indent) : $line; - - # ~ - - $Line = array('body' => $line, 'indent' => $indent, 'text' => $text); - - # ~ - - if (isset($CurrentBlock['incomplete'])) - { - $Block = $this->{'addTo'.$CurrentBlock['type']}($Line, $CurrentBlock); - - if (isset($Block)) - { - $CurrentBlock = $Block; - - continue; - } - else - { - if (method_exists($this, 'complete'.$CurrentBlock['type'])) - { - $CurrentBlock = $this->{'complete'.$CurrentBlock['type']}($CurrentBlock); - } - - unset($CurrentBlock['incomplete']); - } - } - - # ~ - - $marker = $text[0]; - - if (isset($this->DefinitionTypes[$marker])) - { - foreach ($this->DefinitionTypes[$marker] as $definitionType) - { - $Definition = $this->{'identify'.$definitionType}($Line, $CurrentBlock); - - if (isset($Definition)) - { - $this->Definitions[$definitionType][$Definition['id']] = $Definition['data']; - - continue 2; - } - } - } - - # ~ - - $blockTypes = $this->unmarkedBlockTypes; - - if (isset($this->BlockTypes[$marker])) - { - foreach ($this->BlockTypes[$marker] as $blockType) - { - $blockTypes []= $blockType; - } - } - - # - # ~ - - foreach ($blockTypes as $blockType) - { - $Block = $this->{'identify'.$blockType}($Line, $CurrentBlock); - - if (isset($Block)) - { - $Block['type'] = $blockType; - - if ( ! isset($Block['identified'])) - { - $Elements []= $CurrentBlock['element']; - - $Block['identified'] = true; - } - - if (method_exists($this, 'addTo'.$blockType)) - { - $Block['incomplete'] = true; - } - - $CurrentBlock = $Block; - - continue 2; - } - } - - # ~ - - if (isset($CurrentBlock) and ! isset($CurrentBlock['type']) and ! isset($CurrentBlock['interrupted'])) - { - $CurrentBlock['element']['text'] .= "\n".$text; - } - else - { - $Elements []= $CurrentBlock['element']; - - $CurrentBlock = $this->buildParagraph($Line); - - $CurrentBlock['identified'] = true; - } - } - - # ~ - - if (isset($CurrentBlock['incomplete']) and method_exists($this, 'complete'.$CurrentBlock['type'])) - { - $CurrentBlock = $this->{'complete'.$CurrentBlock['type']}($CurrentBlock); - } - - # ~ - - $Elements []= $CurrentBlock['element']; - - unset($Elements[0]); - - # ~ - - $markup = $this->elements($Elements); - - # ~ - - return $markup; - } - - # - # Atx - - protected function identifyAtx($Line) - { - if (isset($Line['text'][1])) - { - $level = 1; - - while (isset($Line['text'][$level]) and $Line['text'][$level] === '#') - { - $level ++; - } - - $text = trim($Line['text'], '# '); - - $Block = array( - 'element' => array( - 'name' => 'h'.$level, - 'text' => $text, - 'handler' => 'line', - ), - ); - - return $Block; - } - } - - # - # Code - - protected function identifyCodeBlock($Line) - { - if ($Line['indent'] >= 4) - { - $text = substr($Line['body'], 4); - - $Block = array( - 'element' => array( - 'name' => 'pre', - 'handler' => 'element', - 'text' => array( - 'name' => 'code', - 'text' => $text, - ), - ), - ); - - return $Block; - } - } - - protected function addToCodeBlock($Line, $Block) - { - if ($Line['indent'] >= 4) - { - if (isset($Block['interrupted'])) - { - $Block['element']['text']['text'] .= "\n"; - - unset($Block['interrupted']); - } - - $Block['element']['text']['text'] .= "\n"; - - $text = substr($Line['body'], 4); - - $Block['element']['text']['text'] .= $text; - - return $Block; - } - } - - protected function completeCodeBlock($Block) - { - $text = $Block['element']['text']['text']; - - $text = htmlspecialchars($text, ENT_NOQUOTES, 'UTF-8'); - - $Block['element']['text']['text'] = $text; - - return $Block; - } - - # - # Comment - - protected function identifyComment($Line) - { - if (isset($Line['text'][3]) and $Line['text'][3] === '-' and $Line['text'][2] === '-' and $Line['text'][1] === '!') - { - $Block = array( - 'element' => $Line['body'], - ); - - if (preg_match('/-->$/', $Line['text'])) - { - $Block['closed'] = true; - } - - return $Block; - } - } - - protected function addToComment($Line, array $Block) - { - if (isset($Block['closed'])) - { - return; - } - - $Block['element'] .= "\n" . $Line['body']; - - if (preg_match('/-->$/', $Line['text'])) - { - $Block['closed'] = true; - } - - return $Block; - } - - # - # Fenced Code - - protected function identifyFencedCode($Line) - { - if (preg_match('/^(['.$Line['text'][0].']{3,})[ ]*([\w-]+)?[ ]*$/', $Line['text'], $matches)) - { - $Element = array( - 'name' => 'code', - 'text' => '', - ); - - if (isset($matches[2])) - { - $class = 'language-'.$matches[2]; - - $Element['attributes'] = array( - 'class' => $class, - ); - } - - $Block = array( - 'char' => $Line['text'][0], - 'element' => array( - 'name' => 'pre', - 'handler' => 'element', - 'text' => $Element, - ), - ); - - return $Block; - } - } - - protected function addToFencedCode($Line, $Block) - { - if (isset($Block['complete'])) - { - return; - } - - if (isset($Block['interrupted'])) - { - $Block['element']['text']['text'] .= "\n"; - - unset($Block['interrupted']); - } - - if (preg_match('/^'.$Block['char'].'{3,}[ ]*$/', $Line['text'])) - { - $Block['element']['text']['text'] = substr($Block['element']['text']['text'], 1); - - $Block['complete'] = true; - - return $Block; - } - - $Block['element']['text']['text'] .= "\n".$Line['body'];; - - return $Block; - } - - protected function completeFencedCode($Block) - { - $text = $Block['element']['text']['text']; - - $text = htmlspecialchars($text, ENT_NOQUOTES, 'UTF-8'); - - $Block['element']['text']['text'] = $text; - - return $Block; - } - - # - # List - - protected function identifyList($Line) - { - list($name, $pattern) = $Line['text'][0] <= '-' ? array('ul', '[*+-]') : array('ol', '[0-9]+[.]'); - - if (preg_match('/^('.$pattern.'[ ]+)(.*)/', $Line['text'], $matches)) - { - $Block = array( - 'indent' => $Line['indent'], - 'pattern' => $pattern, - 'element' => array( - 'name' => $name, - 'handler' => 'elements', - ), - ); - - $Block['li'] = array( - 'name' => 'li', - 'handler' => 'li', - 'text' => array( - $matches[2], - ), - ); - - $Block['element']['text'] []= & $Block['li']; - - return $Block; - } - } - - protected function addToList($Line, array $Block) - { - if ($Block['indent'] === $Line['indent'] and preg_match('/^'.$Block['pattern'].'[ ]+(.*)/', $Line['text'], $matches)) - { - if (isset($Block['interrupted'])) - { - $Block['li']['text'] []= ''; - - unset($Block['interrupted']); - } - - unset($Block['li']); - - $Block['li'] = array( - 'name' => 'li', - 'handler' => 'li', - 'text' => array( - $matches[1], - ), - ); - - $Block['element']['text'] []= & $Block['li']; - - return $Block; - } - - if ( ! isset($Block['interrupted'])) - { - $text = preg_replace('/^[ ]{0,4}/', '', $Line['body']); - - $Block['li']['text'] []= $text; - - return $Block; - } - - if ($Line['indent'] > 0) - { - $Block['li']['text'] []= ''; - - $text = preg_replace('/^[ ]{0,4}/', '', $Line['body']); - - $Block['li']['text'] []= $text; - - unset($Block['interrupted']); - - return $Block; - } - } - - # - # Quote - - protected function identifyQuote($Line) - { - if (preg_match('/^>[ ]?(.*)/', $Line['text'], $matches)) - { - $Block = array( - 'element' => array( - 'name' => 'blockquote', - 'handler' => 'lines', - 'text' => (array) $matches[1], - ), - ); - - return $Block; - } - } - - protected function addToQuote($Line, array $Block) - { - if ($Line['text'][0] === '>' and preg_match('/^>[ ]?(.*)/', $Line['text'], $matches)) - { - if (isset($Block['interrupted'])) - { - $Block['element']['text'] []= ''; - - unset($Block['interrupted']); - } - - $Block['element']['text'] []= $matches[1]; - - return $Block; - } - - if ( ! isset($Block['interrupted'])) - { - $Block['element']['text'] []= $Line['text']; - - return $Block; - } - } - - # - # Rule - - protected function identifyRule($Line) - { - if (preg_match('/^(['.$Line['text'][0].'])([ ]{0,2}\1){2,}[ ]*$/', $Line['text'])) - { - $Block = array( - 'element' => array( - 'name' => 'hr' - ), - ); - - return $Block; - } - } - - # - # Setext - - protected function identifySetext($Line, array $Block = null) - { - if ( ! isset($Block) or isset($Block['type']) or isset($Block['interrupted'])) - { - return; - } - - if (chop($Line['text'], $Line['text'][0]) === '') - { - $Block['element']['name'] = $Line['text'][0] === '=' ? 'h1' : 'h2'; - - return $Block; - } - } - - # - # Markup - - protected function identifyMarkup($Line) - { - if (preg_match('/^<(\w[\w\d]*)(?:[ ][^>\/]*)?(\/?)[ ]*>/', $Line['text'], $matches)) - { - if (in_array($matches[1], $this->textLevelElements)) - { - return; - } - - $Block = array( - 'element' => $Line['body'], - ); - - if ($matches[2] or $matches[1] === 'hr' or preg_match('/<\/'.$matches[1].'>[ ]*$/', $Line['text'])) - { - $Block['closed'] = true; - } - else - { - $Block['depth'] = 0; - $Block['name'] = $matches[1]; - } - - return $Block; - } - } - - protected function addToMarkup($Line, array $Block) - { - if (isset($Block['closed'])) - { - return; - } - - if (preg_match('/<'.$Block['name'].'([ ][^\/]+)?>/', $Line['text'])) # opening tag - { - $Block['depth'] ++; - } - - if (stripos($Line['text'], '') !== false) # closing tag - { - if ($Block['depth'] > 0) - { - $Block['depth'] --; - } - else - { - $Block['closed'] = true; - } - } - - $Block['element'] .= "\n".$Line['body']; - - return $Block; - } - - # - # Table - - protected function identifyTable($Line, array $Block = null) - { - if ( ! isset($Block) or isset($Block['type']) or isset($Block['interrupted'])) - { - return; - } - - if (strpos($Block['element']['text'], '|') !== false and chop($Line['text'], ' -:|') === '') - { - $alignments = array(); - - $divider = $Line['text']; - - $divider = trim($divider); - $divider = trim($divider, '|'); - - $dividerCells = explode('|', $divider); - - foreach ($dividerCells as $dividerCell) - { - $dividerCell = trim($dividerCell); - - if ($dividerCell === '') - { - continue; - } - - $alignment = null; - - if ($dividerCell[0] === ':') - { - $alignment = 'left'; - } - - if (substr($dividerCell, -1) === ':') - { - $alignment = $alignment === 'left' ? 'center' : 'right'; - } - - $alignments []= $alignment; - } - - # ~ - - $HeaderElements = array(); - - $header = $Block['element']['text']; - - $header = trim($header); - $header = trim($header, '|'); - - $headerCells = explode('|', $header); - - foreach ($headerCells as $index => $headerCell) - { - $headerCell = trim($headerCell); - - $HeaderElement = array( - 'name' => 'th', - 'text' => $headerCell, - 'handler' => 'line', - ); - - if (isset($alignments[$index])) - { - $alignment = $alignments[$index]; - - $HeaderElement['attributes'] = array( - 'align' => $alignment, - ); - } - - $HeaderElements []= $HeaderElement; - } - - # ~ - - $Block = array( - 'alignments' => $alignments, - 'identified' => true, - 'element' => array( - 'name' => 'table', - 'handler' => 'elements', - ), - ); - - $Block['element']['text'] []= array( - 'name' => 'thead', - 'handler' => 'elements', - ); - - $Block['element']['text'] []= array( - 'name' => 'tbody', - 'handler' => 'elements', - 'text' => array(), - ); - - $Block['element']['text'][0]['text'] []= array( - 'name' => 'tr', - 'handler' => 'elements', - 'text' => $HeaderElements, - ); - - return $Block; - } - } - - protected function addToTable($Line, array $Block) - { - if ($Line['text'][0] === '|' or strpos($Line['text'], '|')) - { - $Elements = array(); - - $row = $Line['text']; - - $row = trim($row); - $row = trim($row, '|'); - - $cells = explode('|', $row); - - foreach ($cells as $index => $cell) - { - $cell = trim($cell); - - $Element = array( - 'name' => 'td', - 'handler' => 'line', - 'text' => $cell, - ); - - if (isset($Block['alignments'][$index])) - { - $Element['attributes'] = array( - 'align' => $Block['alignments'][$index], - ); - } - - $Elements []= $Element; - } - - $Element = array( - 'name' => 'tr', - 'handler' => 'elements', - 'text' => $Elements, - ); - - $Block['element']['text'][1]['text'] []= $Element; - - return $Block; - } - } - - # - # Definitions - # - - protected function identifyReference($Line) - { - if (preg_match('/^\[(.+?)\]:[ ]*?(?:[ ]+["\'(](.+)["\')])?[ ]*$/', $Line['text'], $matches)) - { - $Definition = array( - 'id' => strtolower($matches[1]), - 'data' => array( - 'url' => $matches[2], - ), - ); - - if (isset($matches[3])) - { - $Definition['data']['title'] = $matches[3]; - } - - return $Definition; - } - } - - # - # ~ - # - - protected function buildParagraph($Line) - { - $Block = array( - 'element' => array( - 'name' => 'p', - 'text' => $Line['text'], - 'handler' => 'line', - ), - ); - - return $Block; - } - - # - # ~ - # - - protected function element(array $Element) - { - $markup = '<'.$Element['name']; - - if (isset($Element['attributes'])) - { - foreach ($Element['attributes'] as $name => $value) - { - $markup .= ' '.$name.'="'.$value.'"'; - } - } - - if (isset($Element['text'])) - { - $markup .= '>'; - - if (isset($Element['handler'])) - { - $markup .= $this->$Element['handler']($Element['text']); - } - else - { - $markup .= $Element['text']; - } - - $markup .= ''; - } - else - { - $markup .= ' />'; - } - - return $markup; - } - - protected function elements(array $Elements) - { - $markup = ''; - - foreach ($Elements as $Element) - { - if ($Element === null) - { - continue; - } - - $markup .= "\n"; - - if (is_string($Element)) # because of Markup - { - $markup .= $Element; - - continue; - } - - $markup .= $this->element($Element); - } - - $markup .= "\n"; - - return $markup; - } - - # - # Spans - # - - protected $SpanTypes = array( - '!' => array('Link'), # ? - '&' => array('Ampersand'), - '*' => array('Emphasis'), - '/' => array('Url'), - '<' => array('UrlTag', 'EmailTag', 'Tag', 'LessThan'), - '[' => array('Link'), - '_' => array('Emphasis'), - '`' => array('InlineCode'), - '~' => array('Strikethrough'), - '\\' => array('EscapeSequence'), - ); - - # ~ - - protected $spanMarkerList = '*_!&[spanMarkerList)) - { - $marker = $excerpt[0]; - - $markerPosition += strpos($remainder, $marker); - - $Excerpt = array('text' => $excerpt, 'context' => $text); - - foreach ($this->SpanTypes[$marker] as $spanType) - { - $handler = 'identify'.$spanType; - - $Span = $this->$handler($Excerpt); - - if ( ! isset($Span)) - { - continue; - } - - # The identified span can be ahead of the marker. - - if (isset($Span['position']) and $Span['position'] > $markerPosition) - { - continue; - } - - # Spans that start at the position of their marker don't have to set a position. - - if ( ! isset($Span['position'])) - { - $Span['position'] = $markerPosition; - } - - $plainText = substr($text, 0, $Span['position']); - - $markup .= $this->readPlainText($plainText); - - $markup .= isset($Span['markup']) ? $Span['markup'] : $this->element($Span['element']); - - $text = substr($text, $Span['position'] + $Span['extent']); - - $remainder = $text; - - $markerPosition = 0; - - continue 2; - } - - $remainder = substr($excerpt, 1); - - $markerPosition ++; - } - - $markup .= $this->readPlainText($text); - - return $markup; - } - - # - # ~ - # - - protected function identifyUrl($Excerpt) - { - if ( ! isset($Excerpt['text'][1]) or $Excerpt['text'][1] !== '/') - { - return; - } - - if (preg_match('/\bhttps?:[\/]{2}[^\s<]+\b\/*/ui', $Excerpt['context'], $matches, PREG_OFFSET_CAPTURE)) - { - $url = str_replace(array('&', '<'), array('&', '<'), $matches[0][0]); - - return array( - 'extent' => strlen($matches[0][0]), - 'position' => $matches[0][1], - 'element' => array( - 'name' => 'a', - 'text' => $url, - 'attributes' => array( - 'href' => $url, - ), - ), - ); - } - } - - protected function identifyAmpersand($Excerpt) - { - if ( ! preg_match('/^&#?\w+;/', $Excerpt['text'])) - { - return array( - 'markup' => '&', - 'extent' => 1, - ); - } - } - - protected function identifyStrikethrough($Excerpt) - { - if ( ! isset($Excerpt['text'][1])) - { - return; - } - - if ($Excerpt['text'][1] === '~' and preg_match('/^~~(?=\S)(.+?)(?<=\S)~~/', $Excerpt['text'], $matches)) - { - return array( - 'extent' => strlen($matches[0]), - 'element' => array( - 'name' => 'del', - 'text' => $matches[1], - 'handler' => 'line', - ), - ); - } - } - - protected function identifyEscapeSequence($Excerpt) - { - if (isset($Excerpt['text'][1]) and in_array($Excerpt['text'][1], $this->specialCharacters)) - { - return array( - 'markup' => $Excerpt['text'][1], - 'extent' => 2, - ); - } - } - - protected function identifyLessThan() - { - return array( - 'markup' => '<', - 'extent' => 1, - ); - } - - protected function identifyUrlTag($Excerpt) - { - if (strpos($Excerpt['text'], '>') !== false and preg_match('/^<(https?:[\/]{2}[^\s]+?)>/i', $Excerpt['text'], $matches)) - { - $url = str_replace(array('&', '<'), array('&', '<'), $matches[1]); - - return array( - 'extent' => strlen($matches[0]), - 'element' => array( - 'name' => 'a', - 'text' => $url, - 'attributes' => array( - 'href' => $url, - ), - ), - ); - } - } - - protected function identifyEmailTag($Excerpt) - { - if (strpos($Excerpt['text'], '>') !== false and preg_match('/^<(\S+?@\S+?)>/', $Excerpt['text'], $matches)) - { - return array( - 'extent' => strlen($matches[0]), - 'element' => array( - 'name' => 'a', - 'text' => $matches[1], - 'attributes' => array( - 'href' => 'mailto:'.$matches[1], - ), - ), - ); - } - } - - protected function identifyTag($Excerpt) - { - if (strpos($Excerpt['text'], '>') !== false and preg_match('/^<\/?\w.*?>/', $Excerpt['text'], $matches)) - { - return array( - 'markup' => $matches[0], - 'extent' => strlen($matches[0]), - ); - } - } - - protected function identifyInlineCode($Excerpt) - { - $marker = $Excerpt['text'][0]; - - if (preg_match('/^('.$marker.'+)[ ]*(.+?)[ ]*(? strlen($matches[0]), - 'element' => array( - 'name' => 'code', - 'text' => $text, - ), - ); - } - } - - protected function identifyLink($Excerpt) - { - $extent = $Excerpt['text'][0] === '!' ? 1 : 0; - - if (strpos($Excerpt['text'], ']') and preg_match('/\[((?:[^][]|(?R))*)\]/', $Excerpt['text'], $matches)) - { - $Link = array('text' => $matches[1], 'label' => strtolower($matches[1])); - - $extent += strlen($matches[0]); - - $substring = substr($Excerpt['text'], $extent); - - if (preg_match('/^\s*\[([^][]+)\]/', $substring, $matches)) - { - $Link['label'] = strtolower($matches[1]); - - if (isset($this->Definitions['Reference'][$Link['label']])) - { - $Link += $this->Definitions['Reference'][$Link['label']]; - - $extent += strlen($matches[0]); - } - else - { - return; - } - } - elseif (isset($this->Definitions['Reference'][$Link['label']])) - { - $Link += $this->Definitions['Reference'][$Link['label']]; - - if (preg_match('/^[ ]*\[\]/', $substring, $matches)) - { - $extent += strlen($matches[0]); - } - } - elseif (preg_match('/^\([ ]*(.*?)(?:[ ]+[\'"](.+?)[\'"])?[ ]*\)/', $substring, $matches)) - { - $Link['url'] = $matches[1]; - - if (isset($matches[2])) - { - $Link['title'] = $matches[2]; - } - - $extent += strlen($matches[0]); - } - else - { - return; - } - } - else - { - return; - } - - $url = str_replace(array('&', '<'), array('&', '<'), $Link['url']); - - if ($Excerpt['text'][0] === '!') - { - $Element = array( - 'name' => 'img', - 'attributes' => array( - 'alt' => $Link['text'], - 'src' => $url, - ), - ); - } - else - { - $Element = array( - 'name' => 'a', - 'handler' => 'line', - 'text' => $Link['text'], - 'attributes' => array( - 'href' => $url, - ), - ); - } - - if (isset($Link['title'])) - { - $Element['attributes']['title'] = $Link['title']; - } - - return array( - 'extent' => $extent, - 'element' => $Element, - ); - } - - protected function identifyEmphasis($Excerpt) - { - if ( ! isset($Excerpt['text'][1])) - { - return; - } - - $marker = $Excerpt['text'][0]; - - if ($Excerpt['text'][1] === $marker and preg_match($this->StrongRegex[$marker], $Excerpt['text'], $matches)) - { - $emphasis = 'strong'; - } - elseif (preg_match($this->EmRegex[$marker], $Excerpt['text'], $matches)) - { - $emphasis = 'em'; - } - else - { - return; - } - - return array( - 'extent' => strlen($matches[0]), - 'element' => array( - 'name' => $emphasis, - 'handler' => 'line', - 'text' => $matches[1], - ), - ); - } - - # - # ~ - - protected function readPlainText($text) - { - $breakMarker = $this->breaksEnabled ? "\n" : " \n"; - - $text = str_replace($breakMarker, "
\n", $text); - - return $text; - } - - # - # ~ - # - - protected function li($lines) - { - $markup = $this->lines($lines); - - $trimmedMarkup = trim($markup); - - if ( ! in_array('', $lines) and substr($trimmedMarkup, 0, 3) === '

') - { - $markup = $trimmedMarkup; - $markup = substr($markup, 3); - - $position = strpos($markup, "

"); - - $markup = substr_replace($markup, '', $position, 4); - } - - return $markup; - } - - # - # Multiton - # - - static function instance($name = 'default') - { - if (isset(self::$instances[$name])) - { - return self::$instances[$name]; - } - - $instance = new self(); - - self::$instances[$name] = $instance; - - return $instance; - } - - private static $instances = array(); - - # - # Deprecated Methods - # - - /** - * @deprecated in favor of "text" - */ - function parse($text) - { - $markup = $this->text($text); - - return $markup; - } - - # - # Fields - # - - protected $Definitions; - - # - # Read-only - - protected $specialCharacters = array( - '\\', '`', '*', '_', '{', '}', '[', ']', '(', ')', '>', '#', '+', '-', '.', '!', - ); - - protected $StrongRegex = array( - '*' => '/^[*]{2}((?:[^*]|[*][^*]*[*])+?)[*]{2}(?![*])/s', - '_' => '/^__((?:[^_]|_[^_]*_)+?)__(?!_)/us', - ); - - protected $EmRegex = array( - '*' => '/^[*]((?:[^*]|[*][*][^*]+?[*][*])+?)[*](?![*])/s', - '_' => '/^_((?:[^_]|__[^_]*__)+?)_(?!_)\b/us', - ); - - protected $textLevelElements = array( - 'a', 'br', 'bdo', 'abbr', 'blink', 'nextid', 'acronym', 'basefont', - 'b', 'em', 'big', 'cite', 'small', 'spacer', 'listing', - 'i', 'rp', 'del', 'code', 'strike', 'marquee', - 'q', 'rt', 'ins', 'font', 'strong', - 's', 'tt', 'sub', 'mark', - 'u', 'xm', 'sup', 'nobr', - 'var', 'ruby', - 'wbr', 'span', - 'time', - ); -} diff --git a/vendor/erusev/parsedown/README.md b/vendor/erusev/parsedown/README.md deleted file mode 100644 index a67b3ec9e..000000000 --- a/vendor/erusev/parsedown/README.md +++ /dev/null @@ -1,40 +0,0 @@ -## Parsedown - -Better [Markdown](http://en.wikipedia.org/wiki/Markdown) parser for PHP. - -* [Demo](http://parsedown.org/demo) -* [Test Suite](http://parsedown.org/tests/) - -### Features - -* [Fast](http://parsedown.org/speed) -* [Consistent](http://parsedown.org/consistency) -* [GitHub Flavored](https://help.github.com/articles/github-flavored-markdown) -* [Tested](https://travis-ci.org/erusev/parsedown) in PHP 5.2, 5.3, 5.4, 5.5, 5.6 and [hhvm](http://www.hhvm.com/) -* Extensible -* [Markdown Extra extension](https://github.com/erusev/parsedown-extra) new - -### Installation - -Include `Parsedown.php` or install [the composer package](https://packagist.org/packages/erusev/parsedown). - -### Example - -``` php -$Parsedown = new Parsedown(); - -echo $Parsedown->text('Hello _Parsedown_!'); # prints:

Hello Parsedown!

-``` - -More examples in [the wiki](https://github.com/erusev/parsedown/wiki/Usage). - -### Questions - -**How does Parsedown work?**
-Parsedown recognises that the Markdown syntax is optimised for humans so it tries to read like one. It goes through text line by line. It looks at how lines start to identify blocks. It looks for special characters to identify inline elements. - -**Why doesn’t Parsedown use namespaces?**
-Using namespaces would mean dropping support for PHP 5.2. Since Parsedown is a single class with an uncommon name, making this trade wouldn't make much sense. - -**Who uses Parsedown?**
-[phpDocumentor](http://www.phpdoc.org/), [Bolt CMS](http://bolt.cm/), [RaspberryPi.org](http://www.raspberrypi.org/) and [more](https://www.versioneye.com/php/erusev:parsedown/references). diff --git a/vendor/gregwar/cache/Gregwar/Cache/Cache.php b/vendor/gregwar/cache/Gregwar/Cache/Cache.php deleted file mode 100644 index 2dfb2b0cd..000000000 --- a/vendor/gregwar/cache/Gregwar/Cache/Cache.php +++ /dev/null @@ -1,291 +0,0 @@ - - */ -class Cache -{ - /** - * Cache directory - */ - protected $cacheDirectory; - - /** - * Use a different directory as actual cache - */ - protected $actualCacheDirectory = null; - - /** - * Prefix directories size - * - * For instance, if the file is helloworld.txt and the prefix size is - * 5, the cache file will be: h/e/l/l/o/helloworld.txt - * - * This is useful to avoid reaching a too large number of files into the - * cache system directories - */ - protected $prefixSize = 5; - - /** - * Constructs the cache system - */ - public function __construct($cacheDirectory = 'cache') - { - $this->cacheDirectory = $cacheDirectory; - } - - /** - * Sets the cache directory - * - * @param $cacheDirectory the cache directory - */ - public function setCacheDirectory($cacheDirectory) - { - $this->cacheDirectory = $cacheDirectory; - - return $this; - } - - /** - * Gets the cache directory - * - * @return string the cache directory - */ - public function getCacheDirectory() - { - return $this->cacheDirectory; - } - - /** - * Sets the actual cache directory - */ - public function setActualCacheDirectory($actualCacheDirectory = null) - { - $this->actualCacheDirectory = $actualCacheDirectory; - - return $this; - } - - /** - * Returns the actual cache directory - */ - public function getActualCacheDirectory() - { - return $this->actualCacheDirectory ?: $this->cacheDirectory; - } - - /** - * Change the prefix size - * - * @param $prefixSize the size of the prefix directories - */ - public function setPrefixSize($prefixSize) - { - $this->prefixSize = $prefixSize; - - return $this; - } - - /** - * Creates a directory - * - * @param $directory, the target directory - */ - protected function mkdir($directory) - { - if (!is_dir($directory)) { - @mkdir($directory, 0755, true); - } - } - - /** - * Gets the cache file name - * - * @param $filename, the name of the cache file - * @param $actual get the actual file or the public file - * @param $mkdir, a boolean to enable/disable the construction of the - * cache file directory - */ - public function getCacheFile($filename, $actual = false, $mkdir = false) - { - $path = array(); - - // Getting the length of the filename before the extension - $parts = explode('.', $filename); - $len = strlen($parts[0]); - - for ($i=0; $iprefixSize); $i++) { - $path[] = $filename[$i]; - - } - $path = implode('/', $path); - - $actualDir = $this->getActualCacheDirectory() . '/' . $path; - if ($mkdir && !is_dir($actualDir)) { - mkdir($actualDir, 0755, true); - } - - $path .= '/' . $filename; - - if ($actual) { - return $this->getActualCacheDirectory() . '/' . $path; - } else { - return $this->getCacheDirectory() . '/' . $path; - } - } - - /** - * Checks that the cache conditions are respected - * - * @param $cacheFile the cache file - * @param $conditions an array of conditions to check - */ - protected function checkConditions($cacheFile, array $conditions = array()) - { - // Implicit condition: the cache file should exist - if (!file_exists($cacheFile)) { - return false; - } - - foreach ($conditions as $type => $value) { - switch ($type) { - case 'maxage': - case 'max-age': - // Return false if the file is older than $value - $age = time() - filectime($cacheFile); - if ($age > $value) { - return false; - } - break; - case 'younger-than': - case 'youngerthan': - // Return false if the file is older than the file $value, or the files $value - $check = function($filename) use ($cacheFile) { - return !file_exists($filename) || filectime($cacheFile) < filectime($filename); - }; - - if (!is_array($value)) { - if (!$this->isRemote($value) && $check($value)) { - return false; - } - } else { - foreach ($value as $file) { - if (!$this->isRemote($file) && $check($file)) { - return false; - } - } - } - break; - default: - throw new \Exception('Cache condition '.$type.' not supported'); - } - } - - return true; - } - - /** - * Checks if the targt filename exists in the cache and if the conditions - * are respected - * - * @param $filename the filename - * @param $conditions the conditions to respect - */ - public function exists($filename, array $conditions = array()) - { - $cacheFile = $this->getCacheFile($filename, true); - - return $this->checkConditions($cacheFile, $conditions); - } - - /** - * Alias for exists - */ - public function check($filename, array $conditions = array()) - { - return $this->exists($filename, $conditions); - } - - /** - * Write data in the cache - */ - public function set($filename, $contents = '') - { - $cacheFile = $this->getCacheFile($filename, true, true); - - file_put_contents($cacheFile, $contents); - - return $this; - } - - /** - * Alias for set() - */ - public function write($filename, $contents = '') - { - return $this->set($filename, $contents); - } - - /** - * Get data from the cache - */ - public function get($filename, array $conditions = array()) - { - if ($this->exists($filename, $conditions)) { - return file_get_contents($this->getCacheFile($filename, true)); - } else { - return null; - } - } - - /** - * Is this URL remote? - */ - protected function isRemote($file) - { - return preg_match('/^http(s{0,1}):\/\//', $file); - } - - /** - * Get or create the cache entry - * - * @param $filename the cache file name - * @param $conditions an array of conditions about expiration - * @param $function the closure to call if the file does not exists - * @param $file returns the cache file or the file contents - * @param $actual returns the actual cache file - */ - public function getOrCreate($filename, array $conditions = array(), \Closure $function, $file = false, $actual = false) - { - $cacheFile = $this->getCacheFile($filename, true, true); - $data = null; - - if ($this->check($filename, $conditions)) { - $data = file_get_contents($cacheFile); - } else { - @unlink($cacheFile); - $data = $function($cacheFile); - - // Test if the closure wrote the file or if it returned the data - if (!file_exists($cacheFile)) { - $this->set($filename, $data); - } else { - $data = file_get_contents($cacheFile); - } - } - - return $file ? $this->getCacheFile($filename, $actual) : $data; - } - - /** - * Alias to getOrCreate with $file = true - */ - public function getOrCreateFile($filename, array $conditions = array(), \Closure $function, $actual = false) - { - return $this->getOrCreate($filename, $conditions, $function, true, $actual); - } -} diff --git a/vendor/gregwar/cache/Gregwar/Cache/GarbageCollect.php b/vendor/gregwar/cache/Gregwar/Cache/GarbageCollect.php deleted file mode 100644 index a723a51d3..000000000 --- a/vendor/gregwar/cache/Gregwar/Cache/GarbageCollect.php +++ /dev/null @@ -1,86 +0,0 @@ - - */ -class GarbageCollect -{ - /** - * Drops old files of a directory - * - * @param string $directory the name of the target directory - * @param int $days the number of days to consider a file old - * @param bool $verbose enable verbose output - * - * @return true if all the files/directories of a directory was wiped - */ - public static function dropOldFiles($directory, $days = 30, $verbose = false) - { - $allDropped = true; - $now = time(); - - $dir = opendir($directory); - - if (!$dir) { - if ($verbose) { - echo "! Unable to open $directory\n"; - } - - return false; - } - - while ($file = readdir($dir)) { - if ($file == '.' || $file == '..') { - continue; - } - - $fullName = $directory.'/'.$file; - - $old = $now-filemtime($fullName); - - if (is_dir($fullName)) { - // Directories are recursively crawled - if (static::dropOldFiles($fullName, $days, $verbose)) { - self::drop($fullName, $verbose); - } else { - $allDropped = false; - } - } else { - if ($old > (24*60*60*$days)) { - self::drop($fullName, $verbose); - } else { - $allDropped = false; - } - } - } - - closedir($dir); - - return $allDropped; - } - - /** - * Drops a file or an empty directory - * - * @param $file the file to be removed - * @param $verbose the verbosity - */ - public static function drop($file, $verbose = false) - { - if (is_dir($file)) { - @rmdir($file); - } else { - @unlink($file); - } - - if ($verbose) { - echo "> Dropping $file...\n"; - } - } - -} diff --git a/vendor/gregwar/cache/Gregwar/Cache/LICENSE b/vendor/gregwar/cache/Gregwar/Cache/LICENSE deleted file mode 100644 index 3f32e0545..000000000 --- a/vendor/gregwar/cache/Gregwar/Cache/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) <2013> Grégoire Passault - -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/vendor/gregwar/cache/Gregwar/Cache/README.md b/vendor/gregwar/cache/Gregwar/Cache/README.md deleted file mode 100644 index 616f3b656..000000000 --- a/vendor/gregwar/cache/Gregwar/Cache/README.md +++ /dev/null @@ -1,162 +0,0 @@ -Cache -===== - -This is a lightweight cache system based on file and directories. - -Usage -===== - -Step 1: Install it ------------------- - -Via composer: - -```json -{ - "require": { - "gregwar/cache": "1.0.*" - } -} -``` - -Or with a clone of the repository: - -```bash -git clone https://github.com/Gregwar/Cache.git -``` - -Or downloading it: - -* [Download .zip](https://github.com/Gregwar/Cache/archive/master.zip) -* [Download .tar.gz](https://github.com/Gregwar/Cache/archive/master.tar.gz) - -Step 2: Setup the rights ------------------------- - -You need your PHP script to have access to the cache directory, you can for instance -create a `cache` directory with mode 777: - -``` -mkdir cache -chmod 777 cache -``` - -Step 3: Access the cache ------------------------- - -To access the cache, you can do like this: - -```php -setCacheDirectory('cache'); // This is the default - -// If the cache exists, this will return it, else, the closure will be called -// to create this image -$data = $cache->getOrCreate('red-square.png', array(), function($filename) { - $i = imagecreatetruecolor(100, 100); - imagefill($i, 0, 0, 0xff0000); - imagepng($i, $filename); -}); - -header('Content-type: image/png'); -echo $data; -``` - -This will render a red square. If the cache file (which will look like `cache/r/e/d/-/s/red-square.png') -exists, it will be read, else, the closure will be called in order to create the cache file. - -API -=== - -You can use the following methods: - -* `setCacheDirectory($directory)`: sets the cache directory (see below). -* `setActualCacheDirectory($directory)`: sets the actual cache directory (see below). -* `exists($filename, $conditions = array())`: check that the $filename file exists in the cache, checking - the conditions (see below). -* `check($filename, $conditions = array())`: alias for `exists`. -* `getCacheFile($filename, $actual = false, $mkdir = false)`: gets the cache file. If the `$actual` flag - is true, the actual cache file name will be returned (see below), if the `$mkdir` flag is true, the - cache file directories tree will be created. -* `set($filename, $contents)`: write contents to `$filename` cache file. -* `write($filename, $contents)`: alias for `set()` -* `get($filename, $conditions = array())`: if the cache file for `$filename` exists, contents will be - returned, else, `NULL` will be returned. -* `setPrefixSize($prefixSize)`: sets the prefix size for directories, default is 5. For instance, the - cache file for `helloworld.txt`, will be `'h/e/l/l/o/helloworld.txt`. -* `getOrCreate($filename, $conditions = array(), $function, $file = false)`: this will check if the `$filename` - cache file exists and verifies `$conditions` (see below). If the cache file is OK, it will return its - contents. Else, it will call the `$function`, passing it the target file, this function can write the - file given in parameter or just return data. Then, cache data will be returned. If `$file` flag is set, - the cache file name will be returned instead of file data. - -Note: consider using an hash for the `$filename` cache file, to avoid special characters. - -Conditions -========== - -You can use conditions to manage file expirations on the cache, there is two way of expiring: - -* Using `max-age`, in seconds, to set the maximum age of the file -* Using `younger-than`, by passing another file, this will compare the modification date - and regenerate the cache if the given file is younger. - -For instance, if you want to uppercase a file: - -```php -getOrCreate('uppercase.txt', - array( - 'younger-than' => 'original.txt' - ), - function() { - echo "Generating file...\n"; - return strtoupper(file_get_contents('original.txt')); -}); - -echo $data; -``` - -This will be create the `uppercase.txt` cache file by uppercasing the `original.txt` if the cache file -does not exists or if the `original.txt` file is more recent than the cache file. - -For instance: - -``` -php uppercase.php # Will generate the cache file -php uppercase.php # Will not generate the cache file -touch original.txt # Sets the last modification time to now -php uppercase.php # Will re-generate the cache file -``` - -Cache directory and actual cache directory -========================================== - -In some cases, you'll want to get the cache file name. For instance, if you're caching -images, you'll want to give a string like `cache/s/o/m/e/i/someimage.png` to put it into -an `` tag. This can be done by passing the `$file` argument to the `getOrCreate` to true, -or directly using `getCacheFile` method (see above). - -However, the visible `cache` directory of your users is not the same as the absolute path -you want to access. To do that, you can set both the cache directory and the actual cache directory. - -The cache directory is the prefix visible by the users (for instance: `cache/s/o/m/e/i/someimage.png`), -and the actual cache directory is the prefix to use to actually access to the image (for instance: -`/var/www/somesite/cache/s/o/m/e/i/someimage.png`). This way, the file will be accessed using absolute -path and the cache file returned will directly be usable for your user's browsers. - -License -======= - -This repository is under the MIT license, have a look at the `LICENCE` file. diff --git a/vendor/gregwar/cache/Gregwar/Cache/autoload.php b/vendor/gregwar/cache/Gregwar/Cache/autoload.php deleted file mode 100644 index b299c887c..000000000 --- a/vendor/gregwar/cache/Gregwar/Cache/autoload.php +++ /dev/null @@ -1,16 +0,0 @@ -source = $source; - - return $this; - } - - /** - * @inheritdoc - */ - public function getResource() - { - return $this->resource; - } - - /** - * Does this adapter supports the given type ? - */ - protected function supports($type) - { - return false; - } - - /** - * Converts the image to true color - */ - protected function convertToTrueColor() - { - } -} diff --git a/vendor/gregwar/image/Gregwar/Image/Adapter/AdapterInterface.php b/vendor/gregwar/image/Gregwar/Image/Adapter/AdapterInterface.php deleted file mode 100644 index a199dd4e2..000000000 --- a/vendor/gregwar/image/Gregwar/Image/Adapter/AdapterInterface.php +++ /dev/null @@ -1,378 +0,0 @@ - - */ -interface AdapterInterface{ - /** - * set the image source for the adapter - * - * @param Source $source - * @return $this - */ - public function setSource(Source $source); - - /** - * get the raw resource - * - * @return resource - */ - public function getResource(); - - /** - * Gets the name of the adapter - * - * @return string - */ - public function getName(); - - /** - * Image width - * - * @return int - */ - public function width(); - - /** - * Image height - * - * @return int - */ - public function height(); - - /** - * Init the resource - * - * @return $this - */ - public function init(); - - /** - * Save the image as a gif - * - * @return $this - */ - public function saveGif($file); - - /** - * Save the image as a png - * - * @return $this - */ - public function savePng($file); - - /** - * Save the image as a jpeg - * - * @return $this - */ - public function saveJpeg($file, $quality); - - /** - * Works as resize() excepts that the layout will be cropped - * - * @param int $width the width - * @param int $height the height - * @param int $background the background - * - * @return $this - */ - public function cropResize($width = null, $height = null, $background=0xffffff); - - - /** - * Resize the image preserving scale. Can enlarge it. - * - * @param int $width the width - * @param int $height the height - * @param int $background the background - * @param boolean $crop - * - * @return $this - */ - public function scaleResize($width = null, $height = null, $background=0xffffff, $crop = false); - - /** - * Resizes the image. It will never be enlarged. - * - * @param int $width the width - * @param int $height the height - * @param int $background the background - * @param boolean $force - * @param boolean $rescale - * @param boolean $crop - * - * @return $this - */ - public function resize($width = null, $height = null, $background = 0xffffff, $force = false, $rescale = false, $crop = false); - - /** - * Crops the image - * - * @param int $x the top-left x position of the crop box - * @param int $y the top-left y position of the crop box - * @param int $width the width of the crop box - * @param int $height the height of the crop box - * - * @return $this - */ - public function crop($x, $y, $width, $height); - - /** - * enable progressive image loading - * - * @return $this - */ - public function enableProgressive(); - - /** - * Resizes the image forcing the destination to have exactly the - * given width and the height - * - * @param int $width the width - * @param int $height the height - * @param int $background the background - * - * @return $this - */ - public function forceResize($width = null, $height = null, $background = 0xffffff); - - /** - * Perform a zoom crop of the image to desired width and height - * - * @param integer $width Desired width - * @param integer $height Desired height - * @param int $background - * - * @return $this - */ - public function zoomCrop($width, $height, $background = 0xffffff); - - - /** - * Fills the image background to $bg if the image is transparent - * - * @param int $background background color - * - * @return $this - */ - public function fillBackground($background = 0xffffff); - - - /** - * Negates the image - * - * @return $this - */ - public function negate(); - - /** - * Changes the brightness of the image - * - * @param int $brightness the brightness - * - * @return $this - */ - public function brightness($brightness); - - /** - * Contrasts the image - * - * @param int $contrast the contrast [-100, 100] - * - * @return $this - */ - public function contrast($contrast); - - /** - * Apply a grayscale level effect on the image - * - * @return $this - */ - public function grayscale(); - - /** - * Emboss the image - * - * @return $this - */ - public function emboss(); - - /** - * Smooth the image - * - * @param int $p value between [-10,10] - * - * @return $this - */ - public function smooth($p); - - /** - * Sharps the image - * - * @return $this - */ - public function sharp(); - - /** - * Edges the image - * - * @return $this - */ - public function edge(); - - /** - * Colorize the image - * - * @param int $red value in range [-255, 255] - * @param int $green value in range [-255, 255] - * @param int $blue value in range [-255, 255] - * - * @return $this - */ - public function colorize($red, $green, $blue); - - /** - * apply sepia to the image - * - * @return $this - */ - public function sepia(); - - /** - * Merge with another image - * - * @param Image $other - * @param int $x - * @param int $y - * @param int $width - * @param int $height - * - * @return $this - */ - public function merge(Image $other, $x = 0, $y = 0, $width = null, $height = null); - - /** - * Rotate the image - * - * @param float $angle - * @param int $background - * - * @return $this - */ - public function rotate($angle, $background = 0xffffff); - - /** - * Fills the image - * - * @param int $color - * @param int $x - * @param int $y - * - * @return $this - */ - public function fill($color = 0xffffff, $x = 0, $y = 0); - - /** - * write text to the image - * - * @param string $font - * @param string $text - * @param int $x - * @param int $y - * @param int $size - * @param int $angle - * @param int $color - * @param string $align - */ - public function write($font, $text, $x = 0, $y = 0, $size = 12, $angle = 0, $color = 0x000000, $align = 'left'); - - /** - * Draws a rectangle - * - * @param int $x1 - * @param int $y1 - * @param int $x2 - * @param int $y2 - * @param int $color - * @param bool $filled - * - * @return $this - */ - public function rectangle($x1, $y1, $x2, $y2, $color, $filled = false); - - /** - * Draws a rounded rectangle - * - * @param int $x1 - * @param int $y1 - * @param int $x2 - * @param int $y2 - * @param int $radius - * @param int $color - * @param bool $filled - * - * @return $this - */ - public function roundedRectangle($x1, $y1, $x2, $y2, $radius, $color, $filled = false); - - /** - * Draws a line - * - * @param int $x1 - * @param int $y1 - * @param int $x2 - * @param int $y2 - * @param int $color - * - * @return $this - */ - public function line($x1, $y1, $x2, $y2, $color = 0x000000); - - /** - * Draws an ellipse - * - * @param int $cx - * @param int $cy - * @param int $width - * @param int $height - * @param int $color - * @param bool $filled - * - * @return $this - */ - public function ellipse($cx, $cy, $width, $height, $color = 0x000000, $filled = false); - - /** - * Draws a circle - * - * @param int $cx - * @param int $cy - * @param int $r - * @param int $color - * @param bool $filled - * - * @return $this - */ - public function circle($cx, $cy, $r, $color = 0x000000, $filled = false); - - /** - * Draws a polygon - * - * @param array $points - * @param int $color - * @param bool $filled - * - * @return $this - */ - public function polygon(array $points, $color, $filled = false); -} diff --git a/vendor/gregwar/image/Gregwar/Image/Adapter/Common.php b/vendor/gregwar/image/Gregwar/Image/Adapter/Common.php deleted file mode 100644 index d04b17870..000000000 --- a/vendor/gregwar/image/Gregwar/Image/Adapter/Common.php +++ /dev/null @@ -1,275 +0,0 @@ -width() / $this->height(); - $newRatio = $width / $height; - - // Compare ratios - if ($originalRatio > $newRatio) { - // Original image is wider - $newHeight = $height; - $newWidth = (int) $height * $originalRatio; - } else { - // Equal width or smaller - $newHeight = (int) $width / $originalRatio; - $newWidth = $width; - } - - // Perform resize - $this->resize($newWidth, $newHeight, $background, true); - - // Calculate cropping area - $xPos = (int) ($newWidth - $width) / 2; - $yPos = (int) ($newHeight - $height) / 2; - - // Crop image to reach desired size - $this->crop($xPos, $yPos, $width, $height); - - return $this; - } - - /** - * Resizes the image forcing the destination to have exactly the - * given width and the height - * - * @param int $w the width - * @param int $h the height - * @param int $bg the background - */ - public function forceResize($width = null, $height = null, $background = 'transparent') - { - return $this->resize($width, $height, $background, true); - } - - /** - * @inheritdoc - */ - public function scaleResize($width = null, $height = null, $background='transparent', $crop = false) - { - return $this->resize($width, $height, $background, false, true, $crop); - } - - /** - * @inheritdoc - */ - public function cropResize($width = null, $height = null, $background='transparent') - { - return $this->resize($width, $height, $background, false, false, true); - } - - /** - * Opens the image - */ - abstract protected function openGif($file); - abstract protected function openJpeg($file); - abstract protected function openPng($file); - - /** - * Creates an image - */ - abstract protected function createImage($width, $height); - - /** - * Creating an image using $data - */ - abstract protected function createImageFromData($data); - - /** - * Loading image from $resource - */ - protected function loadResource($resource) - { - $this->resource = $resource; - } - - protected function loadFile($file, $type) - { - if (!$this->supports($type)) { - throw new \RuntimeException('Type '.$type.' is not supported by GD'); - } - - if ($type == 'jpeg') { - $this->openJpeg($file); - } - - if ($type == 'gif') { - $this->openGif($file); - } - - if ($type == 'png') { - $this->openPng($file); - } - - if (false === $this->resource) { - throw new \UnexpectedValueException('Unable to open file ('.$file.')'); - } else { - $this->convertToTrueColor(); - } - } - - /** - * @inheritdoc - */ - public function init() - { - $source = $this->source; - - if ($source instanceof \Gregwar\Image\Source\File) { - $this->loadFile($source->getFile(), $source->guessType()); - } else if ($source instanceof \Gregwar\Image\Source\Create) { - $this->createImage($source->getWidth(), $source->getHeight()); - } else if ($source instanceof \Gregwar\Image\Source\Data) { - $this->createImageFromData($source->getData()); - } else if ($source instanceof \Gregwar\Image\Source\Resource) { - $this->loadResource($source->getResource()); - } else { - throw new \Exception('Unsupported image source type '.get_class($source)); - } - - return $this; - } - - /** - * @inheritdoc - */ - public function resize($width = null, $height = null, $background = 'transparent', $force = false, $rescale = false, $crop = false) - { - $current_width = $this->width(); - $current_height = $this->height(); - $new_width = 0; - $new_height = 0; - $scale = 1.0; - - if ($height === null && preg_match('#^(.+)%$#mUsi', $width, $matches)) { - $width = round($current_width * ((float)$matches[1]/100.0)); - $height = round($current_height * ((float)$matches[1]/100.0)); - } - - if (!$rescale && (!$force || $crop)) { - if ($width!=null && $current_width>$width) { - $scale = $current_width/$width; - } - - if ($height!=null && $current_height>$height) { - if ($current_height/$height > $scale) - $scale = $current_height/$height; - } - } else { - if ($width!=null) { - $scale = $current_width/$width; - $new_width = $width; - } - - if ($height!=null) { - if ($width!=null && $rescale) { - $scale = max($scale,$current_height/$height); - } else { - $scale = $current_height/$height; - } - $new_height = $height; - } - } - - if (!$force || $width==null || $rescale) { - $new_width = round($current_width/$scale); - } - - if (!$force || $height==null || $rescale) { - $new_height = round($current_height/$scale); - } - - if ($width == null || $crop) { - $width = $new_width; - } - - if ($height == null || $crop) { - $height = $new_height; - } - - $this->doResize($background, $width, $height, $new_width, $new_height); - } - - /** - * Trim background color arround the image - * - * @param int $bg the background - */ - protected function _trimColor($background='transparent') - { - $width = $this->width(); - $height = $this->height(); - - $b_top = 0; - $b_lft = 0; - $b_btm = $height - 1; - $b_rt = $width - 1; - - //top - for(; $b_top < $height; ++$b_top) { - for($x = 0; $x < $width; ++$x) { - if ($this->getColor($x, $b_top) != $background) { - break 2; - } - } - } - - // bottom - for(; $b_btm >= 0; --$b_btm) { - for($x = 0; $x < $width; ++$x) { - if ($this->getColor($x, $b_btm) != $background) { - break 2; - } - } - } - - // left - for(; $b_lft < $width; ++$b_lft) { - for($y = $b_top; $y <= $b_btm; ++$y) { - if ($this->getColor($b_lft, $y) != $background) { - break 2; - } - } - } - - // right - for(; $b_rt >= 0; --$b_rt) { - for($y = $b_top; $y <= $b_btm; ++$y) { - if ($this->getColor($b_rt, $y) != $background) { - break 2; - } - } - } - - $b_btm++; - $b_rt++; - - $this->crop($b_lft, $b_top, $b_rt - $b_lft, $b_btm - $b_top); - } - - /** - * Resizes the image to an image having size of $target_width, $target_height, using - * $new_width and $new_height and padding with $bg color - */ - abstract protected function doResize($bg, $target_width, $target_height, $new_width, $new_height); - - /** - * Gets the color of the $x, $y pixel - */ - abstract protected function getColor($x, $y); - - /** - * @inheritdoc - */ - public function enableProgressive(){ - throw new \Exception('The Adapter '.$this->getName().' does not support Progressive Image loading'); - } -} diff --git a/vendor/gregwar/image/Gregwar/Image/Adapter/GD.php b/vendor/gregwar/image/Gregwar/Image/Adapter/GD.php deleted file mode 100644 index a3d5cb6b6..000000000 --- a/vendor/gregwar/image/Gregwar/Image/Adapter/GD.php +++ /dev/null @@ -1,516 +0,0 @@ - \IMG_JPG, - 'gif' => \IMG_GIF, - 'png' => \IMG_PNG, - ); - - protected function loadResource($resource) - { - parent::loadResource($resource); - imagesavealpha($this->resource, true); - } - - /** - * Gets the width and the height for writing some text - */ - public static function TTFBox($font, $text, $size, $angle = 0) - { - $box = imagettfbbox($size, $angle, $font, $text); - - return array( - 'width' => abs($box[2] - $box[0]), - 'height' => abs($box[3] - $box[5]) - ); - } - - public function __construct() - { - parent::__construct(); - - if (!(extension_loaded('gd') && function_exists('gd_info'))) { - throw new \RuntimeException('You need to install GD PHP Extension to use this library'); - } - } - - /** - * @inheritdoc - */ - public function getName() - { - return 'GD'; - } - - /** - * @inheritdoc - */ - public function fillBackground($background = 0xffffff) - { - $w = $this->width(); - $h = $this->height(); - $n = imagecreatetruecolor($w, $h); - imagefill($n, 0, 0, ImageColor::gdAllocate($this->resource, $background)); - imagecopyresampled($n, $this->resource, 0, 0, 0, 0, $w, $h, $w, $h); - imagedestroy($this->resource); - $this->resource = $n; - - return $this; - } - - /** - * Do the image resize - * - * @return $this - */ - protected function doResize($bg, $target_width, $target_height, $new_width, $new_height) - { - $width = $this->width(); - $height = $this->height(); - $n = imagecreatetruecolor($target_width, $target_height); - - if ($bg != 'transparent') { - imagefill($n, 0, 0, ImageColor::gdAllocate($this->resource, $bg)); - } else { - imagealphablending($n, false); - $color = ImageColor::gdAllocate($this->resource, 'transparent'); - - imagefill($n, 0, 0, $color); - imagesavealpha($n, true); - } - - imagecopyresampled($n, $this->resource, ($target_width-$new_width)/2, ($target_height-$new_height)/2, 0, 0, $new_width, $new_height, $width, $height); - imagedestroy($this->resource); - - $this->resource = $n; - - return $this; - } - - /** - * @inheritdoc - */ - public function crop($x, $y, $width, $height) - { - $destination = imagecreatetruecolor($width, $height); - imagealphablending($destination, false); - imagesavealpha($destination, true); - imagecopy($destination, $this->resource, 0, 0, $x, $y, $this->width(), $this->height()); - imagedestroy($this->resource); - $this->resource = $destination; - - return $this; - } - - /** - * @inheritdoc - */ - public function negate() - { - imagefilter($this->resource, IMG_FILTER_NEGATE); - return $this; - } - - /** - * @inheritdoc - */ - public function brightness($brightness) - { - imagefilter($this->resource, IMG_FILTER_BRIGHTNESS, $brightness); - return $this; - } - - /** - * @inheritdoc - */ - public function contrast($contrast) - { - imagefilter($this->resource, IMG_FILTER_CONTRAST, $contrast); - return $this; - } - - /** - * @inheritdoc - */ - public function grayscale() - { - imagefilter($this->resource, IMG_FILTER_GRAYSCALE); - return $this; - } - - /** - * @inheritdoc - */ - public function emboss() - { - imagefilter($this->resource, IMG_FILTER_EMBOSS); - return $this; - } - - /** - * @inheritdoc - */ - public function smooth($p) - { - imagefilter($this->resource, IMG_FILTER_SMOOTH, $p); - return $this; - } - - /** - * @inheritdoc - */ - public function sharp() - { - imagefilter($this->resource, IMG_FILTER_MEAN_REMOVAL); - return $this; - } - - /** - * @inheritdoc - */ - public function edge() - { - imagefilter($this->resource, IMG_FILTER_EDGEDETECT); - return $this; - } - - /** - * @inheritdoc - */ - public function colorize($red, $green, $blue) - { - imagefilter($this->resource, IMG_FILTER_COLORIZE, $red, $green, $blue); - return $this; - } - - /** - * @inheritdoc - */ - public function sepia() - { - imagefilter($this->resource, IMG_FILTER_GRAYSCALE); - imagefilter($this->resource, IMG_FILTER_COLORIZE, 100, 50, 0); - return $this; - } - - /** - * @inheritdoc - */ - public function merge(Image $other, $x = 0, $y = 0, $width = null, $height = null) - { - $other = clone $other; - $other->init(); - $other->applyOperations(); - - imagealphablending($this->resource, true); - - if (null == $width) { - $width = $other->width(); - } - - if (null == $height) { - $height = $other->height(); - } - - imagecopyresampled($this->resource, $other->getAdapter()->getResource(), $x, $y, 0, 0, $width, $height, $width, $height); - - return $this; - } - - /** - * @inheritdoc - */ - public function rotate($angle, $background = 0xffffff) - { - $this->resource = imagerotate($this->resource, $angle, ImageColor::gdAllocate($this->resource, $background)); - imagealphablending($this->resource, true); - imagesavealpha($this->resource, true); - - return $this; - } - - /** - * @inheritdoc - */ - public function fill($color = 0xffffff, $x = 0, $y = 0) - { - imagealphablending($this->resource, false); - imagefill($this->resource, $x, $y, ImageColor::gdAllocate($this->resource, $color)); - - return $this; - } - - /** - * @inheritdoc - */ - public function write($font, $text, $x = 0, $y = 0, $size = 12, $angle = 0, $color = 0x000000, $align = 'left') - { - imagealphablending($this->resource, true); - - if ($align != 'left') { - $sim_size = self::TTFBox($font, $text, $size, $angle); - - if ($align == 'center') { - $x -= $sim_size['width'] / 2; - } - - if ($align == 'right') { - $x -= $sim_size['width']; - } - } - - imagettftext($this->resource, $size, $angle, $x, $y, ImageColor::gdAllocate($this->resource, $color), $font, $text); - - return $this; - } - - /** - * @inheritdoc - */ - public function rectangle($x1, $y1, $x2, $y2, $color, $filled = false) - { - if ($filled) { - imagefilledrectangle($this->resource, $x1, $y1, $x2, $y2, ImageColor::gdAllocate($this->resource, $color)); - } else { - imagerectangle($this->resource, $x1, $y1, $x2, $y2, ImageColor::gdAllocate($this->resource, $color)); - } - - return $this; - } - - /** - * @inheritdoc - */ - public function roundedRectangle($x1, $y1, $x2, $y2, $radius, $color, $filled = false) { - if ($color) { - $color = ImageColor::gdAllocate($this->resource, $color); - } - - if ($filled == true) { - imagefilledrectangle($this->resource, $x1+$radius, $y1, $x2-$radius, $y2, $color); - imagefilledrectangle($this->resource, $x1, $y1+$radius, $x1+$radius-1, $y2-$radius, $color); - imagefilledrectangle($this->resource, $x2-$radius+1, $y1+$radius, $x2, $y2-$radius, $color); - - imagefilledarc($this->resource,$x1+$radius, $y1+$radius, $radius*2, $radius*2, 180 , 270, $color, IMG_ARC_PIE); - imagefilledarc($this->resource,$x2-$radius, $y1+$radius, $radius*2, $radius*2, 270 , 360, $color, IMG_ARC_PIE); - imagefilledarc($this->resource,$x1+$radius, $y2-$radius, $radius*2, $radius*2, 90 , 180, $color, IMG_ARC_PIE); - imagefilledarc($this->resource,$x2-$radius, $y2-$radius, $radius*2, $radius*2, 360 , 90, $color, IMG_ARC_PIE); - } else { - imageline($this->resource, $x1+$radius, $y1, $x2-$radius, $y1, $color); - imageline($this->resource, $x1+$radius, $y2, $x2-$radius, $y2, $color); - imageline($this->resource, $x1, $y1+$radius, $x1, $y2-$radius, $color); - imageline($this->resource, $x2, $y1+$radius, $x2, $y2-$radius, $color); - - imagearc($this->resource,$x1+$radius, $y1+$radius, $radius*2, $radius*2, 180 , 270, $color); - imagearc($this->resource,$x2-$radius, $y1+$radius, $radius*2, $radius*2, 270 , 360, $color); - imagearc($this->resource,$x1+$radius, $y2-$radius, $radius*2, $radius*2, 90 , 180, $color); - imagearc($this->resource,$x2-$radius, $y2-$radius, $radius*2, $radius*2, 360 , 90, $color); - } - - return $this; - } - - /** - * @inheritdoc - */ - public function line($x1, $y1, $x2, $y2, $color = 0x000000) - { - imageline($this->resource, $x1, $y1, $x2, $y2, ImageColor::gdAllocate($this->resource, $color)); - - return $this; - } - - /** - * @inheritdoc - */ - public function ellipse($cx, $cy, $width, $height, $color = 0x000000, $filled = false) - { - if ($filled) { - imagefilledellipse($this->resource, $cx, $cy, $width, $height, ImageColor::gdAllocate($this->resource, $color)); - } else { - imageellipse($this->resource, $cx, $cy, $width, $height, ImageColor::gdAllocate($this->resource, $color)); - } - - return $this; - } - - /** - * @inheritdoc - */ - public function circle($cx, $cy, $r, $color = 0x000000, $filled = false) - { - return $this->ellipse($cx, $cy, $r, $r, ImageColor::gdAllocate($this->resource, $color), $filled); - } - - /** - * @inheritdoc - */ - public function polygon(array $points, $color, $filled = false) - { - if ($filled) { - imagefilledpolygon($this->resource, $points, count($points)/2, ImageColor::gdAllocate($this->resource, $color)); - } else { - imagepolygon($this->resource, $points, count($points)/2, ImageColor::gdAllocate($this->resource, $color)); - } - - return $this; - } - - /** - * @inheritdoc - */ - public function width() - { - if (null === $this->resource) { - $this->init(); - } - - return imagesx($this->resource); - } - - /** - * @inheritdoc - */ - public function height() - { - if (null === $this->resource) { - $this->init(); - } - - return imagesy($this->resource); - } - - protected function createImage($width, $height) - { - $this->resource = imagecreatetruecolor($width, $height); - } - - protected function createImageFromData($data) - { - $this->resource = @imagecreatefromstring($data); - } - - /** - * Converts the image to true color - */ - protected function convertToTrueColor() - { - if (!imageistruecolor($this->resource)) { - if (function_exists('imagepalettetotruecolor')) { - // Available in PHP 5.5 - imagepalettetotruecolor($this->resource); - } else { - $transparentIndex = imagecolortransparent($this->resource); - - $w = $this->width(); - $h = $this->height(); - - $img = imagecreatetruecolor($w, $h); - imagecopy($img, $this->resource, 0, 0, 0, 0, $w, $h); - - if ($transparentIndex != -1) { - $width = $this->width(); - $height = $this->height(); - - imagealphablending($img, false); - imagesavealpha($img, true); - - for ($x=0; $x<$width; $x++) { - for ($y=0; $y<$height; $y++) { - if (imagecolorat($this->resource, $x, $y) == $transparentIndex) { - imagesetpixel($img, $x, $y, 127 << 24); - } - } - } - } - - $this->resource = $img; - } - } - - imagesavealpha($this->resource, true); - } - - /** - * @inheritdoc - */ - public function saveGif($file) - { - $transColor = imagecolorallocatealpha($this->resource, 255, 255, 255, 127); - imagecolortransparent($this->resource, $transColor); - imagegif($this->resource, $file); - return $this; - } - - /** - * @inheritdoc - */ - public function savePng($file) - { - imagepng($this->resource, $file); - return $this; - } - - /** - * @inheritdoc - */ - public function saveJpeg($file, $quality) - { - imagejpeg($this->resource, $file, $quality); - return $this; - } - - /** - * Try to open the file using jpeg - * - */ - protected function openJpeg($file) - { - $this->resource = @imagecreatefromjpeg($file); - } - - /** - * Try to open the file using gif - */ - protected function openGif($file) - { - $this->resource = @imagecreatefromgif($file); - } - - /** - * Try to open the file using PNG - */ - protected function openPng($file) - { - $this->resource = @imagecreatefrompng($file); - } - - /** - * Does this adapter supports type ? - */ - protected function supports($type) - { - return (imagetypes() & self::$gdTypes[$type]); - } - - protected function getColor($x, $y) - { - return imagecolorat($this->resource, $x, $y); - } - - /** - * @inheritdoc - */ - public function enableProgressive(){ - imageinterlace($this->resource, 1); - - return $this; - } -} diff --git a/vendor/gregwar/image/Gregwar/Image/Adapter/Imagick.php b/vendor/gregwar/image/Gregwar/Image/Adapter/Imagick.php deleted file mode 100644 index a04afbfcb..000000000 --- a/vendor/gregwar/image/Gregwar/Image/Adapter/Imagick.php +++ /dev/null @@ -1,382 +0,0 @@ -newNewFile = $newNewFile; - } - - public function getNewFile() - { - return $this->newNewFile; - } -} diff --git a/vendor/gregwar/image/Gregwar/Image/GarbageCollect.php b/vendor/gregwar/image/Gregwar/Image/GarbageCollect.php deleted file mode 100644 index 839c4b588..000000000 --- a/vendor/gregwar/image/Gregwar/Image/GarbageCollect.php +++ /dev/null @@ -1,83 +0,0 @@ - - */ -class GarbageCollect -{ - /** - * Drops old files of a directory - * - * @param string $directory the name of the target directory - * @param int $days the number of days to consider a file old - * @param bool $verbose enable verbose output - * - * @return true if all the files/directories of a directory was wiped - */ - public static function dropOldFiles($directory, $days = 30, $verbose = false) - { - $allDropped = true; - $now = time(); - - $dir = opendir($directory); - - if (!$dir) { - if ($verbose) { - echo "! Unable to open $directory\n"; - } - - return false; - } - - while ($file = readdir($dir)) { - if ($file == '.' || $file == '..') { - continue; - } - - $fullName = $directory.'/'.$file; - - $old = $now-filemtime($fullName); - - if (is_dir($fullName)) { - // Directories are recursively crawled - if (static::dropOldFiles($fullName, $days, $verbose)) { - self::drop($fullName, $verbose); - } else { - $allDropped = false; - } - } else { - if ($old > (24*60*60*$days)) { - self::drop($fullName, $verbose); - } else { - $allDropped = false; - } - } - } - - closedir($dir); - - return $allDropped; - } - - /** - * Drops a file or an empty directory - */ - public static function drop($file, $verbose = false) - { - if (is_dir($file)) { - @rmdir($file); - } else { - @unlink($file); - } - - if ($verbose) { - echo "> Dropping $file...\n"; - } - } - -} diff --git a/vendor/gregwar/image/Gregwar/Image/Image.php b/vendor/gregwar/image/Gregwar/Image/Image.php deleted file mode 100644 index 44ab9c449..000000000 --- a/vendor/gregwar/image/Gregwar/Image/Image.php +++ /dev/null @@ -1,717 +0,0 @@ - - * - * @method Image saveGif($file) - * @method Image savePng($file) - * @method Image saveJpeg($file, $quality) - * @method Image cropResize($width = null, $height = null, $background=0xffffff) - * @method Image scale($width = null, $height = null, $background=0xffffff, $crop = false) - * @method Image ($width = null, $height = null, $background = 0xffffff, $force = false, $rescale = false, $crop = false) - * @method Image crop($x, $y, $width, $height) - * @method Image enableProgressive() - * @method Image force($width = null, $height = null, $background = 0xffffff) - * @method Image zoomCrop($width, $height, $background = 0xffffff) - * @method Image fillBackground($background = 0xffffff) - * @method Image negate() - * @method Image brightness($brightness) - * @method Image contrast($contrast) - * @method Image grayscale() - * @method Image emboss() - * @method Image smooth($p) - * @method Image sharp() - * @method Image edge() - * @method Image colorize($red, $green, $blue) - * @method Image sepia() - * @method Image merge(Image $other, $x = 0, $y = 0, $width = null, $height = null) - * @method Image rotate($angle, $background = 0xffffff) - * @method Image fill($color = 0xffffff, $x = 0, $y = 0) - * @method Image write($font, $text, $x = 0, $y = 0, $size = 12, $angle = 0, $color = 0x000000, $align = 'left') - * @method Image rectangle($x1, $y1, $x2, $y2, $color, $filled = false) - * @method Image roundedRectangle($x1, $y1, $x2, $y2, $radius, $color, $filled = false) - * @method Image line($x1, $y1, $x2, $y2, $color = 0x000000) - * @method Image ellipse($cx, $cy, $width, $height, $color = 0x000000, $filled = false) - * @method Image circle($cx, $cy, $r, $color = 0x000000, $filled = false) - * @method Image polygon(array $points, $color, $filled = false) - */ -class Image -{ - /** - * Direcory to use for file caching - */ - protected $cacheDir = 'cache/images'; - - /** - * Internal adapter - * - * @var AdapterInterface - */ - protected $adapter = null; - - /** - * Pretty name for the image - */ - protected $prettyName = ''; - protected $prettyPrefix; - - /** - * Transformations hash - */ - protected $hash = null; - - /** - * The image source - */ - protected $source = null; - - /** - * Force image caching, even if there is no operation applied - */ - protected $forceCache = true; - - /** - * Supported types - */ - public static $types = array( - 'jpg' => 'jpeg', - 'jpeg' => 'jpeg', - 'png' => 'png', - 'gif' => 'gif', - ); - - /** - * Fallback image - */ - protected $fallback; - - /** - * Use fallback image - */ - protected $useFallbackImage = true; - - /** - * Cache system - */ - protected $cache; - - /** - * Change the caching directory - */ - public function setCacheDir($cacheDir) - { - $this->cache->setCacheDirectory($cacheDir); - - return $this; - } - - /** - * Enable or disable to force cache even if the file is unchanged - */ - public function setForceCache($forceCache = true) - { - $this->forceCache = $forceCache; - - return $this; - } - - /** - * The actual cache dir - */ - public function setActualCacheDir($actualCacheDir) - { - $this->cache->setActualCacheDirectory($actualCacheDir); - - return $this; - } - - /** - * Sets the pretty name of the image - */ - public function setPrettyName($name, $prefix = true) - { - $name = strtolower($name); - $name = str_replace(' ', '-', $name); - $this->prettyName = preg_replace('/([^a-z0-9\-]+)/m', '', $name); - $this->prettyPrefix = $prefix; - - return $this; - } - - /** - * Operations array - */ - protected $operations = array(); - - public function __construct($originalFile = null, $width = null, $height = null) - { - $this->cache = new \Gregwar\Cache\Cache; - $this->cache->setCacheDirectory($this->cacheDir); - - $this->setFallback(null); - - if ($originalFile) { - $this->source = new Source\File($originalFile); - } else { - $this->source = new Source\Create($width, $height); - } - } - - /** - * Sets the image data - */ - public function setData($data) - { - $this->source = new Source\Data($data); - } - - /** - * Sets the resource - */ - public function setResource($resource) - { - $this->source = new Source\Resource($resource); - } - - /** - * Use the fallback image or not - */ - public function useFallback($useFallbackImage = true) - { - $this->useFallbackImage = $useFallbackImage; - - return $this; - } - - /** - * Sets the fallback image to use - */ - public function setFallback($fallback = null) - { - if ($fallback === null) { - $this->fallback = __DIR__ . '/images/error.jpg'; - } else { - $this->fallback = $fallback; - } - - return $this; - } - - /** - * Gets the fallack image path - */ - public function getFallback() - { - return $this->fallback; - } - - /** - * Gets the fallback into the cache dir - */ - public function getCacheFallback() - { - $fallback = $this->fallback; - - return $this->cache->getOrCreateFile('fallback.jpg', array(), function($target) use ($fallback) { - copy($fallback, $target); - }); - } - - /** - * @return AdapterInterface - */ - public function getAdapter() - { - if (null === $this->adapter) { - // Defaults to GD - $this->setAdapter('gd'); - } - - return $this->adapter; - } - - public function setAdapter($adapter) - { - if ($adapter instanceof Adapter\Adapter) { - $this->adapter = $adapter; - } else { - if (is_string($adapter)) { - $adapter = strtolower($adapter); - - switch ($adapter) { - case 'gd': - $this->adapter = new Adapter\GD(); - break; - case 'imagemagick': - case 'imagick': - $this->adapter = new Adapter\Imagick(); - break; - default: - throw new \Exception('Unknown adapter: '.$adapter); - break; - } - } else { - throw new \Exception('Unable to load the given adapter (not string or Adapter)'); - } - } - - $this->adapter->setSource($this->source); - } - - /** - * Get the file path - * - * @return mixed a string with the filen name, null if the image - * does not depends on a file - */ - public function getFilePath() - { - if ($this->source instanceof Source\File) { - return $this->source->getFile(); - } else { - return null; - } - } - - /** - * Defines the file only after instantiation - * - * @param string $originalFile the file path - */ - public function fromFile($originalFile) - { - $this->source = new Source\File($originalFile); - - return $this; - } - - /** - * Tells if the image is correct - */ - public function correct() - { - return $this->source->correct(); - } - - /** - * Guess the file type - */ - public function guessType() - { - return $this->source->guessType(); - } - - /** - * Adds an operation - */ - protected function addOperation($method, $args) - { - $this->operations[] = array($method, $args); - } - - /** - * Generic function - */ - public function __call($methodName, $args) - { - $adapter = $this->getAdapter(); - $reflection = new \ReflectionClass(get_class($adapter)); - - if ($reflection->hasMethod($methodName)) { - $method = $reflection->getMethod($methodName); - - if ($method->getNumberOfRequiredParameters() > count($args)) { - throw new \InvalidArgumentException('Not enough arguments given for '.$methodName); - } - - $this->addOperation($methodName, $args); - - return $this; - } - - throw new \BadFunctionCallException('Invalid method: '.$methodName); - } - - /** - * Serialization of operations - */ - public function serializeOperations() - { - $datas = array(); - - foreach ($this->operations as $operation) { - $method = $operation[0]; - $args = $operation[1]; - - foreach ($args as &$arg) { - if ($arg instanceof self) { - $arg = $arg->getHash(); - } - } - - $datas[] = array($method, $args); - } - - return serialize($datas); - } - - /** - * Generates the hash - */ - public function generateHash($type = 'guess', $quality = 80) - { - $inputInfos = $this->source->getInfos(); - - $datas = array( - $inputInfos, - $this->serializeOperations(), - $type, - $quality - ); - - $this->hash = sha1(serialize($datas)); - } - - /** - * Gets the hash - */ - public function getHash($type = 'guess', $quality = 80) - { - if (null === $this->hash) { - $this->generateHash($type, $quality); - } - - return $this->hash; - } - - /** - * Gets the cache file name and generate it if it does not exists. - * Note that if it exists, all the image computation process will - * not be done. - * - * @param string $type the image type - * @param int $quality the quality (for JPEG) - */ - public function cacheFile($type = 'jpg', $quality = 80, $actual = false) - { - if ($type == 'guess') { - $type = $this->guessType(); - } - - if (!count($this->operations) && $type == $this->guessType() && !$this->forceCache) { - return $this->getFilename($this->getFilePath()); - } - - // Computes the hash - $this->hash = $this->getHash($type, $quality); - - // Generates the cache file - $cacheFile = ''; - - if (!$this->prettyName || $this->prettyPrefix) { - $cacheFile .= $this->hash; - } - - if ($this->prettyPrefix) { - $cacheFile .= '-'; - } - - if ($this->prettyName) { - $cacheFile .= $this->prettyName; - } - - $cacheFile .= '.'.$type; - - // If the files does not exists, save it - $image = $this; - - // Target file should be younger than all the current image - // dependencies - $conditions = array( - 'younger-than' => $this->getDependencies() - ); - - // The generating function - $generate = function($target) use ($image, $type, $quality) { - $result = $image->save($target, $type, $quality); - - if ($result != $target) { - throw new GenerationError($result); - } - }; - - // Asking the cache for the cacheFile - try { - $file = $this->cache->getOrCreateFile($cacheFile, $conditions, $generate, $actual); - } catch (GenerationError $e) { - $file = $e->getNewFile(); - } - - if ($actual) { - return $file; - } else { - return $this->getFilename($file); - } - } - - /** - * Get cache data (to render the image) - * - * @param string $type the image type - * @param int $quality the quality (for JPEG) - */ - public function cacheData($type = 'jpg', $quality = 80) - { - return file_get_contents($this->cacheFile($type, $quality)); - } - - /** - * Hook to helps to extends and enhance this class - */ - protected function getFilename($filename) - { - return $filename; - } - - /** - * Generates and output a jpeg cached file - */ - public function jpeg($quality = 80) - { - return $this->cacheFile('jpg', $quality); - } - - /** - * Generates and output a gif cached file - */ - public function gif() - { - return $this->cacheFile('gif'); - } - - /** - * Generates and output a png cached file - */ - public function png() - { - return $this->cacheFile('png'); - } - - /** - * Generates and output an image using the same type as input - */ - public function guess($quality = 80) - { - return $this->cacheFile('guess', $quality); - } - - /** - * Get all the files that this image depends on - * - * @return string[] this is an array of strings containing all the files that the - * current Image depends on - */ - public function getDependencies() - { - $dependencies = array(); - - $file = $this->getFilePath(); - if ($file) { - $dependencies[] = $file; - } - - foreach ($this->operations as $operation) { - foreach ($operation[1] as $argument) { - if ($argument instanceof self) { - $dependencies = array_merge($dependencies, $argument->getDependencies()); - } - } - } - - return $dependencies; - } - - /** - * Applies the operations - */ - public function applyOperations() - { - // Renders the effects - foreach ($this->operations as $operation) { - call_user_func_array(array($this->adapter, $operation[0]), $operation[1]); - } - } - - /** - * Initialize the adapter - */ - public function init() - { - $this->getAdapter()->init(); - } - - /** - * Save the file to a given output - */ - public function save($file, $type = 'guess', $quality = 80) - { - if ($file) { - $directory = dirname($file); - - if (!is_dir($directory)) { - @mkdir($directory, 0777, true); - } - } - - if (is_int($type)) { - $quality = $type; - $type = 'jpeg'; - } - - if ($type == 'guess') { - $type = $this->guessType(); - } - - if (!isset(self::$types[$type])) { - throw new \InvalidArgumentException('Given type ('.$type.') is not valid'); - } - - $type = self::$types[$type]; - - try { - $this->init(); - $this->applyOperations(); - - $success = false; - - if (null == $file) { - ob_start(); - } - - if ($type == 'jpeg') { - $success = $this->getAdapter()->saveJpeg($file, $quality); - } - - if ($type == 'gif') { - $success = $this->getAdapter()->saveGif($file); - } - - if ($type == 'png') { - $success = $this->getAdapter()->savePng($file); - } - - if (!$success) { - return false; - } - - return (null === $file ? ob_get_clean() : $file); - - } catch (\Exception $e) { - if ($this->useFallbackImage) { - return (null === $file ? file_get_contents($this->fallback) : $this->getCacheFallback()); - } else { - throw $e; - } - } - } - - /** - * Get the contents of the image - */ - public function get($type = 'guess', $quality = 80) - { - return $this->save(null, $type, $quality); - } - - /* Image API */ - - /** - * Image width - */ - public function width() - { - return $this->getAdapter()->width(); - } - - /** - * Image height - */ - public function height() - { - return $this->getAdapter()->height(); - } - - /** - * Tostring defaults to jpeg - */ - public function __toString() - { - return $this->guess(); - } - - /** - * Returning basic html code for this image - */ - public function html($title = '', $type = 'jpg', $quality = 80) - { - return ''; - } - - /** - * Returns the Base64 inlinable representation - */ - public function inline($type = 'jpg', $quality = 80) - { - $mime = $type; - if ($mime == 'jpg') { - $mime = 'jpeg'; - } - - return 'data:image/'.$mime.';base64,'.base64_encode(file_get_contents($this->cacheFile($type, $quality, true))); - } - - /** - * Creates an instance, usefull for one-line chaining - */ - public static function open($file = '') - { - return new self($file); - } - - /** - * Creates an instance of a new resource - */ - public static function create($width, $height) - { - return new self(null, $width, $height); - } - - /** - * Creates an instance of image from its data - */ - public static function fromData($data) - { - $image = new self(); - $image->setData($data); - - return $image; - } - - /** - * Creates an instance of image from resource - */ - public static function fromResource($resource) - { - $image = new self(); - $image->setResource($resource); - - return $image; - } -} diff --git a/vendor/gregwar/image/Gregwar/Image/ImageColor.php b/vendor/gregwar/image/Gregwar/Image/ImageColor.php deleted file mode 100644 index 2f79b91ce..000000000 --- a/vendor/gregwar/image/Gregwar/Image/ImageColor.php +++ /dev/null @@ -1,93 +0,0 @@ - 0x000000, - 'silver' => 0xc0c0c0, - 'gray' => 0x808080, - 'teal' => 0x008080, - 'aqua' => 0x00ffff, - 'blue' => 0x0000ff, - 'navy' => 0x000080, - 'green' => 0x008000, - 'lime' => 0x00ff00, - 'white' => 0xffffff, - 'fuschia' => 0xff00ff, - 'purple' => 0x800080, - 'olive' => 0x808000, - 'yellow' => 0xffff00, - 'orange' => 0xffA500, - 'red' => 0xff0000, - 'maroon' => 0x800000, - 'transparent' => 0x7fffffff - ); - - public static function gdAllocate($image, $color) - { - $colorRGBA = self::parse($color); - - $b = ($colorRGBA)&0xff; - $colorRGBA >>= 8; - $g = ($colorRGBA)&0xff; - $colorRGBA >>= 8; - $r = ($colorRGBA)&0xff; - $colorRGBA >>= 8; - $a = ($colorRGBA)&0xff; - - $c = imagecolorallocatealpha($image, $r, $g, $b, $a); - - if ($color == 'transparent') { - imagecolortransparent($image, $c); - } - - return $c; - } - - public static function parse($color) - { - // Direct color representation (ex: 0xff0000) - if (!is_string($color) && is_numeric($color)) - return $color; - - // Color name (ex: "red") - if (isset(self::$colors[$color])) - return self::$colors[$color]; - - if (is_string($color)) { - $color_string = str_replace(' ', '', $color); - - // Color string (ex: "ff0000", "#ff0000" or "0xfff") - if (preg_match('/^(#|0x|)([0-9a-f]{3,6})/i', $color_string, $matches)) { - $col = $matches[2]; - - if (strlen($col) == 6) - return hexdec($col); - - if (strlen($col) == 3) { - $r = ''; - for ($i=0; $i<3; $i++) - $r.= $col[$i].$col[$i]; - return hexdec($r); - } - } - - // Colors like "rgb(255, 0, 0)" - if (preg_match('/^rgb\(([0-9]+),([0-9]+),([0-9]+)\)/i', $color_string, $matches)) { - $r = $matches[1]; - $g = $matches[2]; - $b = $matches[3]; - if ($r>=0 && $r<=0xff && $g>=0 && $g<=0xff && $b>=0 && $b<=0xff) { - return ($r << 16) | ($g << 8) | ($b); - } - } - } - - throw new \InvalidArgumentException('Invalid color: '.$color); - } -} diff --git a/vendor/gregwar/image/Gregwar/Image/LICENSE b/vendor/gregwar/image/Gregwar/Image/LICENSE deleted file mode 100644 index 1be4d12a6..000000000 --- a/vendor/gregwar/image/Gregwar/Image/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) <2012-2013> Grégoire Passault - -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/vendor/gregwar/image/Gregwar/Image/README.md b/vendor/gregwar/image/Gregwar/Image/README.md deleted file mode 100644 index 32fd4dc89..000000000 --- a/vendor/gregwar/image/Gregwar/Image/README.md +++ /dev/null @@ -1,271 +0,0 @@ -Gregwar's Image class -===================== - -The `Gregwar\Image` class purpose is to provide a simple object-oriented images handling and caching API. - -Usage -===== - -Basic handling --------------- - -Using methods chaining, you can open, transform and save a file in a single line: - -```php -resize(100, 100) - ->negate() - ->save('out.jpg'); -``` - -The methods available are: - -* `resize($width, $height, $background)`: resizes the image, will preserve scale and never - enlarge it - -* `scaleResize($width, $height, $background)`: resizes the image, will preserve scale - -* `forceResize($width, $height, $background)`: resizes the image, will force the image to - be exactly $width by $height - -* `cropResize($width, $height, $background)`: resizes the image preserving scale and croping - the whitespaces - -* `crop($x, $y, $w, $h)`: crops the image to a box located on coordinates $x,y and - which size is $w by $h - -* `negate()`: negates the image colors - -* `brighness($b)`: applies a brightness effect to the image (from -255 to +255) - -* `contrast($c)`: applies a contrast effect to the image (from -100 to +100) - -* `grayscale()`: converts the image to grayscale - -* `emboss()`: emboss the image - -* `smooth($p)`: smooth the image - -* `sharp()`: applies a mean removal filter on the image - -* `edge()`: applies an edge effect on the image - -* `colorize($red, $green, $blue)`: colorize the image (from -255 to +255 for each color) - -* `sepia()`: applies a sepia effect - -* `merge($image, $x, $y, $width, $height)`: merges two images - -* `fill($color, $x, $y)`: fills the image with the given color - -* `write($font, $text, $x, $y, $size, $angle, $color, $position)`: writes text over image, $position can be any of 'left', 'right', or 'center' - -* `rectangle($x1, $y1, $x2, $y2, $color, $filled=false)`: draws a rectangle - -* `rotate($angle, $background = 0xffffff)` : rotate the image to given angle - -* `roundedRectangle($x1, $y1, $x2, $y2, $radius, $color, $filled=false)`: draws a rounded rectangle ($radius can be anything from 0) - -* `line($x1, $y1, $x2, $y2, $color)`: draws a line - -* `ellipse($cx, $cy, $width, $height, $color, $filled=false)`: draws an ellipse - -* `circle($cx, $cy, $r, $color, $filled=false)`: draws a circle - -* `zoomCrop($width, $height, $background)`: resize and crop the image to fit to given dimensions - -* `fillBackground($bg=0xffffff)`: fills the background of a transparent image to the 'bg' color - -* `html($title = '', $type = 'jpg')`: return the `` tag with the cache image - -* `inline($type = 'jpg')`: returns the HTML inlinable base64 string (see `demo/inline.php`) - -You can also create image from scratch using: - -```php -save('output.jpg', 'jpg', 85); -``` - -You can also get the contents of the image using `get($type = 'jpg', $quality = 80)`, which will return the binary contents of the image - -Using cache ------------ - -Each operation above is not actually applied on the opened image, but added in an operations -array. This operation array, the name, type and modification time of file are hashed using -`sha1()` and the hash is used to look up for a cache file. - -Once the cache directory configured, you can call the following methods: - -* `jpeg($quality = 80)`: lookup or create a jpeg cache file on-the-fly - -* `gif()`: lookup or create a gif cache file on-the-fly - -* `png()`: lookup or create a png cache file on-the-fly - -* `guess($quality = 80)`: guesses the type (use the same as input) and lookup or create a - cache file on-the-fly - -* `setPrettyName($prettyName, $prefix = true)`: sets a "pretty" name suffix for the file, if you want it to be more SEO-friendly. - for instance, if you call it "Fancy Image", the cache will look like something/something-fancy-image.jpg. - If `$prefix` is passed to `false` (default `true`), the pretty name won't have any hash prefix. - -For instance: - -```php -sepia() - ->jpeg(); - -//Outputs: cache/images/1/8/6/9/c/86e4532dbd9c073075ef08e9751fc9bc0f4.jpg -``` - -If the original file and operations do not change, the hashed value will be the same and the -cache will not be generated again. - -You can use this directly in an HTML document: - - -```php -resize(150, 150)->jpeg(); ?>" /> -// ... -``` - -This is powerful since if you change the original image or any of your code the cached hash -will change and the file will be regenerated. - -Writing image -------------- - -You can also create your own image on-the-fly using drawing functions: - - -```php -write('./fonts/CaviarDreams.ttf', 'Hello '.$username.'!', 150, 150, 20, 0, 'white', 'center') - ->jpeg(); ?>" /> -``` - -Using fallback image --------------------- - -If the image file doesn't exists, you can configurate a fallback image that will be used -by the class (note that this require the cache directory to be available). - -A default "error" image which is used is in `images/error.jpg`, you can change it with: - -```php -setFallback('/path/to/my/fallback.jpg'); -``` - -Garbage Collect -=============== - -To prevent the cache from growing forever, you can use the provided GarbageCollect class as below: - -```php -negate(); - $this->sepia(); - } -``` - -Which could be usable on the Image - -```php -myFilter(); -``` - -You can also write your own adapter in your application, which could extend one of this repository, -and uses it calling `setAdapter()`: - -```php -setAdapter(new MyCustomAdapter); -``` - -Do not hesitate to fork this repository and customize it ! diff --git a/vendor/gregwar/image/Gregwar/Image/Source/Create.php b/vendor/gregwar/image/Gregwar/Image/Source/Create.php deleted file mode 100644 index 42d784ddd..000000000 --- a/vendor/gregwar/image/Gregwar/Image/Source/Create.php +++ /dev/null @@ -1,38 +0,0 @@ -width = $width; - $this->height = $height; - } - - public function getWidth() - { - return $this->width; - } - - public function getHeight() - { - return $this->height; - } - - public function getInfos() - { - return array($this->width, $this->height); - } - - public function correct() - { - return $this->width > 0 && $this->height > 0; - } -} diff --git a/vendor/gregwar/image/Gregwar/Image/Source/Data.php b/vendor/gregwar/image/Gregwar/Image/Source/Data.php deleted file mode 100644 index a4d2555cc..000000000 --- a/vendor/gregwar/image/Gregwar/Image/Source/Data.php +++ /dev/null @@ -1,26 +0,0 @@ -data = $data; - } - - public function getData() - { - return $this->data; - } - - public function getInfos() - { - return sha1($this->data); - } -} diff --git a/vendor/gregwar/image/Gregwar/Image/Source/File.php b/vendor/gregwar/image/Gregwar/Image/Source/File.php deleted file mode 100644 index f090c6c9a..000000000 --- a/vendor/gregwar/image/Gregwar/Image/Source/File.php +++ /dev/null @@ -1,63 +0,0 @@ -file = $file; - } - - public function getFile() - { - return $this->file; - } - - public function correct() - { - return false !== @exif_imagetype($this->file); - } - - public function guessType() - { - if (function_exists('exif_imagetype')) { - $type = @exif_imagetype($this->file); - - if (false !== $type) { - if ($type == IMAGETYPE_JPEG) { - return 'jpeg'; - } - - if ($type == IMAGETYPE_GIF) { - return 'gif'; - } - - if ($type == IMAGETYPE_PNG) { - return 'png'; - } - } - } - - $parts = explode('.', $this->file); - $ext = strtolower($parts[count($parts)-1]); - - if (isset(Image::$types[$ext])) { - return Image::$types[$ext]; - } - - return 'jpeg'; - } - - public function getInfos() - { - return $this->file; - } -} diff --git a/vendor/gregwar/image/Gregwar/Image/Source/Resource.php b/vendor/gregwar/image/Gregwar/Image/Source/Resource.php deleted file mode 100644 index fb1f6f1ec..000000000 --- a/vendor/gregwar/image/Gregwar/Image/Source/Resource.php +++ /dev/null @@ -1,21 +0,0 @@ -resource = $resource; - } - - public function getResource() - { - return $this->resource; - } -} diff --git a/vendor/gregwar/image/Gregwar/Image/Source/Source.php b/vendor/gregwar/image/Gregwar/Image/Source/Source.php deleted file mode 100644 index 27321b44a..000000000 --- a/vendor/gregwar/image/Gregwar/Image/Source/Source.php +++ /dev/null @@ -1,34 +0,0 @@ -LJ%Z3brsR%R9! z7G_o;!OF_Y#?HgR4g~z%+?+gu{6a#4{DOkQVlv{wB2uD)f)a`nQnIr0^76vsN-9cn zDl&5Nav(z(fm+$w*!eg(_~b+cMdU~Z{|_(-axlm-q%booF)#@-G7B>PKf)l*z`)GF z4Ds*vu544*qOh}Rp{-Eyi7AoRmB_Mj_l~| zFWj=GYpGPz2Xo^eax8cFHJ^stdKSi3*X~|(@uuv~o$ZBRSKa<*IK_MQ{?BHAHXm{> z>)kC;YM8`&y>9itp5>2jmLGq|=ltoIZ`PBH-Pd+Hyx6u@z|v`F-_`q7zZ=(0xNhH- z8kacXw_Ws!wYDOx#djWj5!yR9Q$0Ox$C{}3^HP55Ip+6PwX)sM+Oy|kZJ^NOQ#m>< zo2Gp8Yw-LkA6~z1m2`&P_lY0$PWm!OGVBiD|Hd-NWZANy^_F|DcS(wArtCV@%BQ8g zYbO6OK0PaMPc07ryrQMrb&E>ZUEN&2KUJLPqJ*2NnMwE~XYcRYv(KeDu=O?e}gw9rRZ5QOXvPX`xr*jhmgbY*sR; z%q?H=o_XT_oRpgNDN9OD=>+D_TDgT%M={x2H7Zlx3++A@} zcS~H5jrEF4j0|(vDpaqiD?MEh{Z_30pTqaR>sGN%xbWr4V)bn$6?+4&Z;o4`Xz=b< zaDBqbKJ`C!XX}@A{`S4L^qcn#cX9QU?;4Y0Hr`X*c6rjwj2+6m8YWmaykndE>)SWe z@KDXAyDAnwd#~$$=6HI@!ombc{T+wEou_>45oHYi963=V<|2F{((yR~w diff --git a/vendor/ircmaxell/password-compat/LICENSE.md b/vendor/ircmaxell/password-compat/LICENSE.md deleted file mode 100644 index 1efc565fc..000000000 --- a/vendor/ircmaxell/password-compat/LICENSE.md +++ /dev/null @@ -1,7 +0,0 @@ -Copyright (c) 2012 Anthony Ferrara - -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. \ No newline at end of file diff --git a/vendor/ircmaxell/password-compat/README.md b/vendor/ircmaxell/password-compat/README.md deleted file mode 100644 index e158f7d0c..000000000 --- a/vendor/ircmaxell/password-compat/README.md +++ /dev/null @@ -1,75 +0,0 @@ -password_compat -=============== - -[![Build Status](https://travis-ci.org/ircmaxell/password_compat.png?branch=master)](https://travis-ci.org/ircmaxell/password_compat) - -This library is intended to provide forward compatibility with the password_* functions being worked on for PHP 5.5. - -See [the RFC](https://wiki.php.net/rfc/password_hash) for more detailed information. - - -Requirements -============ - -This library requires `PHP >= 5.3.7` OR a version that has the `$2y` fix backported into it (such as Debian provides). - -The runtime checks have been removed due to this version issue. To see if password_compat is available for your system, run the included `version-test.php`. If it outputs "Pass", you can safely use the library. If not, you cannot. - -If you attempt to use password-compat on an unsupported version, attempts to create or verify hashes will return `false`. You have been warned! - -The reason for this is that PHP prior to 5.3.7 contains a security issue with its BCRYPT implementation. Therefore, it's highly recommended that you upgrade to a newer version of PHP prior to using this layer. - -Installation -============ - -To install, simply `require` the `password.php` file under `lib`. - -You can also install it via `Composer` by using the [Packagist archive](http://packagist.org/packages/ircmaxell/password-compat). - -Usage -===== - -**Creating Password Hashes** - -To create a password hash from a password, simply use the `password_hash` function. - - $hash = password_hash($password, PASSWORD_BCRYPT); - -Note that the algorithm that we chose is `PASSWORD_BCRYPT`. That's the current strongest algorithm supported. This is the `BCRYPT` crypt algorithm. It produces a 60 character hash as the result. - -`BCRYPT` also allows for you to define a `cost` parameter in the options array. This allows for you to change the CPU cost of the algorithm: - - $hash = password_hash($password, PASSWORD_BCRYPT, ["cost" => 10]); - -That's the same as the default. The cost can range from `4` to `31`. I would suggest that you use the highest cost that you can, while keeping response time reasonable (I target between 0.1 and 0.5 seconds for a hash, depending on use-case). - -Another algorithm name is supported: - - PASSWORD_DEFAULT - -This will use the strongest algorithm available to PHP at the current time. Presently, this is the same as specifying `PASSWORD_BCRYPT`. But in future versions of PHP, it may be updated to use a stronger algorithm if one is introduced. It can also be changed if a problem is identified with the BCRYPT algorithm. Note that if you use this option, you are **strongly** encouraged to store it in a `VARCHAR(255)` column to avoid truncation issues if a future algorithm increases the length of the generated hash. - -It is very important that you should check the return value of `password_hash` prior to storing it, because a `false` may be returned if it encountered an error. - -**Verifying Password Hashes** - -To verify a hash created by `password_hash`, simply call: - - if (password_verify($password, $hash)) { - /* Valid */ - } else { - /* Invalid */ - } - -That's all there is to it. - -**Rehashing Passwords** - -From time to time you may update your hashing parameters (algorithm, cost, etc). So a function to determine if rehashing is necessary is available: - - if (password_verify($password, $hash)) { - if (password_needs_rehash($hash, $algorithm, $options)) { - $hash = password_hash($password, $algorithm, $options); - /* Store new hash in db */ - } - } diff --git a/vendor/ircmaxell/password-compat/lib/password.php b/vendor/ircmaxell/password-compat/lib/password.php deleted file mode 100644 index 4d0e8b7a6..000000000 --- a/vendor/ircmaxell/password-compat/lib/password.php +++ /dev/null @@ -1,222 +0,0 @@ - - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @copyright 2012 The Authors - */ - -if (!defined('PASSWORD_BCRYPT')) { - - define('PASSWORD_BCRYPT', 1); - define('PASSWORD_DEFAULT', PASSWORD_BCRYPT); - - /** - * Hash the password using the specified algorithm - * - * @param string $password The password to hash - * @param int $algo The algorithm to use (Defined by PASSWORD_* constants) - * @param array $options The options for the algorithm to use - * - * @return string|false The hashed password, or false on error. - */ - function password_hash($password, $algo, array $options = array()) { - if (!function_exists('crypt')) { - trigger_error("Crypt must be loaded for password_hash to function", E_USER_WARNING); - return null; - } - if (!is_string($password)) { - trigger_error("password_hash(): Password must be a string", E_USER_WARNING); - return null; - } - if (!is_int($algo)) { - trigger_error("password_hash() expects parameter 2 to be long, " . gettype($algo) . " given", E_USER_WARNING); - return null; - } - switch ($algo) { - case PASSWORD_BCRYPT: - // Note that this is a C constant, but not exposed to PHP, so we don't define it here. - $cost = 10; - if (isset($options['cost'])) { - $cost = $options['cost']; - if ($cost < 4 || $cost > 31) { - trigger_error(sprintf("password_hash(): Invalid bcrypt cost parameter specified: %d", $cost), E_USER_WARNING); - return null; - } - } - // The length of salt to generate - $raw_salt_len = 16; - // The length required in the final serialization - $required_salt_len = 22; - $hash_format = sprintf("$2y$%02d$", $cost); - break; - default: - trigger_error(sprintf("password_hash(): Unknown password hashing algorithm: %s", $algo), E_USER_WARNING); - return null; - } - if (isset($options['salt'])) { - switch (gettype($options['salt'])) { - case 'NULL': - case 'boolean': - case 'integer': - case 'double': - case 'string': - $salt = (string) $options['salt']; - break; - case 'object': - if (method_exists($options['salt'], '__tostring')) { - $salt = (string) $options['salt']; - break; - } - case 'array': - case 'resource': - default: - trigger_error('password_hash(): Non-string salt parameter supplied', E_USER_WARNING); - return null; - } - if (strlen($salt) < $required_salt_len) { - trigger_error(sprintf("password_hash(): Provided salt is too short: %d expecting %d", strlen($salt), $required_salt_len), E_USER_WARNING); - return null; - } elseif (0 == preg_match('#^[a-zA-Z0-9./]+$#D', $salt)) { - $salt = str_replace('+', '.', base64_encode($salt)); - } - } else { - $buffer = ''; - $buffer_valid = false; - if (function_exists('mcrypt_create_iv') && !defined('PHALANGER')) { - $buffer = mcrypt_create_iv($raw_salt_len, MCRYPT_DEV_URANDOM); - if ($buffer) { - $buffer_valid = true; - } - } - if (!$buffer_valid && function_exists('openssl_random_pseudo_bytes')) { - $buffer = openssl_random_pseudo_bytes($raw_salt_len); - if ($buffer) { - $buffer_valid = true; - } - } - if (!$buffer_valid && is_readable('/dev/urandom')) { - $f = fopen('/dev/urandom', 'r'); - $read = strlen($buffer); - while ($read < $raw_salt_len) { - $buffer .= fread($f, $raw_salt_len - $read); - $read = strlen($buffer); - } - fclose($f); - if ($read >= $raw_salt_len) { - $buffer_valid = true; - } - } - if (!$buffer_valid || strlen($buffer) < $raw_salt_len) { - $bl = strlen($buffer); - for ($i = 0; $i < $raw_salt_len; $i++) { - if ($i < $bl) { - $buffer[$i] = $buffer[$i] ^ chr(mt_rand(0, 255)); - } else { - $buffer .= chr(mt_rand(0, 255)); - } - } - } - $salt = str_replace('+', '.', base64_encode($buffer)); - } - $salt = substr($salt, 0, $required_salt_len); - - $hash = $hash_format . $salt; - - $ret = crypt($password, $hash); - - if (!is_string($ret) || strlen($ret) <= 13) { - return false; - } - - return $ret; - } - - /** - * Get information about the password hash. Returns an array of the information - * that was used to generate the password hash. - * - * array( - * 'algo' => 1, - * 'algoName' => 'bcrypt', - * 'options' => array( - * 'cost' => 10, - * ), - * ) - * - * @param string $hash The password hash to extract info from - * - * @return array The array of information about the hash. - */ - function password_get_info($hash) { - $return = array( - 'algo' => 0, - 'algoName' => 'unknown', - 'options' => array(), - ); - if (substr($hash, 0, 4) == '$2y$' && strlen($hash) == 60) { - $return['algo'] = PASSWORD_BCRYPT; - $return['algoName'] = 'bcrypt'; - list($cost) = sscanf($hash, "$2y$%d$"); - $return['options']['cost'] = $cost; - } - return $return; - } - - /** - * Determine if the password hash needs to be rehashed according to the options provided - * - * If the answer is true, after validating the password using password_verify, rehash it. - * - * @param string $hash The hash to test - * @param int $algo The algorithm used for new password hashes - * @param array $options The options array passed to password_hash - * - * @return boolean True if the password needs to be rehashed. - */ - function password_needs_rehash($hash, $algo, array $options = array()) { - $info = password_get_info($hash); - if ($info['algo'] != $algo) { - return true; - } - switch ($algo) { - case PASSWORD_BCRYPT: - $cost = isset($options['cost']) ? $options['cost'] : 10; - if ($cost != $info['options']['cost']) { - return true; - } - break; - } - return false; - } - - /** - * Verify a password against a hash using a timing attack resistant approach - * - * @param string $password The password to verify - * @param string $hash The hash to verify against - * - * @return boolean If the password matches the hash - */ - function password_verify($password, $hash) { - if (!function_exists('crypt')) { - trigger_error("Crypt must be loaded for password_verify to function", E_USER_WARNING); - return false; - } - $ret = crypt($password, $hash); - if (!is_string($ret) || strlen($ret) != strlen($hash) || strlen($ret) <= 13) { - return false; - } - - $status = 0; - for ($i = 0; $i < strlen($ret); $i++) { - $status |= (ord($ret[$i]) ^ ord($hash[$i])); - } - - return $status === 0; - } -} - - - diff --git a/vendor/mrclay/minify/HISTORY.txt b/vendor/mrclay/minify/HISTORY.txt deleted file mode 100644 index 9c44d164c..000000000 --- a/vendor/mrclay/minify/HISTORY.txt +++ /dev/null @@ -1,141 +0,0 @@ -Minify Release History - -(master) - * Builder styled with Bootstrap (thanks to help from acidvertigo) - -Version 2.2.0 - * Fix handling of RegEx in certain situations in JSMin - * Thanks to Vovan-VE for reporting this - * Update composer.json with support info - * Add ability to set ClosureCompiler URL - * Thanks Elan Ruusamäe for the pull request - * Better report of temp directory errors - * Also thanks to Elan Ruusamäe for anatoher pull request - * Updated CSSmin and added Minify_CSSmin wrapper - * Fix windows issue associated with long cache filenames - * Fix issue with web-based tool - * Fix bug in JSMin exceptions - * Fix "about:blank" bug in CSS_UriRewriter - * Cite is no longer a block element in HTML minification - * Allow for definition of custom config locations outside of the min directory - * Thanks Sam Bauers for the pull request - * Allow option for overriding the maximum byte size POST limit for ClosureCompiler and other additions - * Thanks Joscha Feth for the code - * Fixes to file-relative URL identification in UriRewriter - * Allow far-future expiration and file versioning with the "v" querystirng parameter in addition to existing method - * Lots of general code tidy ups - -Version 2.1.7 - * Fixes arbitrary file inclusion vulnerability on some systems - * Thanks to Matt Mecham for reporting this - -Version 2.1.6 - * JSMin fixes - * Prevents some Closure Compiler API failures - * Uses autoloading for all class loading - * Multiple group support in HTML Helper - * Cache adaptor for XCache - * Allow setting stack-size in YUI Compressor wrapper - * Adds jsCleanComments option to HTML minifier - * Upgrades CSSmin - * CLI script more portable - * Adds composer.json - -Version 2.1.5 - * Removed XSS vulnerability - * Disabled builder bby default - * command line tools to minify and rewrite URIs in CSS - * upgrade (optional) JSMin+ library - * more efficient JS minification when using CC/YUIC - * Closure Compiler uses cURL when allow_url_fopen is off - * Missing file notices when using groups - -Version 2.1.4 - * Option to minify JS with Closure Compiler API w/ JSMin failover - * Cookie/bookmarklet-based debug mode. No HTML editing! - * Allows 1 file to be missing w/o complete failure - * Combine multiple groups and files in single URI - * More useful HTML helpers for writing versioned URIs - * More detailed error logging, including minifier exceptions - * Builder offers more helpful messages/PHP environment warnings - * Bypass minification based on filename pattern. e.g. foo.min.js / foo-min.css - * JSMin won't choke on common Closure compiler syntaxes (i+ ++j) - * Better caching in IE6 - * Cache ids are influenced by group/file names - * Debug mode for Javascript doesn't break on common XPath strings (Prototype 1.6) - * Removed annoying maxFiles limit - * mbstring.func_overload usage is safer - -Version 2.1.3 - * HTTP fixes - * ETag generation now valid (different when gzipped) - * Vary header always sent when Accept-Encoding is sniffed - * Cache-Control no longer has "must-revalidate" due to webkit bug - See: http://mrclay.org/index.php/2009/02/24/safari-4-beta-cache-controlmust-revalidate-bug/ - * Dropped deflate encoding. Browser and proxy support could be buggy. - See: http://stackoverflow.com/questions/883841/ - * File cache now works w/o setting $min_cachePath - * Allow setting contentType in Minify_Source objects - * No more 5.3 deprecation warnings: split() removed - -Version 2.1.2 - * Javascript fixes - * Debug mode no longer confused by "*/*" in strings/RegExps (jQuery) - * quote characters inside RegExp literals no longer cause exception - * files ending in single-line comments no longer cause code loss - * CSS: data: URLs no longer mangled - * Optional error logging to Firefox's FirePHP extension - * Unit tests to check for common DOCUMENT_ROOT problems - * DOCUMENT_ROOT no longer overwritten on IIS servers - * Builder app doesn't fail on systems without gzdeflate() - * APC caching class included - -Version 2.1.1 - * Bug fix release - * Detection and workarounds for zlib.output_compression and non-PHP encoding modules - * Zlib not required (mod_rewrite, et.al., can still be used for encoding) - * HTML : More IE conditional comments preserved - * Minify_groupUri() utility fixed - -Version 2.1.0 - * "min" default application for quick deployment - * Minify URI Builder app & bookmarklet for quickly creating minify URIs - * Relative URIs in CSS file are fixed automatically by default - * "debug" mode for revealing original line #s in combined files - * Better IIS support - * Improved minifier classes: - * JS: preserves IE conditional comments - * CSS: smaller output, preserves more hacks and valid CSS syntax, - shorter line lengths, other bug fixes - * HTML: smaller output, shorter line lengths, other bug fixes - * Default Cache-Control: max-age of 30 minutes - * Conditional GETs supported even when max-age sent - * Experimental memcache cache class (default is files) - * Minify_Cache_File has flock()s (by default) - * Workaround for Windows mtime reporting bug - -Version 2.0.2 beta (2008-06-24) - * Fast new cache system. Cached files served almost 3x as fast. - * Dropped support of compress encoding (though HTTP_Encoder still supports it) - -Version 2.0.1 (2008-05-31) - * E_STRICT compliance (Cache_Lite_File). - -Version 2.0.0 (2008-05-22) - * Complete code overhaul. Minify is now a PEAR-style class and toolkit - for building customized minifying file servers. - * Content-Encoding: deflate/gzip/compress, based on request headers - * Expanded CSS and HTML minifiers with test cases - * Easily plug-in 3rd-party minifiers (like Packer) - * Plug-able front end controller allows changing the way files are chosen - * Compression & encoding modules lazy-loaded as needed (304 responses use - use minimal code) - * Separate utility classes for HTTP encoding and cache control - -Version 1.0.1 (2007-05-05) - * Fixed various problems resolving pathnames when hosted on an NFS mount. - * Fixed 'undefined constant' notice. - * Replaced old JSMin library with a much faster custom implementation. - -Version 1.0.0 (2007-05-02) - * First release. diff --git a/vendor/mrclay/minify/LICENSE.txt b/vendor/mrclay/minify/LICENSE.txt deleted file mode 100644 index 8f008adb5..000000000 --- a/vendor/mrclay/minify/LICENSE.txt +++ /dev/null @@ -1,26 +0,0 @@ -Copyright (c) 2008 Ryan Grove -Copyright (c) 2008 Steve Clay -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of this project nor the names of its contributors may be - used to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/mrclay/minify/MIN.txt b/vendor/mrclay/minify/MIN.txt deleted file mode 100644 index 5aaf0fb8c..000000000 --- a/vendor/mrclay/minify/MIN.txt +++ /dev/null @@ -1,181 +0,0 @@ -The files in the /min/ directory represent the default Minify setup designed to ease -integration with your site. This app will combine and minify your Javascript or -CSS files and serve them with HTTP compression and cache headers. - - -RECOMMENDED - -It's recommended to edit /min/config.php to set $min_cachePath to a writeable -(by PHP) directory on your system. This will improve performance. - - -GETTING STARTED - -The quickest way to get started is to use the Minify URI Builder application -on your website: http://example.com/min/builder/ - - -MINIFYING A SINGLE FILE - -Let's say you want to serve this file: - http://example.com/wp-content/themes/default/default.css - -Here's the "Minify URL" for this file: - http://example.com/min/?f=wp-content/themes/default/default.css - -In other words, the "f" argument is set to the file path from root without the -initial "/". As CSS files may contain relative URIs, Minify will automatically -"fix" these by rewriting them as root relative. - - -COMBINING MULTIPLE FILES IN ONE DOWNLOAD - -Separate the paths given to "f" with commas. - -Let's say you have CSS files at these URLs: - http://example.com/scripts/jquery-1.2.6.js - http://example.com/scripts/site.js - -You can combine these files through Minify by requesting this URL: - http://example.com/min/?f=scripts/jquery-1.2.6.js,scripts/site.js - - -SIMPLIFYING URLS WITH A BASE PATH - -If you're combining files that share the same ancestor directory, you can use -the "b" argument to set the base directory for the "f" argument. Do not include -the leading or trailing "/" characters. - -E.g., the following URLs will serve the exact same content: - http://example.com/min/?f=scripts/jquery-1.2.6.js,scripts/site.js,scripts/home.js - http://example.com/min/?b=scripts&f=jquery-1.2.6.js,site.js,home.js - - -MINIFY URLS IN HTML - -In HTML files, don't forget to replace any "&" characters with "&". - - -SPECIFYING ALLOWED DIRECTORIES - -By default, Minify will serve any *.css/*.js files within the DOCUMENT_ROOT. If -you'd prefer to limit Minify's access to certain directories, set the -$min_serveOptions['minApp']['allowDirs'] array in config.php. E.g. to limit -to the /js and /themes/default directories, use: - -$min_serveOptions['minApp']['allowDirs'] = array('//js', '//themes/default'); - - -GROUPS: NICER URLS - -For nicer URLs, edit groupsConfig.php to pre-specify groups of files -to be combined under preset keys. E.g., here's an example configuration in -groupsConfig.php: - -return array( - 'js' => array('//js/Class.js', '//js/email.js') -); - -This pre-selects the following files to be combined under the key "js": - http://example.com/js/Class.js - http://example.com/js/email.js - -You can now serve these files with this simple URL: - http://example.com/min/?g=js - - -GROUPS: SPECIFYING FILES OUTSIDE THE DOC_ROOT - -In the groupsConfig.php array, the "//" in the file paths is a shortcut for -the DOCUMENT_ROOT, but you can also specify paths from the root of the filesystem -or relative to the DOC_ROOT: - -return array( - 'js' => array( - '//js/file.js' // file within DOC_ROOT - ,'//../file.js' // file in parent directory of DOC_ROOT - ,'C:/Users/Steve/file.js' // file anywhere on filesystem - ) -); - - -COMBINE MULTIPLE GROUPS AND FILES IN ONE URL - -E.g.: http://example.com/min/?g=js&f=more/scripts.js - -Separate group keys with commas: - http://example.com/min/?g=baseCss,css1&f=moreStyles.css - - -FAR-FUTURE EXPIRES HEADERS - -Minify can send far-future (one year) Expires headers. To enable this you must -add a number or the parameter "v" to the querystring (e.g. /min/?g=js&1234 or -/min/?g=js&v=1234) and alter it whenever a source file is changed. If you have a -build process you can use a build/source control revision number. - -You can alternately use the utility function Minify_getUri() to get a "versioned" -Minify URI for use in your HTML. E.g.: - -"; - -$cssUri = Minify_getUri(array( - '//css/styles1.css' - ,'//css/styles2.css' -)); // a list of files -echo ""; - - -STORING CONFIG FILES OUTSIDE THE MINIFY DIRECTORY - -It is possible to store config files (min/config.php, min/config-test.php, -min/groupsConfig.php) in a custom directory outside the Minify directory. This is -useful if you wish to include Minify as an external dependency inside another -project via SVN external or Git submodule inclusion. - -For example, let's assume you have a Minify directory "min" in your site root. Then -you could create a new directory called "min-configs" in the site root. Copy any -config files you wish to modify to "min-configs", and modify as desired. - -Then create a new file, for example "min.php" in your site root. The contents of -this file could look like this: - - $customConfigDirectory . '/config.php', - 'test' => $customConfigDirectory . '/config-test.php', - 'groups' => $customConfigDirectory . '/groupsConfig.php' -); - -include_once 'min/index.php'; - -You would then reference min.php in your JS and CSS links instead of min/index.php. - -This method will affect those using the Minify_getUri() function. You will need -to add options to calls to that function, e.g.: - - '/min.php')); -echo ""; - - -DEBUG MODE - -In debug mode, instead of compressing files, Minify sends combined files with -comments prepended to each line to show the line number in the original source -file. To enable this, set $min_allowDebugFlag to true in config.php and append -"&debug=1" to your URIs. E.g. /min/?f=script1.js,script2.js&debug=1 - -Known issue: files with comment-like strings/regexps can cause problems in this mode. - - -QUESTIONS? - -http://groups.google.com/group/minify diff --git a/vendor/mrclay/minify/README.txt b/vendor/mrclay/minify/README.txt deleted file mode 100644 index 54b0690f8..000000000 --- a/vendor/mrclay/minify/README.txt +++ /dev/null @@ -1,68 +0,0 @@ -WELCOME TO MINIFY! - -Minify is an HTTP content server. It compresses sources of content -(usually files), combines the result and serves it with appropriate -HTTP headers. These headers can allow clients to perform conditional -GETs (serving content only when clients do not have a valid cache) -and tell clients to cache the file for a period of time. -More info: http://code.google.com/p/minify/ - - -WORDPRESS USER? - -These WP plugins integrate Minify into WordPress's style and script hooks to -get you set up faster. - http://wordpress.org/extend/plugins/bwp-minify/ - http://wordpress.org/extend/plugins/w3-total-cache/ - - -INSTALLATION - -Place the /min/ directory as a child of your DOCUMENT_ROOT -directory: i.e. you will have: /home/example/www/min - -You can see verify that it is working by visiting these two URLs: - http://example.org/min/?f=min/quick-test.js - http://example.org/min/?f=min/quick-test.css - -If your server supports mod_rewrite, this URL should also work: - http://example.org/min/f=min/quick-test.js - -CONFIGURATION & USAGE - -See the MIN.txt file and http://code.google.com/p/minify/wiki/UserGuide - -Minify also comes with a URI Builder application that can help you write URLs -for use with Minify or configure groups of files. See here for details: - http://code.google.com/p/minify/wiki/BuilderApp - -The cookbook also provides some more advanced options for minification: - http://code.google.com/p/minify/wiki/CookBook - -UPGRADING - -See UPGRADING.txt for instructions. - - -UNIT TESTING: - -1. Place the /min_unit_tests/ directory as a child of your DOCUMENT_ROOT -directory: i.e. you will have: /home/example/www/min_unit_tests - -2. To run unit tests, access: http://example.org/min_unit_tests/test_all.php - -(If you wish, the other test_*.php files can be run to test individual -components with more verbose output.) - -3. Remove /min_unit_tests/ from your DOCUMENT_ROOT when you are done. - - -FILE ENCODINGS - -Minify *should* work fine with files encoded in UTF-8 or other 8-bit -encodings like ISO 8859/Windows-1252. By default Minify appends -";charset=utf-8" to the Content-Type headers it sends. - -Leading UTF-8 BOMs are stripped from all sources to prevent -duplication in output files, and files are converted to Unix newlines. - diff --git a/vendor/mrclay/minify/UPGRADING.txt b/vendor/mrclay/minify/UPGRADING.txt deleted file mode 100644 index 647b9cc31..000000000 --- a/vendor/mrclay/minify/UPGRADING.txt +++ /dev/null @@ -1,28 +0,0 @@ -Minify Upgrade Guide - -UPGRADING FROM 2.1.* - -1. Rename the following files: - - /min/config.php --> /min/old_config.php - /min/groupsConfig.php --> /min/old_groupsConfig.php - -2. Overwrite all files in /min (and /min_unit_tests) with those from this zip. - -3. Delete /min/groupsConfig.php - -4. Rename /min/old_groupsConfig.php --> /min/groupsConfig.php - -5. Merge your settings in old_config.php into config.php. - -6. (optional) Delete /min/old_config.php. - - -INSTALLING FRESH - -See README.txt for instructions on installing this app for the first time. - - -SUPPORT - -Send a message to http://groups.google.com/group/minify \ No newline at end of file diff --git a/vendor/mrclay/minify/min/lib/CSSmin.php b/vendor/mrclay/minify/min/lib/CSSmin.php deleted file mode 100644 index 409a2ef7a..000000000 --- a/vendor/mrclay/minify/min/lib/CSSmin.php +++ /dev/null @@ -1,779 +0,0 @@ -memory_limit = 128 * 1048576; // 128MB in bytes - $this->max_execution_time = 60; // 1 min - $this->pcre_backtrack_limit = 1000 * 1000; - $this->pcre_recursion_limit = 500 * 1000; - - $this->raise_php_limits = (bool) $raise_php_limits; - } - - /** - * Minify a string of CSS - * @param string $css - * @param int|bool $linebreak_pos - * @return string - */ - public function run($css = '', $linebreak_pos = FALSE) - { - if (empty($css)) { - return ''; - } - - if ($this->raise_php_limits) { - $this->do_raise_php_limits(); - } - - $this->comments = array(); - $this->preserved_tokens = array(); - - $start_index = 0; - $length = strlen($css); - - $css = $this->extract_data_urls($css); - - // collect all comment blocks... - while (($start_index = $this->index_of($css, '/*', $start_index)) >= 0) { - $end_index = $this->index_of($css, '*/', $start_index + 2); - if ($end_index < 0) { - $end_index = $length; - } - $comment_found = $this->str_slice($css, $start_index + 2, $end_index); - $this->comments[] = $comment_found; - $comment_preserve_string = self::COMMENT . (count($this->comments) - 1) . '___'; - $css = $this->str_slice($css, 0, $start_index + 2) . $comment_preserve_string . $this->str_slice($css, $end_index); - // Set correct start_index: Fixes issue #2528130 - $start_index = $end_index + 2 + strlen($comment_preserve_string) - strlen($comment_found); - } - - // preserve strings so their content doesn't get accidentally minified - $css = preg_replace_callback('/(?:"(?:[^\\\\"]|\\\\.|\\\\)*")|'."(?:'(?:[^\\\\']|\\\\.|\\\\)*')/S", array($this, 'replace_string'), $css); - - // Let's divide css code in chunks of 5.000 chars aprox. - // Reason: PHP's PCRE functions like preg_replace have a "backtrack limit" - // of 100.000 chars by default (php < 5.3.7) so if we're dealing with really - // long strings and a (sub)pattern matches a number of chars greater than - // the backtrack limit number (i.e. /(.*)/s) PCRE functions may fail silently - // returning NULL and $css would be empty. - $charset = ''; - $charset_regexp = '/(@charset)( [^;]+;)/i'; - $css_chunks = array(); - $css_chunk_length = 5000; // aprox size, not exact - $start_index = 0; - $i = $css_chunk_length; // save initial iterations - $l = strlen($css); - - - // if the number of characters is 25000 or less, do not chunk - if ($l <= $css_chunk_length) { - $css_chunks[] = $css; - } else { - // chunk css code securely - while ($i < $l) { - $i += 50; // save iterations - if ($l - $start_index <= $css_chunk_length || $i >= $l) { - $css_chunks[] = $this->str_slice($css, $start_index); - break; - } - if ($css[$i - 1] === '}' && $i - $start_index > $css_chunk_length) { - // If there are two ending curly braces }} separated or not by spaces, - // join them in the same chunk (i.e. @media blocks) - $next_chunk = substr($css, $i); - if (preg_match('/^\s*\}/', $next_chunk)) { - $i = $i + $this->index_of($next_chunk, '}') + 1; - } - - $css_chunks[] = $this->str_slice($css, $start_index, $i); - $start_index = $i; - } - } - } - - // Minify each chunk - for ($i = 0, $n = count($css_chunks); $i < $n; $i++) { - $css_chunks[$i] = $this->minify($css_chunks[$i], $linebreak_pos); - // Keep the first @charset at-rule found - if (empty($charset) && preg_match($charset_regexp, $css_chunks[$i], $matches)) { - $charset = strtolower($matches[1]) . $matches[2]; - } - // Delete all @charset at-rules - $css_chunks[$i] = preg_replace($charset_regexp, '', $css_chunks[$i]); - } - - // Update the first chunk and push the charset to the top of the file. - $css_chunks[0] = $charset . $css_chunks[0]; - - return implode('', $css_chunks); - } - - /** - * Sets the memory limit for this script - * @param int|string $limit - */ - public function set_memory_limit($limit) - { - $this->memory_limit = $this->normalize_int($limit); - } - - /** - * Sets the maximum execution time for this script - * @param int|string $seconds - */ - public function set_max_execution_time($seconds) - { - $this->max_execution_time = (int) $seconds; - } - - /** - * Sets the PCRE backtrack limit for this script - * @param int $limit - */ - public function set_pcre_backtrack_limit($limit) - { - $this->pcre_backtrack_limit = (int) $limit; - } - - /** - * Sets the PCRE recursion limit for this script - * @param int $limit - */ - public function set_pcre_recursion_limit($limit) - { - $this->pcre_recursion_limit = (int) $limit; - } - - /** - * Try to configure PHP to use at least the suggested minimum settings - */ - private function do_raise_php_limits() - { - $php_limits = array( - 'memory_limit' => $this->memory_limit, - 'max_execution_time' => $this->max_execution_time, - 'pcre.backtrack_limit' => $this->pcre_backtrack_limit, - 'pcre.recursion_limit' => $this->pcre_recursion_limit - ); - - // If current settings are higher respect them. - foreach ($php_limits as $name => $suggested) { - $current = $this->normalize_int(ini_get($name)); - // memory_limit exception: allow -1 for "no memory limit". - if ($current > -1 && ($suggested == -1 || $current < $suggested)) { - ini_set($name, $suggested); - } - } - } - - /** - * Does bulk of the minification - * @param string $css - * @param int|bool $linebreak_pos - * @return string - */ - private function minify($css, $linebreak_pos) - { - // strings are safe, now wrestle the comments - for ($i = 0, $max = count($this->comments); $i < $max; $i++) { - - $token = $this->comments[$i]; - $placeholder = '/' . self::COMMENT . $i . '___/'; - - // ! in the first position of the comment means preserve - // so push to the preserved tokens keeping the ! - if (substr($token, 0, 1) === '!') { - $this->preserved_tokens[] = $token; - $token_tring = self::TOKEN . (count($this->preserved_tokens) - 1) . '___'; - $css = preg_replace($placeholder, $token_tring, $css, 1); - // Preserve new lines for /*! important comments - $css = preg_replace('/\s*[\n\r\f]+\s*(\/\*'. $token_tring .')/S', self::NL.'$1', $css); - $css = preg_replace('/('. $token_tring .'\*\/)\s*[\n\r\f]+\s*/', '$1'.self::NL, $css); - continue; - } - - // \ in the last position looks like hack for Mac/IE5 - // shorten that to /*\*/ and the next one to /**/ - if (substr($token, (strlen($token) - 1), 1) === '\\') { - $this->preserved_tokens[] = '\\'; - $css = preg_replace($placeholder, self::TOKEN . (count($this->preserved_tokens) - 1) . '___', $css, 1); - $i = $i + 1; // attn: advancing the loop - $this->preserved_tokens[] = ''; - $css = preg_replace('/' . self::COMMENT . $i . '___/', self::TOKEN . (count($this->preserved_tokens) - 1) . '___', $css, 1); - continue; - } - - // keep empty comments after child selectors (IE7 hack) - // e.g. html >/**/ body - if (strlen($token) === 0) { - $start_index = $this->index_of($css, $this->str_slice($placeholder, 1, -1)); - if ($start_index > 2) { - if (substr($css, $start_index - 3, 1) === '>') { - $this->preserved_tokens[] = ''; - $css = preg_replace($placeholder, self::TOKEN . (count($this->preserved_tokens) - 1) . '___', $css, 1); - } - } - } - - // in all other cases kill the comment - $css = preg_replace('/\/\*' . $this->str_slice($placeholder, 1, -1) . '\*\//', '', $css, 1); - } - - - // Normalize all whitespace strings to single spaces. Easier to work with that way. - $css = preg_replace('/\s+/', ' ', $css); - - // Fix IE7 issue on matrix filters which browser accept whitespaces between Matrix parameters - $css = preg_replace_callback('/\s*filter\:\s*progid:DXImageTransform\.Microsoft\.Matrix\(([^\)]+)\)/', array($this, 'preserve_old_IE_specific_matrix_definition'), $css); - - // Shorten & preserve calculations calc(...) since spaces are important - $css = preg_replace_callback('/calc(\(((?:[^\(\)]+|(?1))*)\))/i', array($this, 'replace_calc'), $css); - - // Replace positive sign from numbers preceded by : or a white-space before the leading space is removed - // +1.2em to 1.2em, +.8px to .8px, +2% to 2% - $css = preg_replace('/((? -9.0 to -9 - $css = preg_replace('/((?\+\(\)\]\~\=,])/', '$1', $css); - - // Restore spaces for !important - $css = preg_replace('/\!important/i', ' !important', $css); - - // bring back the colon - $css = preg_replace('/' . self::CLASSCOLON . '/', ':', $css); - - // retain space for special IE6 cases - $css = preg_replace_callback('/\:first\-(line|letter)(\{|,)/i', array($this, 'lowercase_pseudo_first'), $css); - - // no space after the end of a preserved comment - $css = preg_replace('/\*\/ /', '*/', $css); - - // lowercase some popular @directives - $css = preg_replace_callback('/@(font-face|import|(?:-(?:atsc|khtml|moz|ms|o|wap|webkit)-)?keyframe|media|page|namespace)/i', array($this, 'lowercase_directives'), $css); - - // lowercase some more common pseudo-elements - $css = preg_replace_callback('/:(active|after|before|checked|disabled|empty|enabled|first-(?:child|of-type)|focus|hover|last-(?:child|of-type)|link|only-(?:child|of-type)|root|:selection|target|visited)/i', array($this, 'lowercase_pseudo_elements'), $css); - - // lowercase some more common functions - $css = preg_replace_callback('/:(lang|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|(?:-(?:moz|webkit)-)?any)\(/i', array($this, 'lowercase_common_functions'), $css); - - // lower case some common function that can be values - // NOTE: rgb() isn't useful as we replace with #hex later, as well as and() is already done for us - $css = preg_replace_callback('/([:,\( ]\s*)(attr|color-stop|from|rgba|to|url|(?:-(?:atsc|khtml|moz|ms|o|wap|webkit)-)?(?:calc|max|min|(?:repeating-)?(?:linear|radial)-gradient)|-webkit-gradient)/iS', array($this, 'lowercase_common_functions_values'), $css); - - // Put the space back in some cases, to support stuff like - // @media screen and (-webkit-min-device-pixel-ratio:0){ - $css = preg_replace('/\band\(/i', 'and (', $css); - - // Put the space back in for @support tag - // @supports (display: flex) and @supports not (display: flex) - $css = preg_replace('/\b(supports|not)\(/i', '$1 (', $css); - - // Remove the spaces after the things that should not have spaces after them. - $css = preg_replace('/([\!\{\}\:;\>\+\(\[\~\=,])\s+/S', '$1', $css); - - // remove unnecessary semicolons - $css = preg_replace('/;+\}/', '}', $css); - - // Fix for issue: #2528146 - // Restore semicolon if the last property is prefixed with a `*` (lte IE7 hack) - // to avoid issues on Symbian S60 3.x browsers. - $css = preg_replace('/(\*[a-z0-9\-]+\s*\:[^;\}]+)(\})/', '$1;$2', $css); - - // Replace 0 length units 0(px,em,%) with 0. - $css = preg_replace('/(^|[^0-9])(?:0?\.)?0(?:em|ex|ch|rem|vw|vh|vm|vmin|cm|mm|in|px|pt|pc|%|deg|g?rad|m?s|k?hz)/iS', '${1}0', $css); - - // 0% step in a keyframe? restore the % unit - $css = preg_replace_callback('/(@[a-z\-]*?keyframes[^\{]*?\{)(.*?\}\s*\})/iS', array($this, 'replace_keyframe_zero'), $css); - - // Replace 0 0; or 0 0 0; or 0 0 0 0; with 0. - $css = preg_replace('/\:0(?: 0){1,3}(;|\}| \!)/', ':0$1', $css); - - // Fix for issue: #2528142 - // Replace text-shadow:0; with text-shadow:0 0 0; - $css = preg_replace('/(text-shadow\:0)(;|\}| \!)/i', '$1 0 0$2', $css); - - // Replace background-position:0; with background-position:0 0; - // same for transform-origin - // Changing -webkit-mask-position: 0 0 to just a single 0 will result in the second parameter defaulting to 50% (center) - $css = preg_replace('/(background\-position|webkit-mask-position|(?:webkit|moz|o|ms|)\-?transform\-origin)\:0(;|\}| \!)/iS', '$1:0 0$2', $css); - - // Shorten colors from rgb(51,102,153) to #336699, rgb(100%,0%,0%) to #ff0000 (sRGB color space) - // Shorten colors from hsl(0, 100%, 50%) to #ff0000 (sRGB color space) - // This makes it more likely that it'll get further compressed in the next step. - $css = preg_replace_callback('/rgb\s*\(\s*([0-9,\s\-\.\%]+)\s*\)(.{1})/i', array($this, 'rgb_to_hex'), $css); - $css = preg_replace_callback('/hsl\s*\(\s*([0-9,\s\-\.\%]+)\s*\)(.{1})/i', array($this, 'hsl_to_hex'), $css); - - // Shorten colors from #AABBCC to #ABC or short color name. - $css = $this->compress_hex_colors($css); - - // border: none to border:0, outline: none to outline:0 - $css = preg_replace('/(border\-?(?:top|right|bottom|left|)|outline)\:none(;|\}| \!)/iS', '$1:0$2', $css); - - // shorter opacity IE filter - $css = preg_replace('/progid\:DXImageTransform\.Microsoft\.Alpha\(Opacity\=/i', 'alpha(opacity=', $css); - - // Find a fraction that is used for Opera's -o-device-pixel-ratio query - // Add token to add the "\" back in later - $css = preg_replace('/\(([a-z\-]+):([0-9]+)\/([0-9]+)\)/i', '($1:$2'. self::QUERY_FRACTION .'$3)', $css); - - // Remove empty rules. - $css = preg_replace('/[^\};\{\/]+\{\}/S', '', $css); - - // Add "/" back to fix Opera -o-device-pixel-ratio query - $css = preg_replace('/'. self::QUERY_FRACTION .'/', '/', $css); - - // Replace multiple semi-colons in a row by a single one - // See SF bug #1980989 - $css = preg_replace('/;;+/', ';', $css); - - // Restore new lines for /*! important comments - $css = preg_replace('/'. self::NL .'/', "\n", $css); - - // Lowercase all uppercase properties - $css = preg_replace_callback('/(\{|\;)([A-Z\-]+)(\:)/', array($this, 'lowercase_properties'), $css); - - // Some source control tools don't like it when files containing lines longer - // than, say 8000 characters, are checked in. The linebreak option is used in - // that case to split long lines after a specific column. - if ($linebreak_pos !== FALSE && (int) $linebreak_pos >= 0) { - $linebreak_pos = (int) $linebreak_pos; - $start_index = $i = 0; - while ($i < strlen($css)) { - $i++; - if ($css[$i - 1] === '}' && $i - $start_index > $linebreak_pos) { - $css = $this->str_slice($css, 0, $i) . "\n" . $this->str_slice($css, $i); - $start_index = $i; - } - } - } - - // restore preserved comments and strings in reverse order - for ($i = count($this->preserved_tokens) - 1; $i >= 0; $i--) { - $css = preg_replace('/' . self::TOKEN . $i . '___/', $this->preserved_tokens[$i], $css, 1); - } - - // Trim the final string (for any leading or trailing white spaces) - return trim($css); - } - - /** - * Utility method to replace all data urls with tokens before we start - * compressing, to avoid performance issues running some of the subsequent - * regexes against large strings chunks. - * - * @param string $css - * @return string - */ - private function extract_data_urls($css) - { - // Leave data urls alone to increase parse performance. - $max_index = strlen($css) - 1; - $append_index = $index = $last_index = $offset = 0; - $sb = array(); - $pattern = '/url\(\s*(["\']?)data\:/i'; - - // Since we need to account for non-base64 data urls, we need to handle - // ' and ) being part of the data string. Hence switching to indexOf, - // to determine whether or not we have matching string terminators and - // handling sb appends directly, instead of using matcher.append* methods. - - while (preg_match($pattern, $css, $m, 0, $offset)) { - $index = $this->index_of($css, $m[0], $offset); - $last_index = $index + strlen($m[0]); - $start_index = $index + 4; // "url(".length() - $end_index = $last_index - 1; - $terminator = $m[1]; // ', " or empty (not quoted) - $found_terminator = FALSE; - - if (strlen($terminator) === 0) { - $terminator = ')'; - } - - while ($found_terminator === FALSE && $end_index+1 <= $max_index) { - $end_index = $this->index_of($css, $terminator, $end_index + 1); - - // endIndex == 0 doesn't really apply here - if ($end_index > 0 && substr($css, $end_index - 1, 1) !== '\\') { - $found_terminator = TRUE; - if (')' != $terminator) { - $end_index = $this->index_of($css, ')', $end_index); - } - } - } - - // Enough searching, start moving stuff over to the buffer - $sb[] = $this->str_slice($css, $append_index, $index); - - if ($found_terminator) { - $token = $this->str_slice($css, $start_index, $end_index); - $token = preg_replace('/\s+/', '', $token); - $this->preserved_tokens[] = $token; - - $preserver = 'url(' . self::TOKEN . (count($this->preserved_tokens) - 1) . '___)'; - $sb[] = $preserver; - - $append_index = $end_index + 1; - } else { - // No end terminator found, re-add the whole match. Should we throw/warn here? - $sb[] = $this->str_slice($css, $index, $last_index); - $append_index = $last_index; - } - - $offset = $last_index; - } - - $sb[] = $this->str_slice($css, $append_index); - - return implode('', $sb); - } - - /** - * Utility method to compress hex color values of the form #AABBCC to #ABC or short color name. - * - * DOES NOT compress CSS ID selectors which match the above pattern (which would break things). - * e.g. #AddressForm { ... } - * - * DOES NOT compress IE filters, which have hex color values (which would break things). - * e.g. filter: chroma(color="#FFFFFF"); - * - * DOES NOT compress invalid hex values. - * e.g. background-color: #aabbccdd - * - * @param string $css - * @return string - */ - private function compress_hex_colors($css) - { - // Look for hex colors inside { ... } (to avoid IDs) and which don't have a =, or a " in front of them (to avoid filters) - $pattern = '/(\=\s*?["\']?)?#([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])([0-9a-f])(\}|[^0-9a-f{][^{]*?\})/iS'; - $_index = $index = $last_index = $offset = 0; - $sb = array(); - // See: http://ajaxmin.codeplex.com/wikipage?title=CSS%20Colors - $short_safe = array( - '#808080' => 'gray', - '#008000' => 'green', - '#800000' => 'maroon', - '#000080' => 'navy', - '#808000' => 'olive', - '#ffa500' => 'orange', - '#800080' => 'purple', - '#c0c0c0' => 'silver', - '#008080' => 'teal', - '#f00' => 'red' - ); - - while (preg_match($pattern, $css, $m, 0, $offset)) { - $index = $this->index_of($css, $m[0], $offset); - $last_index = $index + strlen($m[0]); - $is_filter = $m[1] !== null && $m[1] !== ''; - - $sb[] = $this->str_slice($css, $_index, $index); - - if ($is_filter) { - // Restore, maintain case, otherwise filter will break - $sb[] = $m[1] . '#' . $m[2] . $m[3] . $m[4] . $m[5] . $m[6] . $m[7]; - } else { - if (strtolower($m[2]) == strtolower($m[3]) && - strtolower($m[4]) == strtolower($m[5]) && - strtolower($m[6]) == strtolower($m[7])) { - // Compress. - $hex = '#' . strtolower($m[3] . $m[5] . $m[7]); - } else { - // Non compressible color, restore but lower case. - $hex = '#' . strtolower($m[2] . $m[3] . $m[4] . $m[5] . $m[6] . $m[7]); - } - // replace Hex colors to short safe color names - $sb[] = array_key_exists($hex, $short_safe) ? $short_safe[$hex] : $hex; - } - - $_index = $offset = $last_index - strlen($m[8]); - } - - $sb[] = $this->str_slice($css, $_index); - - return implode('', $sb); - } - - /* CALLBACKS - * --------------------------------------------------------------------------------------------- - */ - - private function replace_string($matches) - { - $match = $matches[0]; - $quote = substr($match, 0, 1); - // Must use addcslashes in PHP to avoid parsing of backslashes - $match = addcslashes($this->str_slice($match, 1, -1), '\\'); - - // maybe the string contains a comment-like substring? - // one, maybe more? put'em back then - if (($pos = $this->index_of($match, self::COMMENT)) >= 0) { - for ($i = 0, $max = count($this->comments); $i < $max; $i++) { - $match = preg_replace('/' . self::COMMENT . $i . '___/', $this->comments[$i], $match, 1); - } - } - - // minify alpha opacity in filter strings - $match = preg_replace('/progid\:DXImageTransform\.Microsoft\.Alpha\(Opacity\=/i', 'alpha(opacity=', $match); - - $this->preserved_tokens[] = $match; - return $quote . self::TOKEN . (count($this->preserved_tokens) - 1) . '___' . $quote; - } - - private function replace_colon($matches) - { - return preg_replace('/\:/', self::CLASSCOLON, $matches[0]); - } - - private function replace_calc($matches) - { - $this->preserved_tokens[] = trim(preg_replace('/\s*([\*\/\(\),])\s*/', '$1', $matches[2])); - return 'calc('. self::TOKEN . (count($this->preserved_tokens) - 1) . '___' . ')'; - } - - private function preserve_old_IE_specific_matrix_definition($matches) - { - $this->preserved_tokens[] = $matches[1]; - return 'filter:progid:DXImageTransform.Microsoft.Matrix(' . self::TOKEN . (count($this->preserved_tokens) - 1) . '___' . ')'; - } - - private function replace_keyframe_zero($matches) - { - return $matches[1] . preg_replace('/0\s*,/', '0%,', preg_replace('/\s*0\s*\{/', '0%{', $matches[2])); - } - - private function rgb_to_hex($matches) - { - // Support for percentage values rgb(100%, 0%, 45%); - if ($this->index_of($matches[1], '%') >= 0){ - $rgbcolors = explode(',', str_replace('%', '', $matches[1])); - for ($i = 0; $i < count($rgbcolors); $i++) { - $rgbcolors[$i] = $this->round_number(floatval($rgbcolors[$i]) * 2.55); - } - } else { - $rgbcolors = explode(',', $matches[1]); - } - - // Values outside the sRGB color space should be clipped (0-255) - for ($i = 0; $i < count($rgbcolors); $i++) { - $rgbcolors[$i] = $this->clamp_number(intval($rgbcolors[$i], 10), 0, 255); - $rgbcolors[$i] = sprintf("%02x", $rgbcolors[$i]); - } - - // Fix for issue #2528093 - if (!preg_match('/[\s\,\);\}]/', $matches[2])){ - $matches[2] = ' ' . $matches[2]; - } - - return '#' . implode('', $rgbcolors) . $matches[2]; - } - - private function hsl_to_hex($matches) - { - $values = explode(',', str_replace('%', '', $matches[1])); - $h = floatval($values[0]); - $s = floatval($values[1]); - $l = floatval($values[2]); - - // Wrap and clamp, then fraction! - $h = ((($h % 360) + 360) % 360) / 360; - $s = $this->clamp_number($s, 0, 100) / 100; - $l = $this->clamp_number($l, 0, 100) / 100; - - if ($s == 0) { - $r = $g = $b = $this->round_number(255 * $l); - } else { - $v2 = $l < 0.5 ? $l * (1 + $s) : ($l + $s) - ($s * $l); - $v1 = (2 * $l) - $v2; - $r = $this->round_number(255 * $this->hue_to_rgb($v1, $v2, $h + (1/3))); - $g = $this->round_number(255 * $this->hue_to_rgb($v1, $v2, $h)); - $b = $this->round_number(255 * $this->hue_to_rgb($v1, $v2, $h - (1/3))); - } - - return $this->rgb_to_hex(array('', $r.','.$g.','.$b, $matches[2])); - } - - private function lowercase_pseudo_first($matches) - { - return ':first-'. strtolower($matches[1]) .' '. $matches[2]; - } - - private function lowercase_directives($matches) - { - return '@'. strtolower($matches[1]); - } - - private function lowercase_pseudo_elements($matches) - { - return ':'. strtolower($matches[1]); - } - - private function lowercase_common_functions($matches) - { - return ':'. strtolower($matches[1]) .'('; - } - - private function lowercase_common_functions_values($matches) - { - return $matches[1] . strtolower($matches[2]); - } - - private function lowercase_properties($matches) - { - return $matches[1].strtolower($matches[2]).$matches[3]; - } - - /* HELPERS - * --------------------------------------------------------------------------------------------- - */ - - private function hue_to_rgb($v1, $v2, $vh) - { - $vh = $vh < 0 ? $vh + 1 : ($vh > 1 ? $vh - 1 : $vh); - if ($vh * 6 < 1) return $v1 + ($v2 - $v1) * 6 * $vh; - if ($vh * 2 < 1) return $v2; - if ($vh * 3 < 2) return $v1 + ($v2 - $v1) * ((2/3) - $vh) * 6; - return $v1; - } - - private function round_number($n) - { - return intval(floor(floatval($n) + 0.5), 10); - } - - private function clamp_number($n, $min, $max) - { - return min(max($n, $min), $max); - } - - /** - * PHP port of Javascript's "indexOf" function for strings only - * Author: Tubal Martin http://blog.margenn.com - * - * @param string $haystack - * @param string $needle - * @param int $offset index (optional) - * @return int - */ - private function index_of($haystack, $needle, $offset = 0) - { - $index = strpos($haystack, $needle, $offset); - - return ($index !== FALSE) ? $index : -1; - } - - /** - * PHP port of Javascript's "slice" function for strings only - * Author: Tubal Martin http://blog.margenn.com - * Tests: http://margenn.com/tubal/str_slice/ - * - * @param string $str - * @param int $start index - * @param int|bool $end index (optional) - * @return string - */ - private function str_slice($str, $start = 0, $end = FALSE) - { - if ($end !== FALSE && ($start < 0 || $end <= 0)) { - $max = strlen($str); - - if ($start < 0) { - if (($start = $max + $start) < 0) { - return ''; - } - } - - if ($end < 0) { - if (($end = $max + $end) < 0) { - return ''; - } - } - - if ($end <= $start) { - return ''; - } - } - - $slice = ($end === FALSE) ? substr($str, $start) : substr($str, $start, $end - $start); - return ($slice === FALSE) ? '' : $slice; - } - - /** - * Convert strings like "64M" or "30" to int values - * @param mixed $size - * @return int - */ - private function normalize_int($size) - { - if (is_string($size)) { - switch (substr($size, -1)) { - case 'M': case 'm': return $size * 1048576; - case 'K': case 'k': return $size * 1024; - case 'G': case 'g': return $size * 1073741824; - } - } - - return (int) $size; - } -} diff --git a/vendor/mrclay/minify/min/lib/DooDigestAuth.php b/vendor/mrclay/minify/min/lib/DooDigestAuth.php deleted file mode 100644 index 69bc4ed4d..000000000 --- a/vendor/mrclay/minify/min/lib/DooDigestAuth.php +++ /dev/null @@ -1,121 +0,0 @@ - - * @link http://www.doophp.com/ - * @copyright Copyright © 2009 Leng Sheng Hong - * @license http://www.doophp.com/license - */ - -/** - * Handles HTTP digest authentication - * - *

HTTP digest authentication can be used with the URI router. - * HTTP digest is much more recommended over the use of HTTP Basic auth which doesn't provide any encryption. - * If you are running PHP on Apache in CGI/FastCGI mode, you would need to - * add the following line to your .htaccess for digest auth to work correctly.

- * RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L] - * - *

This class is tested under Apache 2.2 and Cherokee web server. It should work in both mod_php and cgi mode.

- * - * @author Leng Sheng Hong - * @version $Id: DooDigestAuth.php 1000 2009-07-7 18:27:22 - * @package doo.auth - * @since 1.0 - */ -class DooDigestAuth{ - - /** - * Authenticate against a list of username and passwords. - * - *

HTTP Digest Authentication doesn't work with PHP in CGI mode, - * you have to add this into your .htaccess RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]

- * - * @param string $realm Name of the authentication session - * @param array $users An assoc array of username and password: array('uname1'=>'pwd1', 'uname2'=>'pwd2') - * @param string $fail_msg Message to be displayed if the User cancel the login - * @param string $fail_url URL to be redirect if the User cancel the login - * @return string The username if login success. - */ - public static function http_auth($realm, $users, $fail_msg=NULL, $fail_url=NULL){ - $realm = "Restricted area - $realm"; - - //user => password - //$users = array('admin' => '1234', 'guest' => 'guest'); - if(!empty($_SERVER['REDIRECT_HTTP_AUTHORIZATION']) && strpos($_SERVER['REDIRECT_HTTP_AUTHORIZATION'], 'Digest')===0){ - $_SERVER['PHP_AUTH_DIGEST'] = $_SERVER['REDIRECT_HTTP_AUTHORIZATION']; - } - - if (empty($_SERVER['PHP_AUTH_DIGEST'])) { - header('WWW-Authenticate: Digest realm="'.$realm. - '",qop="auth",nonce="'.uniqid().'",opaque="'.md5($realm).'"'); - header('HTTP/1.1 401 Unauthorized'); - if($fail_msg!=NULL) - die($fail_msg); - if($fail_url!=NULL) - die(""); - exit; - } - - // analyze the PHP_AUTH_DIGEST variable - if (!($data = self::http_digest_parse($_SERVER['PHP_AUTH_DIGEST'])) || !isset($users[$data['username']])){ - header('WWW-Authenticate: Digest realm="'.$realm. - '",qop="auth",nonce="'.uniqid().'",opaque="'.md5($realm).'"'); - header('HTTP/1.1 401 Unauthorized'); - if($fail_msg!=NULL) - die($fail_msg); - if($fail_url!=NULL) - die(""); - exit; - } - - // generate the valid response - $A1 = md5($data['username'] . ':' . $realm . ':' . $users[$data['username']]); - $A2 = md5($_SERVER['REQUEST_METHOD'].':'.$data['uri']); - $valid_response = md5($A1.':'.$data['nonce'].':'.$data['nc'].':'.$data['cnonce'].':'.$data['qop'].':'.$A2); - - if ($data['response'] != $valid_response){ - header('HTTP/1.1 401 Unauthorized'); - header('WWW-Authenticate: Digest realm="'.$realm. - '",qop="auth",nonce="'.uniqid().'",opaque="'.md5($realm).'"'); - if($fail_msg!=NULL) - die($fail_msg); - if($fail_url!=NULL) - die(""); - exit; - } - - // ok, valid username & password - return $data['username']; - } - - /** - * Method to parse the http auth header, works with IE. - * - * Internet Explorer returns a qop="xxxxxxxxxxx" in the header instead of qop=xxxxxxxxxxx as most browsers do. - * - * @param string $txt header string to parse - * @return array An assoc array of the digest auth session - */ - private static function http_digest_parse($txt) - { - $res = preg_match("/username=\"([^\"]+)\"/i", $txt, $match); - $data['username'] = (isset($match[1]))?$match[1]:null; - $res = preg_match('/nonce=\"([^\"]+)\"/i', $txt, $match); - $data['nonce'] = $match[1]; - $res = preg_match('/nc=([0-9]+)/i', $txt, $match); - $data['nc'] = $match[1]; - $res = preg_match('/cnonce=\"([^\"]+)\"/i', $txt, $match); - $data['cnonce'] = $match[1]; - $res = preg_match('/qop=([^,]+)/i', $txt, $match); - $data['qop'] = str_replace('"','',$match[1]); - $res = preg_match('/uri=\"([^\"]+)\"/i', $txt, $match); - $data['uri'] = $match[1]; - $res = preg_match('/response=\"([^\"]+)\"/i', $txt, $match); - $data['response'] = $match[1]; - return $data; - } - - -} diff --git a/vendor/mrclay/minify/min/lib/FirePHP.php b/vendor/mrclay/minify/min/lib/FirePHP.php deleted file mode 100644 index d301a641a..000000000 --- a/vendor/mrclay/minify/min/lib/FirePHP.php +++ /dev/null @@ -1,1370 +0,0 @@ - - * @license http://www.opensource.org/licenses/bsd-license.php - * @package FirePHP - */ - - -/** - * Sends the given data to the FirePHP Firefox Extension. - * The data can be displayed in the Firebug Console or in the - * "Server" request tab. - * - * For more information see: http://www.firephp.org/ - * - * @copyright Copyright (C) 2007-2008 Christoph Dorn - * @author Christoph Dorn - * @license http://www.opensource.org/licenses/bsd-license.php - * @package FirePHP - */ -class FirePHP { - - /** - * FirePHP version - * - * @var string - */ - const VERSION = '0.2.0'; - - /** - * Firebug LOG level - * - * Logs a message to firebug console. - * - * @var string - */ - const LOG = 'LOG'; - - /** - * Firebug INFO level - * - * Logs a message to firebug console and displays an info icon before the message. - * - * @var string - */ - const INFO = 'INFO'; - - /** - * Firebug WARN level - * - * Logs a message to firebug console, displays an warning icon before the message and colors the line turquoise. - * - * @var string - */ - const WARN = 'WARN'; - - /** - * Firebug ERROR level - * - * Logs a message to firebug console, displays an error icon before the message and colors the line yellow. Also increments the firebug error count. - * - * @var string - */ - const ERROR = 'ERROR'; - - /** - * Dumps a variable to firebug's server panel - * - * @var string - */ - const DUMP = 'DUMP'; - - /** - * Displays a stack trace in firebug console - * - * @var string - */ - const TRACE = 'TRACE'; - - /** - * Displays an exception in firebug console - * - * Increments the firebug error count. - * - * @var string - */ - const EXCEPTION = 'EXCEPTION'; - - /** - * Displays an table in firebug console - * - * @var string - */ - const TABLE = 'TABLE'; - - /** - * Starts a group in firebug console - * - * @var string - */ - const GROUP_START = 'GROUP_START'; - - /** - * Ends a group in firebug console - * - * @var string - */ - const GROUP_END = 'GROUP_END'; - - /** - * Singleton instance of FirePHP - * - * @var FirePHP - */ - protected static $instance = null; - - /** - * Wildfire protocol message index - * - * @var int - */ - protected $messageIndex = 1; - - /** - * Options for the library - * - * @var array - */ - protected $options = array(); - - /** - * Filters used to exclude object members when encoding - * - * @var array - */ - protected $objectFilters = array(); - - /** - * A stack of objects used to detect recursion during object encoding - * - * @var object - */ - protected $objectStack = array(); - - /** - * Flag to enable/disable logging - * - * @var boolean - */ - protected $enabled = true; - - /** - * The object constructor - */ - function __construct() { - $this->options['maxObjectDepth'] = 10; - $this->options['maxArrayDepth'] = 20; - $this->options['useNativeJsonEncode'] = true; - $this->options['includeLineNumbers'] = true; - } - - /** - * When the object gets serialized only include specific object members. - * - * @return array - */ - public function __sleep() { - return array('options','objectFilters','enabled'); - } - - /** - * Gets singleton instance of FirePHP - * - * @param boolean $AutoCreate - * @return FirePHP - */ - public static function getInstance($AutoCreate=false) { - if($AutoCreate===true && !self::$instance) { - self::init(); - } - return self::$instance; - } - - /** - * Creates FirePHP object and stores it for singleton access - * - * @return FirePHP - */ - public static function init() { - return self::$instance = new self(); - } - - /** - * Enable and disable logging to Firebug - * - * @param boolean $Enabled TRUE to enable, FALSE to disable - * @return void - */ - public function setEnabled($Enabled) { - $this->enabled = $Enabled; - } - - /** - * Check if logging is enabled - * - * @return boolean TRUE if enabled - */ - public function getEnabled() { - return $this->enabled; - } - - /** - * Specify a filter to be used when encoding an object - * - * Filters are used to exclude object members. - * - * @param string $Class The class name of the object - * @param array $Filter An array or members to exclude - * @return void - */ - public function setObjectFilter($Class, $Filter) { - $this->objectFilters[$Class] = $Filter; - } - - /** - * Set some options for the library - * - * Options: - * - maxObjectDepth: The maximum depth to traverse objects (default: 10) - * - maxArrayDepth: The maximum depth to traverse arrays (default: 20) - * - useNativeJsonEncode: If true will use json_encode() (default: true) - * - includeLineNumbers: If true will include line numbers and filenames (default: true) - * - * @param array $Options The options to be set - * @return void - */ - public function setOptions($Options) { - $this->options = array_merge($this->options,$Options); - } - - /** - * Register FirePHP as your error handler - * - * Will throw exceptions for each php error. - */ - public function registerErrorHandler() - { - //NOTE: The following errors will not be caught by this error handler: - // E_ERROR, E_PARSE, E_CORE_ERROR, - // E_CORE_WARNING, E_COMPILE_ERROR, - // E_COMPILE_WARNING, E_STRICT - - set_error_handler(array($this,'errorHandler')); - } - - /** - * FirePHP's error handler - * - * Throws exception for each php error that will occur. - * - * @param int $errno - * @param string $errstr - * @param string $errfile - * @param int $errline - * @param array $errcontext - */ - public function errorHandler($errno, $errstr, $errfile, $errline, $errcontext) - { - // Don't throw exception if error reporting is switched off - if (error_reporting() == 0) { - return; - } - // Only throw exceptions for errors we are asking for - if (error_reporting() & $errno) { - throw new ErrorException($errstr, 0, $errno, $errfile, $errline); - } - } - - /** - * Register FirePHP as your exception handler - */ - public function registerExceptionHandler() - { - set_exception_handler(array($this,'exceptionHandler')); - } - - /** - * FirePHP's exception handler - * - * Logs all exceptions to your firebug console and then stops the script. - * - * @param Exception $Exception - * @throws Exception - */ - function exceptionHandler($Exception) { - $this->fb($Exception); - } - - /** - * Set custom processor url for FirePHP - * - * @param string $URL - */ - public function setProcessorUrl($URL) - { - $this->setHeader('X-FirePHP-ProcessorURL', $URL); - } - - /** - * Set custom renderer url for FirePHP - * - * @param string $URL - */ - public function setRendererUrl($URL) - { - $this->setHeader('X-FirePHP-RendererURL', $URL); - } - - /** - * Start a group for following messages - * - * @param string $Name - * @return true - * @throws Exception - */ - public function group($Name) { - return $this->fb(null, $Name, FirePHP::GROUP_START); - } - - /** - * Ends a group you have started before - * - * @return true - * @throws Exception - */ - public function groupEnd() { - return $this->fb(null, null, FirePHP::GROUP_END); - } - - /** - * Log object with label to firebug console - * - * @see FirePHP::LOG - * @param mixes $Object - * @param string $Label - * @return true - * @throws Exception - */ - public function log($Object, $Label=null) { - return $this->fb($Object, $Label, FirePHP::LOG); - } - - /** - * Log object with label to firebug console - * - * @see FirePHP::INFO - * @param mixes $Object - * @param string $Label - * @return true - * @throws Exception - */ - public function info($Object, $Label=null) { - return $this->fb($Object, $Label, FirePHP::INFO); - } - - /** - * Log object with label to firebug console - * - * @see FirePHP::WARN - * @param mixes $Object - * @param string $Label - * @return true - * @throws Exception - */ - public function warn($Object, $Label=null) { - return $this->fb($Object, $Label, FirePHP::WARN); - } - - /** - * Log object with label to firebug console - * - * @see FirePHP::ERROR - * @param mixes $Object - * @param string $Label - * @return true - * @throws Exception - */ - public function error($Object, $Label=null) { - return $this->fb($Object, $Label, FirePHP::ERROR); - } - - /** - * Dumps key and variable to firebug server panel - * - * @see FirePHP::DUMP - * @param string $Key - * @param mixed $Variable - * @return true - * @throws Exception - */ - public function dump($Key, $Variable) { - return $this->fb($Variable, $Key, FirePHP::DUMP); - } - - /** - * Log a trace in the firebug console - * - * @see FirePHP::TRACE - * @param string $Label - * @return true - * @throws Exception - */ - public function trace($Label) { - return $this->fb($Label, FirePHP::TRACE); - } - - /** - * Log a table in the firebug console - * - * @see FirePHP::TABLE - * @param string $Label - * @param string $Table - * @return true - * @throws Exception - */ - public function table($Label, $Table) { - return $this->fb($Table, $Label, FirePHP::TABLE); - } - - /** - * Check if FirePHP is installed on client - * - * @return boolean - */ - public function detectClientExtension() { - /* Check if FirePHP is installed on client */ - if(!@preg_match_all('/\sFirePHP\/([\.|\d]*)\s?/si',$this->getUserAgent(),$m) || - !version_compare($m[1][0],'0.0.6','>=')) { - return false; - } - return true; - } - - /** - * Log varible to Firebug - * - * @see http://www.firephp.org/Wiki/Reference/Fb - * @param mixed $Object The variable to be logged - * @return true Return TRUE if message was added to headers, FALSE otherwise - * @throws Exception - */ - public function fb($Object) { - - if(!$this->enabled) { - return false; - } - - if (headers_sent($filename, $linenum)) { - throw $this->newException('Headers already sent in '.$filename.' on line '.$linenum.'. Cannot send log data to FirePHP. You must have Output Buffering enabled via ob_start() or output_buffering ini directive.'); - } - - $Type = null; - $Label = null; - - if(func_num_args()==1) { - } else - if(func_num_args()==2) { - switch(func_get_arg(1)) { - case self::LOG: - case self::INFO: - case self::WARN: - case self::ERROR: - case self::DUMP: - case self::TRACE: - case self::EXCEPTION: - case self::TABLE: - case self::GROUP_START: - case self::GROUP_END: - $Type = func_get_arg(1); - break; - default: - $Label = func_get_arg(1); - break; - } - } else - if(func_num_args()==3) { - $Type = func_get_arg(2); - $Label = func_get_arg(1); - } else { - throw $this->newException('Wrong number of arguments to fb() function!'); - } - - - if(!$this->detectClientExtension()) { - return false; - } - - $meta = array(); - $skipFinalObjectEncode = false; - - if($Object instanceof Exception) { - - $meta['file'] = $this->_escapeTraceFile($Object->getFile()); - $meta['line'] = $Object->getLine(); - - $trace = $Object->getTrace(); - if($Object instanceof ErrorException - && isset($trace[0]['function']) - && $trace[0]['function']=='errorHandler' - && isset($trace[0]['class']) - && $trace[0]['class']=='FirePHP') { - - $severity = false; - switch($Object->getSeverity()) { - case E_WARNING: $severity = 'E_WARNING'; break; - case E_NOTICE: $severity = 'E_NOTICE'; break; - case E_USER_ERROR: $severity = 'E_USER_ERROR'; break; - case E_USER_WARNING: $severity = 'E_USER_WARNING'; break; - case E_USER_NOTICE: $severity = 'E_USER_NOTICE'; break; - case E_STRICT: $severity = 'E_STRICT'; break; - case E_RECOVERABLE_ERROR: $severity = 'E_RECOVERABLE_ERROR'; break; - case E_DEPRECATED: $severity = 'E_DEPRECATED'; break; - case E_USER_DEPRECATED: $severity = 'E_USER_DEPRECATED'; break; - } - - $Object = array('Class'=>get_class($Object), - 'Message'=>$severity.': '.$Object->getMessage(), - 'File'=>$this->_escapeTraceFile($Object->getFile()), - 'Line'=>$Object->getLine(), - 'Type'=>'trigger', - 'Trace'=>$this->_escapeTrace(array_splice($trace,2))); - $skipFinalObjectEncode = true; - } else { - $Object = array('Class'=>get_class($Object), - 'Message'=>$Object->getMessage(), - 'File'=>$this->_escapeTraceFile($Object->getFile()), - 'Line'=>$Object->getLine(), - 'Type'=>'throw', - 'Trace'=>$this->_escapeTrace($trace)); - $skipFinalObjectEncode = true; - } - $Type = self::EXCEPTION; - - } else - if($Type==self::TRACE) { - - $trace = debug_backtrace(); - if(!$trace) return false; - for( $i=0 ; $i_standardizePath($trace[$i]['file']),-18,18)=='FirePHPCore/fb.php' - || substr($this->_standardizePath($trace[$i]['file']),-29,29)=='FirePHPCore/FirePHP.class.php')) { - /* Skip - FB::trace(), FB::send(), $firephp->trace(), $firephp->fb() */ - } else - if(isset($trace[$i]['class']) - && isset($trace[$i+1]['file']) - && $trace[$i]['class']=='FirePHP' - && substr($this->_standardizePath($trace[$i+1]['file']),-18,18)=='FirePHPCore/fb.php') { - /* Skip fb() */ - } else - if($trace[$i]['function']=='fb' - || $trace[$i]['function']=='trace' - || $trace[$i]['function']=='send') { - $Object = array('Class'=>isset($trace[$i]['class'])?$trace[$i]['class']:'', - 'Type'=>isset($trace[$i]['type'])?$trace[$i]['type']:'', - 'Function'=>isset($trace[$i]['function'])?$trace[$i]['function']:'', - 'Message'=>$trace[$i]['args'][0], - 'File'=>isset($trace[$i]['file'])?$this->_escapeTraceFile($trace[$i]['file']):'', - 'Line'=>isset($trace[$i]['line'])?$trace[$i]['line']:'', - 'Args'=>isset($trace[$i]['args'])?$this->encodeObject($trace[$i]['args']):'', - 'Trace'=>$this->_escapeTrace(array_splice($trace,$i+1))); - - $skipFinalObjectEncode = true; - $meta['file'] = isset($trace[$i]['file'])?$this->_escapeTraceFile($trace[$i]['file']):''; - $meta['line'] = isset($trace[$i]['line'])?$trace[$i]['line']:''; - break; - } - } - - } else - if($Type==self::TABLE) { - - if(isset($Object[0]) && is_string($Object[0])) { - $Object[1] = $this->encodeTable($Object[1]); - } else { - $Object = $this->encodeTable($Object); - } - - $skipFinalObjectEncode = true; - - } else { - if($Type===null) { - $Type = self::LOG; - } - } - - if($this->options['includeLineNumbers']) { - if(!isset($meta['file']) || !isset($meta['line'])) { - - $trace = debug_backtrace(); - for( $i=0 ; $trace && $i_standardizePath($trace[$i]['file']),-18,18)=='FirePHPCore/fb.php' - || substr($this->_standardizePath($trace[$i]['file']),-29,29)=='FirePHPCore/FirePHP.class.php')) { - /* Skip - FB::trace(), FB::send(), $firephp->trace(), $firephp->fb() */ - } else - if(isset($trace[$i]['class']) - && isset($trace[$i+1]['file']) - && $trace[$i]['class']=='FirePHP' - && substr($this->_standardizePath($trace[$i+1]['file']),-18,18)=='FirePHPCore/fb.php') { - /* Skip fb() */ - } else - if(isset($trace[$i]['file']) - && substr($this->_standardizePath($trace[$i]['file']),-18,18)=='FirePHPCore/fb.php') { - /* Skip FB::fb() */ - } else { - $meta['file'] = isset($trace[$i]['file'])?$this->_escapeTraceFile($trace[$i]['file']):''; - $meta['line'] = isset($trace[$i]['line'])?$trace[$i]['line']:''; - break; - } - } - - } - } else { - unset($meta['file']); - unset($meta['line']); - } - - $this->setHeader('X-Wf-Protocol-1','http://meta.wildfirehq.org/Protocol/JsonStream/0.2'); - $this->setHeader('X-Wf-1-Plugin-1','http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/'.self::VERSION); - - $structure_index = 1; - if($Type==self::DUMP) { - $structure_index = 2; - $this->setHeader('X-Wf-1-Structure-2','http://meta.firephp.org/Wildfire/Structure/FirePHP/Dump/0.1'); - } else { - $this->setHeader('X-Wf-1-Structure-1','http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1'); - } - - if($Type==self::DUMP) { - $msg = '{"'.$Label.'":'.$this->jsonEncode($Object, $skipFinalObjectEncode).'}'; - } else { - $msg_meta = array('Type'=>$Type); - if($Label!==null) { - $msg_meta['Label'] = $Label; - } - if(isset($meta['file'])) { - $msg_meta['File'] = $meta['file']; - } - if(isset($meta['line'])) { - $msg_meta['Line'] = $meta['line']; - } - $msg = '['.$this->jsonEncode($msg_meta).','.$this->jsonEncode($Object, $skipFinalObjectEncode).']'; - } - - $parts = explode("\n",chunk_split($msg, 5000, "\n")); - - for( $i=0 ; $i2) { - // Message needs to be split into multiple parts - $this->setHeader('X-Wf-1-'.$structure_index.'-'.'1-'.$this->messageIndex, - (($i==0)?strlen($msg):'') - . '|' . $part . '|' - . (($isetHeader('X-Wf-1-'.$structure_index.'-'.'1-'.$this->messageIndex, - strlen($part) . '|' . $part . '|'); - } - - $this->messageIndex++; - - if ($this->messageIndex > 99999) { - throw new Exception('Maximum number (99,999) of messages reached!'); - } - } - } - - $this->setHeader('X-Wf-1-Index',$this->messageIndex-1); - - return true; - } - - /** - * Standardizes path for windows systems. - * - * @param string $Path - * @return string - */ - protected function _standardizePath($Path) { - return preg_replace('/\\\\+/','/',$Path); - } - - /** - * Escape trace path for windows systems - * - * @param array $Trace - * @return array - */ - protected function _escapeTrace($Trace) { - if(!$Trace) return $Trace; - for( $i=0 ; $i_escapeTraceFile($Trace[$i]['file']); - } - if(isset($Trace[$i]['args'])) { - $Trace[$i]['args'] = $this->encodeObject($Trace[$i]['args']); - } - } - return $Trace; - } - - /** - * Escape file information of trace for windows systems - * - * @param string $File - * @return string - */ - protected function _escapeTraceFile($File) { - /* Check if we have a windows filepath */ - if(strpos($File,'\\')) { - /* First strip down to single \ */ - - $file = preg_replace('/\\\\+/','\\',$File); - - return $file; - } - return $File; - } - - /** - * Send header - * - * @param string $Name - * @param string_type $Value - */ - protected function setHeader($Name, $Value) { - return header($Name.': '.$Value); - } - - /** - * Get user agent - * - * @return string|false - */ - protected function getUserAgent() { - if(!isset($_SERVER['HTTP_USER_AGENT'])) return false; - return $_SERVER['HTTP_USER_AGENT']; - } - - /** - * Returns a new exception - * - * @param string $Message - * @return Exception - */ - protected function newException($Message) { - return new Exception($Message); - } - - /** - * Encode an object into a JSON string - * - * Uses PHP's jeson_encode() if available - * - * @param object $Object The object to be encoded - * @return string The JSON string - */ - protected function jsonEncode($Object, $skipObjectEncode=false) - { - if(!$skipObjectEncode) { - $Object = $this->encodeObject($Object); - } - - if(function_exists('json_encode') - && $this->options['useNativeJsonEncode']!=false) { - - return json_encode($Object); - } else { - return $this->json_encode($Object); - } - } - - /** - * Encodes a table by encoding each row and column with encodeObject() - * - * @param array $Table The table to be encoded - * @return array - */ - protected function encodeTable($Table) { - if(!$Table) return $Table; - for( $i=0 ; $iencodeObject($Table[$i][$j]); - } - } - } - return $Table; - } - - /** - * Encodes an object including members with - * protected and private visibility - * - * @param Object $Object The object to be encoded - * @param int $Depth The current traversal depth - * @return array All members of the object - */ - protected function encodeObject($Object, $ObjectDepth = 1, $ArrayDepth = 1) - { - $return = array(); - - if (is_object($Object)) { - - if ($ObjectDepth > $this->options['maxObjectDepth']) { - return '** Max Object Depth ('.$this->options['maxObjectDepth'].') **'; - } - - foreach ($this->objectStack as $refVal) { - if ($refVal === $Object) { - return '** Recursion ('.get_class($Object).') **'; - } - } - array_push($this->objectStack, $Object); - - $return['__className'] = $class = get_class($Object); - - $reflectionClass = new ReflectionClass($class); - $properties = array(); - foreach( $reflectionClass->getProperties() as $property) { - $properties[$property->getName()] = $property; - } - - $members = (array)$Object; - - foreach( $properties as $raw_name => $property ) { - - $name = $raw_name; - if($property->isStatic()) { - $name = 'static:'.$name; - } - if($property->isPublic()) { - $name = 'public:'.$name; - } else - if($property->isPrivate()) { - $name = 'private:'.$name; - $raw_name = "\0".$class."\0".$raw_name; - } else - if($property->isProtected()) { - $name = 'protected:'.$name; - $raw_name = "\0".'*'."\0".$raw_name; - } - - if(!(isset($this->objectFilters[$class]) - && is_array($this->objectFilters[$class]) - && in_array($raw_name,$this->objectFilters[$class]))) { - - if(array_key_exists($raw_name,$members) - && !$property->isStatic()) { - - $return[$name] = $this->encodeObject($members[$raw_name], $ObjectDepth + 1, 1); - - } else { - if(method_exists($property,'setAccessible')) { - $property->setAccessible(true); - $return[$name] = $this->encodeObject($property->getValue($Object), $ObjectDepth + 1, 1); - } else - if($property->isPublic()) { - $return[$name] = $this->encodeObject($property->getValue($Object), $ObjectDepth + 1, 1); - } else { - $return[$name] = '** Need PHP 5.3 to get value **'; - } - } - } else { - $return[$name] = '** Excluded by Filter **'; - } - } - - // Include all members that are not defined in the class - // but exist in the object - foreach( $members as $raw_name => $value ) { - - $name = $raw_name; - - if ($name{0} == "\0") { - $parts = explode("\0", $name); - $name = $parts[2]; - } - - if(!isset($properties[$name])) { - $name = 'undeclared:'.$name; - - if(!(isset($this->objectFilters[$class]) - && is_array($this->objectFilters[$class]) - && in_array($raw_name,$this->objectFilters[$class]))) { - - $return[$name] = $this->encodeObject($value, $ObjectDepth + 1, 1); - } else { - $return[$name] = '** Excluded by Filter **'; - } - } - } - - array_pop($this->objectStack); - - } elseif (is_array($Object)) { - - if ($ArrayDepth > $this->options['maxArrayDepth']) { - return '** Max Array Depth ('.$this->options['maxArrayDepth'].') **'; - } - - foreach ($Object as $key => $val) { - - // Encoding the $GLOBALS PHP array causes an infinite loop - // if the recursion is not reset here as it contains - // a reference to itself. This is the only way I have come up - // with to stop infinite recursion in this case. - if($key=='GLOBALS' - && is_array($val) - && array_key_exists('GLOBALS',$val)) { - $val['GLOBALS'] = '** Recursion (GLOBALS) **'; - } - - $return[$key] = $this->encodeObject($val, 1, $ArrayDepth + 1); - } - } else { - if(self::is_utf8($Object)) { - return $Object; - } else { - return utf8_encode($Object); - } - } - return $return; - } - - /** - * Returns true if $string is valid UTF-8 and false otherwise. - * - * @param mixed $str String to be tested - * @return boolean - */ - protected static function is_utf8($str) { - $c=0; $b=0; - $bits=0; - $len=strlen($str); - for($i=0; $i<$len; $i++){ - $c=ord($str[$i]); - if($c > 128){ - if(($c >= 254)) return false; - elseif($c >= 252) $bits=6; - elseif($c >= 248) $bits=5; - elseif($c >= 240) $bits=4; - elseif($c >= 224) $bits=3; - elseif($c >= 192) $bits=2; - else return false; - if(($i+$bits) > $len) return false; - while($bits > 1){ - $i++; - $b=ord($str[$i]); - if($b < 128 || $b > 191) return false; - $bits--; - } - } - } - return true; - } - - /** - * Converts to and from JSON format. - * - * JSON (JavaScript Object Notation) is a lightweight data-interchange - * format. It is easy for humans to read and write. It is easy for machines - * to parse and generate. It is based on a subset of the JavaScript - * Programming Language, Standard ECMA-262 3rd Edition - December 1999. - * This feature can also be found in Python. JSON is a text format that is - * completely language independent but uses conventions that are familiar - * to programmers of the C-family of languages, including C, C++, C#, Java, - * JavaScript, Perl, TCL, and many others. These properties make JSON an - * ideal data-interchange language. - * - * This package provides a simple encoder and decoder for JSON notation. It - * is intended for use with client-side Javascript applications that make - * use of HTTPRequest to perform server communication functions - data can - * be encoded into JSON notation for use in a client-side javascript, or - * decoded from incoming Javascript requests. JSON format is native to - * Javascript, and can be directly eval()'ed with no further parsing - * overhead - * - * All strings should be in ASCII or UTF-8 format! - * - * LICENSE: Redistribution and use in source and binary forms, with or - * without modification, are permitted provided that the following - * conditions are met: Redistributions of source code must retain the - * above copyright notice, this list of conditions and the following - * disclaimer. Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN - * NO EVENT SHALL CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR - * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE - * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH - * DAMAGE. - * - * @category - * @package Services_JSON - * @author Michal Migurski - * @author Matt Knapp - * @author Brett Stimmerman - * @author Christoph Dorn - * @copyright 2005 Michal Migurski - * @version CVS: $Id: JSON.php,v 1.31 2006/06/28 05:54:17 migurski Exp $ - * @license http://www.opensource.org/licenses/bsd-license.php - * @link http://pear.php.net/pepr/pepr-proposal-show.php?id=198 - */ - - - /** - * Keep a list of objects as we descend into the array so we can detect recursion. - */ - private $json_objectStack = array(); - - - /** - * convert a string from one UTF-8 char to one UTF-16 char - * - * Normally should be handled by mb_convert_encoding, but - * provides a slower PHP-only method for installations - * that lack the multibye string extension. - * - * @param string $utf8 UTF-8 character - * @return string UTF-16 character - * @access private - */ - private function json_utf82utf16($utf8) - { - // oh please oh please oh please oh please oh please - if(function_exists('mb_convert_encoding')) { - return mb_convert_encoding($utf8, 'UTF-16', 'UTF-8'); - } - - switch(strlen($utf8)) { - case 1: - // this case should never be reached, because we are in ASCII range - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - return $utf8; - - case 2: - // return a UTF-16 character from a 2-byte UTF-8 char - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - return chr(0x07 & (ord($utf8{0}) >> 2)) - . chr((0xC0 & (ord($utf8{0}) << 6)) - | (0x3F & ord($utf8{1}))); - - case 3: - // return a UTF-16 character from a 3-byte UTF-8 char - // see: http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - return chr((0xF0 & (ord($utf8{0}) << 4)) - | (0x0F & (ord($utf8{1}) >> 2))) - . chr((0xC0 & (ord($utf8{1}) << 6)) - | (0x7F & ord($utf8{2}))); - } - - // ignoring UTF-32 for now, sorry - return ''; - } - - /** - * encodes an arbitrary variable into JSON format - * - * @param mixed $var any number, boolean, string, array, or object to be encoded. - * see argument 1 to Services_JSON() above for array-parsing behavior. - * if var is a strng, note that encode() always expects it - * to be in ASCII or UTF-8 format! - * - * @return mixed JSON string representation of input var or an error if a problem occurs - * @access public - */ - private function json_encode($var) - { - - if(is_object($var)) { - if(in_array($var,$this->json_objectStack)) { - return '"** Recursion **"'; - } - } - - switch (gettype($var)) { - case 'boolean': - return $var ? 'true' : 'false'; - - case 'NULL': - return 'null'; - - case 'integer': - return (int) $var; - - case 'double': - case 'float': - return (float) $var; - - case 'string': - // STRINGS ARE EXPECTED TO BE IN ASCII OR UTF-8 FORMAT - $ascii = ''; - $strlen_var = strlen($var); - - /* - * Iterate over every character in the string, - * escaping with a slash or encoding to UTF-8 where necessary - */ - for ($c = 0; $c < $strlen_var; ++$c) { - - $ord_var_c = ord($var{$c}); - - switch (true) { - case $ord_var_c == 0x08: - $ascii .= '\b'; - break; - case $ord_var_c == 0x09: - $ascii .= '\t'; - break; - case $ord_var_c == 0x0A: - $ascii .= '\n'; - break; - case $ord_var_c == 0x0C: - $ascii .= '\f'; - break; - case $ord_var_c == 0x0D: - $ascii .= '\r'; - break; - - case $ord_var_c == 0x22: - case $ord_var_c == 0x2F: - case $ord_var_c == 0x5C: - // double quote, slash, slosh - $ascii .= '\\'.$var{$c}; - break; - - case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)): - // characters U-00000000 - U-0000007F (same as ASCII) - $ascii .= $var{$c}; - break; - - case (($ord_var_c & 0xE0) == 0xC0): - // characters U-00000080 - U-000007FF, mask 110XXXXX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $char = pack('C*', $ord_var_c, ord($var{$c + 1})); - $c += 1; - $utf16 = $this->json_utf82utf16($char); - $ascii .= sprintf('\u%04s', bin2hex($utf16)); - break; - - case (($ord_var_c & 0xF0) == 0xE0): - // characters U-00000800 - U-0000FFFF, mask 1110XXXX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $char = pack('C*', $ord_var_c, - ord($var{$c + 1}), - ord($var{$c + 2})); - $c += 2; - $utf16 = $this->json_utf82utf16($char); - $ascii .= sprintf('\u%04s', bin2hex($utf16)); - break; - - case (($ord_var_c & 0xF8) == 0xF0): - // characters U-00010000 - U-001FFFFF, mask 11110XXX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $char = pack('C*', $ord_var_c, - ord($var{$c + 1}), - ord($var{$c + 2}), - ord($var{$c + 3})); - $c += 3; - $utf16 = $this->json_utf82utf16($char); - $ascii .= sprintf('\u%04s', bin2hex($utf16)); - break; - - case (($ord_var_c & 0xFC) == 0xF8): - // characters U-00200000 - U-03FFFFFF, mask 111110XX - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $char = pack('C*', $ord_var_c, - ord($var{$c + 1}), - ord($var{$c + 2}), - ord($var{$c + 3}), - ord($var{$c + 4})); - $c += 4; - $utf16 = $this->json_utf82utf16($char); - $ascii .= sprintf('\u%04s', bin2hex($utf16)); - break; - - case (($ord_var_c & 0xFE) == 0xFC): - // characters U-04000000 - U-7FFFFFFF, mask 1111110X - // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 - $char = pack('C*', $ord_var_c, - ord($var{$c + 1}), - ord($var{$c + 2}), - ord($var{$c + 3}), - ord($var{$c + 4}), - ord($var{$c + 5})); - $c += 5; - $utf16 = $this->json_utf82utf16($char); - $ascii .= sprintf('\u%04s', bin2hex($utf16)); - break; - } - } - - return '"'.$ascii.'"'; - - case 'array': - /* - * As per JSON spec if any array key is not an integer - * we must treat the the whole array as an object. We - * also try to catch a sparsely populated associative - * array with numeric keys here because some JS engines - * will create an array with empty indexes up to - * max_index which can cause memory issues and because - * the keys, which may be relevant, will be remapped - * otherwise. - * - * As per the ECMA and JSON specification an object may - * have any string as a property. Unfortunately due to - * a hole in the ECMA specification if the key is a - * ECMA reserved word or starts with a digit the - * parameter is only accessible using ECMAScript's - * bracket notation. - */ - - // treat as a JSON object - if (is_array($var) && count($var) && (array_keys($var) !== range(0, sizeof($var) - 1))) { - - $this->json_objectStack[] = $var; - - $properties = array_map(array($this, 'json_name_value'), - array_keys($var), - array_values($var)); - - array_pop($this->json_objectStack); - - foreach($properties as $property) { - if($property instanceof Exception) { - return $property; - } - } - - return '{' . join(',', $properties) . '}'; - } - - $this->json_objectStack[] = $var; - - // treat it like a regular array - $elements = array_map(array($this, 'json_encode'), $var); - - array_pop($this->json_objectStack); - - foreach($elements as $element) { - if($element instanceof Exception) { - return $element; - } - } - - return '[' . join(',', $elements) . ']'; - - case 'object': - $vars = self::encodeObject($var); - - $this->json_objectStack[] = $var; - - $properties = array_map(array($this, 'json_name_value'), - array_keys($vars), - array_values($vars)); - - array_pop($this->json_objectStack); - - foreach($properties as $property) { - if($property instanceof Exception) { - return $property; - } - } - - return '{' . join(',', $properties) . '}'; - - default: - return null; - } - } - - /** - * array-walking function for use in generating JSON-formatted name-value pairs - * - * @param string $name name of key to use - * @param mixed $value reference to an array element to be encoded - * - * @return string JSON-formatted name-value pair, like '"name":value' - * @access private - */ - private function json_name_value($name, $value) - { - // Encoding the $GLOBALS PHP array causes an infinite loop - // if the recursion is not reset here as it contains - // a reference to itself. This is the only way I have come up - // with to stop infinite recursion in this case. - if($name=='GLOBALS' - && is_array($value) - && array_key_exists('GLOBALS',$value)) { - $value['GLOBALS'] = '** Recursion **'; - } - - $encoded_value = $this->json_encode($value); - - if($encoded_value instanceof Exception) { - return $encoded_value; - } - - return $this->json_encode(strval($name)) . ':' . $encoded_value; - } -} diff --git a/vendor/mrclay/minify/min/lib/HTTP/ConditionalGet.php b/vendor/mrclay/minify/min/lib/HTTP/ConditionalGet.php deleted file mode 100644 index 93b7e75d8..000000000 --- a/vendor/mrclay/minify/min/lib/HTTP/ConditionalGet.php +++ /dev/null @@ -1,366 +0,0 @@ - - * list($updateTime, $content) = getDbUpdateAndContent(); - * $cg = new HTTP_ConditionalGet(array( - * 'lastModifiedTime' => $updateTime - * ,'isPublic' => true - * )); - * $cg->sendHeaders(); - * if ($cg->cacheIsValid) { - * exit(); - * } - * echo $content; - * - * - * E.g. Shortcut for the above - * - * HTTP_ConditionalGet::check($updateTime, true); // exits if client has cache - * echo $content; - * - * - * E.g. Content from DB with no update time: - * - * $content = getContentFromDB(); - * $cg = new HTTP_ConditionalGet(array( - * 'contentHash' => md5($content) - * )); - * $cg->sendHeaders(); - * if ($cg->cacheIsValid) { - * exit(); - * } - * echo $content; - * - * - * E.g. Static content with some static includes: - * - * // before content - * $cg = new HTTP_ConditionalGet(array( - * 'lastUpdateTime' => max( - * filemtime(__FILE__) - * ,filemtime('/path/to/header.inc') - * ,filemtime('/path/to/footer.inc') - * ) - * )); - * $cg->sendHeaders(); - * if ($cg->cacheIsValid) { - * exit(); - * } - * - * @package Minify - * @subpackage HTTP - * @author Stephen Clay - */ -class HTTP_ConditionalGet { - - /** - * Does the client have a valid copy of the requested resource? - * - * You'll want to check this after instantiating the object. If true, do - * not send content, just call sendHeaders() if you haven't already. - * - * @var bool - */ - public $cacheIsValid = null; - - /** - * @param array $spec options - * - * 'isPublic': (bool) if false, the Cache-Control header will contain - * "private", allowing only browser caching. (default false) - * - * 'lastModifiedTime': (int) if given, both ETag AND Last-Modified headers - * will be sent with content. This is recommended. - * - * 'encoding': (string) if set, the header "Vary: Accept-Encoding" will - * always be sent and a truncated version of the encoding will be appended - * to the ETag. E.g. "pub123456;gz". This will also trigger a more lenient - * checking of the client's If-None-Match header, as the encoding portion of - * the ETag will be stripped before comparison. - * - * 'contentHash': (string) if given, only the ETag header can be sent with - * content (only HTTP1.1 clients can conditionally GET). The given string - * should be short with no quote characters and always change when the - * resource changes (recommend md5()). This is not needed/used if - * lastModifiedTime is given. - * - * 'eTag': (string) if given, this will be used as the ETag header rather - * than values based on lastModifiedTime or contentHash. Also the encoding - * string will not be appended to the given value as described above. - * - * 'invalidate': (bool) if true, the client cache will be considered invalid - * without testing. Effectively this disables conditional GET. - * (default false) - * - * 'maxAge': (int) if given, this will set the Cache-Control max-age in - * seconds, and also set the Expires header to the equivalent GMT date. - * After the max-age period has passed, the browser will again send a - * conditional GET to revalidate its cache. - */ - public function __construct($spec) - { - $scope = (isset($spec['isPublic']) && $spec['isPublic']) - ? 'public' - : 'private'; - $maxAge = 0; - // backwards compatibility (can be removed later) - if (isset($spec['setExpires']) - && is_numeric($spec['setExpires']) - && ! isset($spec['maxAge'])) { - $spec['maxAge'] = $spec['setExpires'] - $_SERVER['REQUEST_TIME']; - } - if (isset($spec['maxAge'])) { - $maxAge = $spec['maxAge']; - $this->_headers['Expires'] = self::gmtDate( - $_SERVER['REQUEST_TIME'] + $spec['maxAge'] - ); - } - $etagAppend = ''; - if (isset($spec['encoding'])) { - $this->_stripEtag = true; - $this->_headers['Vary'] = 'Accept-Encoding'; - if ('' !== $spec['encoding']) { - if (0 === strpos($spec['encoding'], 'x-')) { - $spec['encoding'] = substr($spec['encoding'], 2); - } - $etagAppend = ';' . substr($spec['encoding'], 0, 2); - } - } - if (isset($spec['lastModifiedTime'])) { - $this->_setLastModified($spec['lastModifiedTime']); - if (isset($spec['eTag'])) { // Use it - $this->_setEtag($spec['eTag'], $scope); - } else { // base both headers on time - $this->_setEtag($spec['lastModifiedTime'] . $etagAppend, $scope); - } - } elseif (isset($spec['eTag'])) { // Use it - $this->_setEtag($spec['eTag'], $scope); - } elseif (isset($spec['contentHash'])) { // Use the hash as the ETag - $this->_setEtag($spec['contentHash'] . $etagAppend, $scope); - } - $privacy = ($scope === 'private') - ? ', private' - : ''; - $this->_headers['Cache-Control'] = "max-age={$maxAge}{$privacy}"; - // invalidate cache if disabled, otherwise check - $this->cacheIsValid = (isset($spec['invalidate']) && $spec['invalidate']) - ? false - : $this->_isCacheValid(); - } - - /** - * Get array of output headers to be sent - * - * In the case of 304 responses, this array will only contain the response - * code header: array('_responseCode' => 'HTTP/1.0 304 Not Modified') - * - * Otherwise something like: - * - * array( - * 'Cache-Control' => 'max-age=0, public' - * ,'ETag' => '"foobar"' - * ) - * - * - * @return array - */ - public function getHeaders() - { - return $this->_headers; - } - - /** - * Set the Content-Length header in bytes - * - * With most PHP configs, as long as you don't flush() output, this method - * is not needed and PHP will buffer all output and set Content-Length for - * you. Otherwise you'll want to call this to let the client know up front. - * - * @param int $bytes - * - * @return int copy of input $bytes - */ - public function setContentLength($bytes) - { - return $this->_headers['Content-Length'] = $bytes; - } - - /** - * Send headers - * - * @see getHeaders() - * - * Note this doesn't "clear" the headers. Calling sendHeaders() will - * call header() again (but probably have not effect) and getHeaders() will - * still return the headers. - * - * @return null - */ - public function sendHeaders() - { - $headers = $this->_headers; - if (array_key_exists('_responseCode', $headers)) { - // FastCGI environments require 3rd arg to header() to be set - list(, $code) = explode(' ', $headers['_responseCode'], 3); - header($headers['_responseCode'], true, $code); - unset($headers['_responseCode']); - } - foreach ($headers as $name => $val) { - header($name . ': ' . $val); - } - } - - /** - * Exit if the client's cache is valid for this resource - * - * This is a convenience method for common use of the class - * - * @param int $lastModifiedTime if given, both ETag AND Last-Modified headers - * will be sent with content. This is recommended. - * - * @param bool $isPublic (default false) if true, the Cache-Control header - * will contain "public", allowing proxies to cache the content. Otherwise - * "private" will be sent, allowing only browser caching. - * - * @param array $options (default empty) additional options for constructor - */ - public static function check($lastModifiedTime = null, $isPublic = false, $options = array()) - { - if (null !== $lastModifiedTime) { - $options['lastModifiedTime'] = (int)$lastModifiedTime; - } - $options['isPublic'] = (bool)$isPublic; - $cg = new HTTP_ConditionalGet($options); - $cg->sendHeaders(); - if ($cg->cacheIsValid) { - exit(); - } - } - - - /** - * Get a GMT formatted date for use in HTTP headers - * - * - * header('Expires: ' . HTTP_ConditionalGet::gmtdate($time)); - * - * - * @param int $time unix timestamp - * - * @return string - */ - public static function gmtDate($time) - { - return gmdate('D, d M Y H:i:s \G\M\T', $time); - } - - protected $_headers = array(); - protected $_lmTime = null; - protected $_etag = null; - protected $_stripEtag = false; - - /** - * @param string $hash - * - * @param string $scope - */ - protected function _setEtag($hash, $scope) - { - $this->_etag = '"' . substr($scope, 0, 3) . $hash . '"'; - $this->_headers['ETag'] = $this->_etag; - } - - /** - * @param int $time - */ - protected function _setLastModified($time) - { - $this->_lmTime = (int)$time; - $this->_headers['Last-Modified'] = self::gmtDate($time); - } - - /** - * Determine validity of client cache and queue 304 header if valid - * - * @return bool - */ - protected function _isCacheValid() - { - if (null === $this->_etag) { - // lmTime is copied to ETag, so this condition implies that the - // server sent neither ETag nor Last-Modified, so the client can't - // possibly has a valid cache. - return false; - } - $isValid = ($this->resourceMatchedEtag() || $this->resourceNotModified()); - if ($isValid) { - $this->_headers['_responseCode'] = 'HTTP/1.0 304 Not Modified'; - } - return $isValid; - } - - /** - * @return bool - */ - protected function resourceMatchedEtag() - { - if (!isset($_SERVER['HTTP_IF_NONE_MATCH'])) { - return false; - } - $clientEtagList = get_magic_quotes_gpc() - ? stripslashes($_SERVER['HTTP_IF_NONE_MATCH']) - : $_SERVER['HTTP_IF_NONE_MATCH']; - $clientEtags = explode(',', $clientEtagList); - - $compareTo = $this->normalizeEtag($this->_etag); - foreach ($clientEtags as $clientEtag) { - if ($this->normalizeEtag($clientEtag) === $compareTo) { - // respond with the client's matched ETag, even if it's not what - // we would've sent by default - $this->_headers['ETag'] = trim($clientEtag); - return true; - } - } - return false; - } - - /** - * @param string $etag - * - * @return string - */ - protected function normalizeEtag($etag) { - $etag = trim($etag); - return $this->_stripEtag - ? preg_replace('/;\\w\\w"$/', '"', $etag) - : $etag; - } - - /** - * @return bool - */ - protected function resourceNotModified() - { - if (!isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) { - return false; - } - // strip off IE's extra data (semicolon) - list($ifModifiedSince) = explode(';', $_SERVER['HTTP_IF_MODIFIED_SINCE'], 2); - if (strtotime($ifModifiedSince) >= $this->_lmTime) { - // Apache 2.2's behavior. If there was no ETag match, send the - // non-encoded version of the ETag value. - $this->_headers['ETag'] = $this->normalizeEtag($this->_etag); - return true; - } - return false; - } -} diff --git a/vendor/mrclay/minify/min/lib/HTTP/Encoder.php b/vendor/mrclay/minify/min/lib/HTTP/Encoder.php deleted file mode 100644 index 8f347793c..000000000 --- a/vendor/mrclay/minify/min/lib/HTTP/Encoder.php +++ /dev/null @@ -1,335 +0,0 @@ - - * // Send a CSS file, compressed if possible - * $he = new HTTP_Encoder(array( - * 'content' => file_get_contents($cssFile) - * ,'type' => 'text/css' - * )); - * $he->encode(); - * $he->sendAll(); - * - * - * - * // Shortcut to encoding output - * header('Content-Type: text/css'); // needed if not HTML - * HTTP_Encoder::output($css); - * - * - * - * // Just sniff for the accepted encoding - * $encoding = HTTP_Encoder::getAcceptedEncoding(); - * - * - * For more control over headers, use getHeaders() and getData() and send your - * own output. - * - * Note: If you don't need header mgmt, use PHP's native gzencode, gzdeflate, - * and gzcompress functions for gzip, deflate, and compress-encoding - * respectively. - * - * @package Minify - * @subpackage HTTP - * @author Stephen Clay - */ -class HTTP_Encoder { - - /** - * Should the encoder allow HTTP encoding to IE6? - * - * If you have many IE6 users and the bandwidth savings is worth troubling - * some of them, set this to true. - * - * By default, encoding is only offered to IE7+. When this is true, - * getAcceptedEncoding() will return an encoding for IE6 if its user agent - * string contains "SV1". This has been documented in many places as "safe", - * but there seem to be remaining, intermittent encoding bugs in patched - * IE6 on the wild web. - * - * @var bool - */ - public static $encodeToIe6 = true; - - - /** - * Default compression level for zlib operations - * - * This level is used if encode() is not given a $compressionLevel - * - * @var int - */ - public static $compressionLevel = 6; - - - /** - * Get an HTTP Encoder object - * - * @param array $spec options - * - * 'content': (string required) content to be encoded - * - * 'type': (string) if set, the Content-Type header will have this value. - * - * 'method: (string) only set this if you are forcing a particular encoding - * method. If not set, the best method will be chosen by getAcceptedEncoding() - * The available methods are 'gzip', 'deflate', 'compress', and '' (no - * encoding) - */ - public function __construct($spec) - { - $this->_useMbStrlen = (function_exists('mb_strlen') - && (ini_get('mbstring.func_overload') !== '') - && ((int)ini_get('mbstring.func_overload') & 2)); - $this->_content = $spec['content']; - $this->_headers['Content-Length'] = $this->_useMbStrlen - ? (string)mb_strlen($this->_content, '8bit') - : (string)strlen($this->_content); - if (isset($spec['type'])) { - $this->_headers['Content-Type'] = $spec['type']; - } - if (isset($spec['method']) - && in_array($spec['method'], array('gzip', 'deflate', 'compress', ''))) - { - $this->_encodeMethod = array($spec['method'], $spec['method']); - } else { - $this->_encodeMethod = self::getAcceptedEncoding(); - } - } - - /** - * Get content in current form - * - * Call after encode() for encoded content. - * - * @return string - */ - public function getContent() - { - return $this->_content; - } - - /** - * Get array of output headers to be sent - * - * E.g. - * - * array( - * 'Content-Length' => '615' - * ,'Content-Encoding' => 'x-gzip' - * ,'Vary' => 'Accept-Encoding' - * ) - * - * - * @return array - */ - public function getHeaders() - { - return $this->_headers; - } - - /** - * Send output headers - * - * You must call this before headers are sent and it probably cannot be - * used in conjunction with zlib output buffering / mod_gzip. Errors are - * not handled purposefully. - * - * @see getHeaders() - */ - public function sendHeaders() - { - foreach ($this->_headers as $name => $val) { - header($name . ': ' . $val); - } - } - - /** - * Send output headers and content - * - * A shortcut for sendHeaders() and echo getContent() - * - * You must call this before headers are sent and it probably cannot be - * used in conjunction with zlib output buffering / mod_gzip. Errors are - * not handled purposefully. - */ - public function sendAll() - { - $this->sendHeaders(); - echo $this->_content; - } - - /** - * Determine the client's best encoding method from the HTTP Accept-Encoding - * header. - * - * If no Accept-Encoding header is set, or the browser is IE before v6 SP2, - * this will return ('', ''), the "identity" encoding. - * - * A syntax-aware scan is done of the Accept-Encoding, so the method must - * be non 0. The methods are favored in order of gzip, deflate, then - * compress. Deflate is always smallest and generally faster, but is - * rarely sent by servers, so client support could be buggier. - * - * @param bool $allowCompress allow the older compress encoding - * - * @param bool $allowDeflate allow the more recent deflate encoding - * - * @return array two values, 1st is the actual encoding method, 2nd is the - * alias of that method to use in the Content-Encoding header (some browsers - * call gzip "x-gzip" etc.) - */ - public static function getAcceptedEncoding($allowCompress = true, $allowDeflate = true) - { - // @link http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html - - if (! isset($_SERVER['HTTP_ACCEPT_ENCODING']) - || self::isBuggyIe()) - { - return array('', ''); - } - $ae = $_SERVER['HTTP_ACCEPT_ENCODING']; - // gzip checks (quick) - if (0 === strpos($ae, 'gzip,') // most browsers - || 0 === strpos($ae, 'deflate, gzip,') // opera - ) { - return array('gzip', 'gzip'); - } - // gzip checks (slow) - if (preg_match( - '@(?:^|,)\\s*((?:x-)?gzip)\\s*(?:$|,|;\\s*q=(?:0\\.|1))@' - ,$ae - ,$m)) { - return array('gzip', $m[1]); - } - if ($allowDeflate) { - // deflate checks - $aeRev = strrev($ae); - if (0 === strpos($aeRev, 'etalfed ,') // ie, webkit - || 0 === strpos($aeRev, 'etalfed,') // gecko - || 0 === strpos($ae, 'deflate,') // opera - // slow parsing - || preg_match( - '@(?:^|,)\\s*deflate\\s*(?:$|,|;\\s*q=(?:0\\.|1))@', $ae)) { - return array('deflate', 'deflate'); - } - } - if ($allowCompress && preg_match( - '@(?:^|,)\\s*((?:x-)?compress)\\s*(?:$|,|;\\s*q=(?:0\\.|1))@' - ,$ae - ,$m)) { - return array('compress', $m[1]); - } - return array('', ''); - } - - /** - * Encode (compress) the content - * - * If the encode method is '' (none) or compression level is 0, or the 'zlib' - * extension isn't loaded, we return false. - * - * Then the appropriate gz_* function is called to compress the content. If - * this fails, false is returned. - * - * The header "Vary: Accept-Encoding" is added. If encoding is successful, - * the Content-Length header is updated, and Content-Encoding is also added. - * - * @param int $compressionLevel given to zlib functions. If not given, the - * class default will be used. - * - * @return bool success true if the content was actually compressed - */ - public function encode($compressionLevel = null) - { - if (! self::isBuggyIe()) { - $this->_headers['Vary'] = 'Accept-Encoding'; - } - if (null === $compressionLevel) { - $compressionLevel = self::$compressionLevel; - } - if ('' === $this->_encodeMethod[0] - || ($compressionLevel == 0) - || !extension_loaded('zlib')) - { - return false; - } - if ($this->_encodeMethod[0] === 'deflate') { - $encoded = gzdeflate($this->_content, $compressionLevel); - } elseif ($this->_encodeMethod[0] === 'gzip') { - $encoded = gzencode($this->_content, $compressionLevel); - } else { - $encoded = gzcompress($this->_content, $compressionLevel); - } - if (false === $encoded) { - return false; - } - $this->_headers['Content-Length'] = $this->_useMbStrlen - ? (string)mb_strlen($encoded, '8bit') - : (string)strlen($encoded); - $this->_headers['Content-Encoding'] = $this->_encodeMethod[1]; - $this->_content = $encoded; - return true; - } - - /** - * Encode and send appropriate headers and content - * - * This is a convenience method for common use of the class - * - * @param string $content - * - * @param int $compressionLevel given to zlib functions. If not given, the - * class default will be used. - * - * @return bool success true if the content was actually compressed - */ - public static function output($content, $compressionLevel = null) - { - if (null === $compressionLevel) { - $compressionLevel = self::$compressionLevel; - } - $he = new HTTP_Encoder(array('content' => $content)); - $ret = $he->encode($compressionLevel); - $he->sendAll(); - return $ret; - } - - /** - * Is the browser an IE version earlier than 6 SP2? - * - * @return bool - */ - public static function isBuggyIe() - { - if (empty($_SERVER['HTTP_USER_AGENT'])) { - return false; - } - $ua = $_SERVER['HTTP_USER_AGENT']; - // quick escape for non-IEs - if (0 !== strpos($ua, 'Mozilla/4.0 (compatible; MSIE ') - || false !== strpos($ua, 'Opera')) { - return false; - } - // no regex = faaast - $version = (float)substr($ua, 30); - return self::$encodeToIe6 - ? ($version < 6 || ($version == 6 && false === strpos($ua, 'SV1'))) - : ($version < 7); - } - - protected $_content = ''; - protected $_headers = array(); - protected $_encodeMethod = array('', ''); - protected $_useMbStrlen = false; -} diff --git a/vendor/mrclay/minify/min/lib/JSMin.php b/vendor/mrclay/minify/min/lib/JSMin.php deleted file mode 100644 index 9840d8b33..000000000 --- a/vendor/mrclay/minify/min/lib/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/vendor/mrclay/minify/min/lib/JSMinPlus.php b/vendor/mrclay/minify/min/lib/JSMinPlus.php deleted file mode 100644 index 5a3c5bdff..000000000 --- a/vendor/mrclay/minify/min/lib/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) - { - // "; - * $link = ""; - * - * // in min.php - * Minify::serve('Groups', array( - * 'groups' => $groupSources - * ,'setExpires' => (time() + 86400 * 365) - * )); - * - * - * @package Minify - * @author Stephen Clay - */ -class Minify_Build { - - /** - * Last modification time of all files in the build - * - * @var int - */ - public $lastModified = 0; - - /** - * String to use as ampersand in uri(). Set this to '&' if - * you are not HTML-escaping URIs. - * - * @var string - */ - public static $ampersand = '&'; - - /** - * Get a time-stamped URI - * - * - * echo $b->uri('/site.js'); - * // outputs "/site.js?1678242" - * - * echo $b->uri('/scriptaculous.js?load=effects'); - * // outputs "/scriptaculous.js?load=effects&1678242" - * - * - * @param string $uri - * @param boolean $forceAmpersand (default = false) Force the use of ampersand to - * append the timestamp to the URI. - * @return string - */ - public function uri($uri, $forceAmpersand = false) { - $sep = ($forceAmpersand || strpos($uri, '?') !== false) - ? self::$ampersand - : '?'; - return "{$uri}{$sep}{$this->lastModified}"; - } - - /** - * Create a build object - * - * @param array $sources array of Minify_Source objects and/or file paths - * - * @return null - */ - public function __construct($sources) - { - $max = 0; - foreach ((array)$sources as $source) { - if ($source instanceof Minify_Source) { - $max = max($max, $source->lastModified); - } elseif (is_string($source)) { - if (0 === strpos($source, '//')) { - $source = $_SERVER['DOCUMENT_ROOT'] . substr($source, 1); - } - if (is_file($source)) { - $max = max($max, filemtime($source)); - } - } - } - $this->lastModified = $max; - } -} diff --git a/vendor/mrclay/minify/min/lib/Minify/CSS.php b/vendor/mrclay/minify/min/lib/Minify/CSS.php deleted file mode 100644 index 32414551d..000000000 --- a/vendor/mrclay/minify/min/lib/Minify/CSS.php +++ /dev/null @@ -1,99 +0,0 @@ - - * @author http://code.google.com/u/1stvamp/ (Issue 64 patch) - */ -class Minify_CSS { - - /** - * Minify a CSS string - * - * @param string $css - * - * @param array $options available options: - * - * 'preserveComments': (default true) multi-line comments that begin - * with "/*!" will be preserved with newlines before and after to - * enhance readability. - * - * 'removeCharsets': (default true) remove all @charset at-rules - * - * 'prependRelativePath': (default null) if given, this string will be - * prepended to all relative URIs in import/url declarations - * - * 'currentDir': (default null) if given, this is assumed to be the - * directory of the current CSS file. Using this, minify will rewrite - * all relative URIs in import/url declarations to correctly point to - * the desired files. For this to work, the files *must* exist and be - * visible by the PHP process. - * - * 'symlinks': (default = array()) If the CSS file is stored in - * a symlink-ed directory, provide an array of link paths to - * target paths, where the link paths are within the document root. Because - * paths need to be normalized for this to work, use "//" to substitute - * the doc root in the link paths (the array keys). E.g.: - * - * array('//symlink' => '/real/target/path') // unix - * array('//static' => 'D:\\staticStorage') // Windows - * - * - * 'docRoot': (default = $_SERVER['DOCUMENT_ROOT']) - * see Minify_CSS_UriRewriter::rewrite - * - * @return string - */ - public static function minify($css, $options = array()) - { - $options = array_merge(array( - 'compress' => true, - 'removeCharsets' => true, - 'preserveComments' => true, - 'currentDir' => null, - 'docRoot' => $_SERVER['DOCUMENT_ROOT'], - 'prependRelativePath' => null, - 'symlinks' => array(), - ), $options); - - if ($options['removeCharsets']) { - $css = preg_replace('/@charset[^;]+;\\s*/', '', $css); - } - if ($options['compress']) { - if (! $options['preserveComments']) { - $css = Minify_CSS_Compressor::process($css, $options); - } else { - $css = Minify_CommentPreserver::process( - $css - ,array('Minify_CSS_Compressor', 'process') - ,array($options) - ); - } - } - if (! $options['currentDir'] && ! $options['prependRelativePath']) { - return $css; - } - if ($options['currentDir']) { - return Minify_CSS_UriRewriter::rewrite( - $css - ,$options['currentDir'] - ,$options['docRoot'] - ,$options['symlinks'] - ); - } else { - return Minify_CSS_UriRewriter::prepend( - $css - ,$options['prependRelativePath'] - ); - } - } -} diff --git a/vendor/mrclay/minify/min/lib/Minify/CSS/Compressor.php b/vendor/mrclay/minify/min/lib/Minify/CSS/Compressor.php deleted file mode 100644 index c6cdd8b7a..000000000 --- a/vendor/mrclay/minify/min/lib/Minify/CSS/Compressor.php +++ /dev/null @@ -1,249 +0,0 @@ - - * @author http://code.google.com/u/1stvamp/ (Issue 64 patch) - */ -class Minify_CSS_Compressor { - - /** - * Minify a CSS string - * - * @param string $css - * - * @param array $options (currently ignored) - * - * @return string - */ - public static function process($css, $options = array()) - { - $obj = new Minify_CSS_Compressor($options); - return $obj->_process($css); - } - - /** - * @var array - */ - protected $_options = null; - - /** - * Are we "in" a hack? I.e. are some browsers targetted until the next comment? - * - * @var bool - */ - protected $_inHack = false; - - - /** - * Constructor - * - * @param array $options (currently ignored) - */ - private function __construct($options) { - $this->_options = $options; - } - - /** - * Minify a CSS string - * - * @param string $css - * - * @return string - */ - protected function _process($css) - { - $css = str_replace("\r\n", "\n", $css); - - // preserve empty comment after '>' - // http://www.webdevout.net/css-hacks#in_css-selectors - $css = preg_replace('@>/\\*\\s*\\*/@', '>/*keep*/', $css); - - // preserve empty comment between property and value - // http://css-discuss.incutio.com/?page=BoxModelHack - $css = preg_replace('@/\\*\\s*\\*/\\s*:@', '/*keep*/:', $css); - $css = preg_replace('@:\\s*/\\*\\s*\\*/@', ':/*keep*/', $css); - - // apply callback to all valid comments (and strip out surrounding ws - $css = preg_replace_callback('@\\s*/\\*([\\s\\S]*?)\\*/\\s*@' - ,array($this, '_commentCB'), $css); - - // remove ws around { } and last semicolon in declaration block - $css = preg_replace('/\\s*{\\s*/', '{', $css); - $css = preg_replace('/;?\\s*}\\s*/', '}', $css); - - // remove ws surrounding semicolons - $css = preg_replace('/\\s*;\\s*/', ';', $css); - - // remove ws around urls - $css = preg_replace('/ - url\\( # url( - \\s* - ([^\\)]+?) # 1 = the URL (really just a bunch of non right parenthesis) - \\s* - \\) # ) - /x', 'url($1)', $css); - - // remove ws between rules and colons - $css = preg_replace('/ - \\s* - ([{;]) # 1 = beginning of block or rule separator - \\s* - ([\\*_]?[\\w\\-]+) # 2 = property (and maybe IE filter) - \\s* - : - \\s* - (\\b|[#\'"-]) # 3 = first character of a value - /x', '$1$2:$3', $css); - - // remove ws in selectors - $css = preg_replace_callback('/ - (?: # non-capture - \\s* - [^~>+,\\s]+ # selector part - \\s* - [,>+~] # combinators - )+ - \\s* - [^~>+,\\s]+ # selector part - { # open declaration block - /x' - ,array($this, '_selectorsCB'), $css); - - // minimize hex colors - $css = preg_replace('/([^=])#([a-f\\d])\\2([a-f\\d])\\3([a-f\\d])\\4([\\s;\\}])/i' - , '$1#$2$3$4$5', $css); - - // remove spaces between font families - $css = preg_replace_callback('/font-family:([^;}]+)([;}])/' - ,array($this, '_fontFamilyCB'), $css); - - $css = preg_replace('/@import\\s+url/', '@import url', $css); - - // replace any ws involving newlines with a single newline - $css = preg_replace('/[ \\t]*\\n+\\s*/', "\n", $css); - - // separate common descendent selectors w/ newlines (to limit line lengths) - $css = preg_replace('/([\\w#\\.\\*]+)\\s+([\\w#\\.\\*]+){/', "$1\n$2{", $css); - - // Use newline after 1st numeric value (to limit line lengths). - $css = preg_replace('/ - ((?:padding|margin|border|outline):\\d+(?:px|em)?) # 1 = prop : 1st numeric value - \\s+ - /x' - ,"$1\n", $css); - - // prevent triggering IE6 bug: http://www.crankygeek.com/ie6pebug/ - $css = preg_replace('/:first-l(etter|ine)\\{/', ':first-l$1 {', $css); - - return trim($css); - } - - /** - * Replace what looks like a set of selectors - * - * @param array $m regex matches - * - * @return string - */ - protected function _selectorsCB($m) - { - // remove ws around the combinators - return preg_replace('/\\s*([,>+~])\\s*/', '$1', $m[0]); - } - - /** - * Process a comment and return a replacement - * - * @param array $m regex matches - * - * @return string - */ - protected function _commentCB($m) - { - $hasSurroundingWs = (trim($m[0]) !== $m[1]); - $m = $m[1]; - // $m is the comment content w/o the surrounding tokens, - // but the return value will replace the entire comment. - if ($m === 'keep') { - return '/**/'; - } - if ($m === '" "') { - // component of http://tantek.com/CSS/Examples/midpass.html - return '/*" "*/'; - } - if (preg_match('@";\\}\\s*\\}/\\*\\s+@', $m)) { - // component of http://tantek.com/CSS/Examples/midpass.html - return '/*";}}/* */'; - } - if ($this->_inHack) { - // inversion: feeding only to one browser - if (preg_match('@ - ^/ # comment started like /*/ - \\s* - (\\S[\\s\\S]+?) # has at least some non-ws content - \\s* - /\\* # ends like /*/ or /**/ - @x', $m, $n)) { - // end hack mode after this comment, but preserve the hack and comment content - $this->_inHack = false; - return "/*/{$n[1]}/**/"; - } - } - if (substr($m, -1) === '\\') { // comment ends like \*/ - // begin hack mode and preserve hack - $this->_inHack = true; - return '/*\\*/'; - } - if ($m !== '' && $m[0] === '/') { // comment looks like /*/ foo */ - // begin hack mode and preserve hack - $this->_inHack = true; - return '/*/*/'; - } - if ($this->_inHack) { - // a regular comment ends hack mode but should be preserved - $this->_inHack = false; - return '/**/'; - } - // Issue 107: if there's any surrounding whitespace, it may be important, so - // replace the comment with a single space - return $hasSurroundingWs // remove all other comments - ? ' ' - : ''; - } - - /** - * Process a font-family listing and return a replacement - * - * @param array $m regex matches - * - * @return string - */ - protected function _fontFamilyCB($m) - { - // Issue 210: must not eliminate WS between words in unquoted families - $pieces = preg_split('/(\'[^\']+\'|"[^"]+")/', $m[1], null, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); - $out = 'font-family:'; - while (null !== ($piece = array_shift($pieces))) { - if ($piece[0] !== '"' && $piece[0] !== "'") { - $piece = preg_replace('/\\s+/', ' ', $piece); - $piece = preg_replace('/\\s?,\\s?/', ',', $piece); - } - $out .= $piece; - } - return $out . $m[2]; - } -} diff --git a/vendor/mrclay/minify/min/lib/Minify/CSS/UriRewriter.php b/vendor/mrclay/minify/min/lib/Minify/CSS/UriRewriter.php deleted file mode 100644 index 43cc2548b..000000000 --- a/vendor/mrclay/minify/min/lib/Minify/CSS/UriRewriter.php +++ /dev/null @@ -1,307 +0,0 @@ - - */ -class Minify_CSS_UriRewriter { - - /** - * rewrite() and rewriteRelative() append debugging information here - * - * @var string - */ - public static $debugText = ''; - - /** - * In CSS content, rewrite file relative URIs as root relative - * - * @param string $css - * - * @param string $currentDir The directory of the current CSS file. - * - * @param string $docRoot The document root of the web site in which - * the CSS file resides (default = $_SERVER['DOCUMENT_ROOT']). - * - * @param array $symlinks (default = array()) If the CSS file is stored in - * a symlink-ed directory, provide an array of link paths to - * target paths, where the link paths are within the document root. Because - * paths need to be normalized for this to work, use "//" to substitute - * the doc root in the link paths (the array keys). E.g.: - * - * array('//symlink' => '/real/target/path') // unix - * array('//static' => 'D:\\staticStorage') // Windows - * - * - * @return string - */ - public static function rewrite($css, $currentDir, $docRoot = null, $symlinks = array()) - { - self::$_docRoot = self::_realpath( - $docRoot ? $docRoot : $_SERVER['DOCUMENT_ROOT'] - ); - self::$_currentDir = self::_realpath($currentDir); - self::$_symlinks = array(); - - // normalize symlinks - foreach ($symlinks as $link => $target) { - $link = ($link === '//') - ? self::$_docRoot - : str_replace('//', self::$_docRoot . '/', $link); - $link = strtr($link, '/', DIRECTORY_SEPARATOR); - self::$_symlinks[$link] = self::_realpath($target); - } - - self::$debugText .= "docRoot : " . self::$_docRoot . "\n" - . "currentDir : " . self::$_currentDir . "\n"; - if (self::$_symlinks) { - self::$debugText .= "symlinks : " . var_export(self::$_symlinks, 1) . "\n"; - } - self::$debugText .= "\n"; - - $css = self::_trimUrls($css); - - // rewrite - $css = preg_replace_callback('/@import\\s+([\'"])(.*?)[\'"]/' - ,array(self::$className, '_processUriCB'), $css); - $css = preg_replace_callback('/url\\(\\s*([\'"](.*?)[\'"]|[^\\)\\s]+)\\s*\\)/' - ,array(self::$className, '_processUriCB'), $css); - - return $css; - } - - /** - * In CSS content, prepend a path to relative URIs - * - * @param string $css - * - * @param string $path The path to prepend. - * - * @return string - */ - public static function prepend($css, $path) - { - self::$_prependPath = $path; - - $css = self::_trimUrls($css); - - // append - $css = preg_replace_callback('/@import\\s+([\'"])(.*?)[\'"]/' - ,array(self::$className, '_processUriCB'), $css); - $css = preg_replace_callback('/url\\(\\s*([\'"](.*?)[\'"]|[^\\)\\s]+)\\s*\\)/' - ,array(self::$className, '_processUriCB'), $css); - - self::$_prependPath = null; - return $css; - } - - /** - * Get a root relative URI from a file relative URI - * - * - * Minify_CSS_UriRewriter::rewriteRelative( - * '../img/hello.gif' - * , '/home/user/www/css' // path of CSS file - * , '/home/user/www' // doc root - * ); - * // returns '/img/hello.gif' - * - * // example where static files are stored in a symlinked directory - * Minify_CSS_UriRewriter::rewriteRelative( - * 'hello.gif' - * , '/var/staticFiles/theme' - * , '/home/user/www' - * , array('/home/user/www/static' => '/var/staticFiles') - * ); - * // returns '/static/theme/hello.gif' - * - * - * @param string $uri file relative URI - * - * @param string $realCurrentDir realpath of the current file's directory. - * - * @param string $realDocRoot realpath of the site document root. - * - * @param array $symlinks (default = array()) If the file is stored in - * a symlink-ed directory, provide an array of link paths to - * real target paths, where the link paths "appear" to be within the document - * root. E.g.: - * - * array('/home/foo/www/not/real/path' => '/real/target/path') // unix - * array('C:\\htdocs\\not\\real' => 'D:\\real\\target\\path') // Windows - * - * - * @return string - */ - public static function rewriteRelative($uri, $realCurrentDir, $realDocRoot, $symlinks = array()) - { - // prepend path with current dir separator (OS-independent) - $path = strtr($realCurrentDir, '/', DIRECTORY_SEPARATOR) - . DIRECTORY_SEPARATOR . strtr($uri, '/', DIRECTORY_SEPARATOR); - - self::$debugText .= "file-relative URI : {$uri}\n" - . "path prepended : {$path}\n"; - - // "unresolve" a symlink back to doc root - foreach ($symlinks as $link => $target) { - if (0 === strpos($path, $target)) { - // replace $target with $link - $path = $link . substr($path, strlen($target)); - - self::$debugText .= "symlink unresolved : {$path}\n"; - - break; - } - } - // strip doc root - $path = substr($path, strlen($realDocRoot)); - - self::$debugText .= "docroot stripped : {$path}\n"; - - // fix to root-relative URI - $uri = strtr($path, '/\\', '//'); - $uri = self::removeDots($uri); - - self::$debugText .= "traversals removed : {$uri}\n\n"; - - return $uri; - } - - /** - * Remove instances of "./" and "../" where possible from a root-relative URI - * - * @param string $uri - * - * @return string - */ - public static function removeDots($uri) - { - $uri = str_replace('/./', '/', $uri); - // inspired by patch from Oleg Cherniy - do { - $uri = preg_replace('@/[^/]+/\\.\\./@', '/', $uri, 1, $changed); - } while ($changed); - return $uri; - } - - /** - * Defines which class to call as part of callbacks, change this - * if you extend Minify_CSS_UriRewriter - * - * @var string - */ - protected static $className = 'Minify_CSS_UriRewriter'; - - /** - * Get realpath with any trailing slash removed. If realpath() fails, - * just remove the trailing slash. - * - * @param string $path - * - * @return mixed path with no trailing slash - */ - protected static function _realpath($path) - { - $realPath = realpath($path); - if ($realPath !== false) { - $path = $realPath; - } - return rtrim($path, '/\\'); - } - - /** - * Directory of this stylesheet - * - * @var string - */ - private static $_currentDir = ''; - - /** - * DOC_ROOT - * - * @var string - */ - private static $_docRoot = ''; - - /** - * directory replacements to map symlink targets back to their - * source (within the document root) E.g. '/var/www/symlink' => '/var/realpath' - * - * @var array - */ - private static $_symlinks = array(); - - /** - * Path to prepend - * - * @var string - */ - private static $_prependPath = null; - - /** - * @param string $css - * - * @return string - */ - private static function _trimUrls($css) - { - return preg_replace('/ - url\\( # url( - \\s* - ([^\\)]+?) # 1 = URI (assuming does not contain ")") - \\s* - \\) # ) - /x', 'url($1)', $css); - } - - /** - * @param array $m - * - * @return string - */ - private static function _processUriCB($m) - { - // $m matched either '/@import\\s+([\'"])(.*?)[\'"]/' or '/url\\(\\s*([^\\)\\s]+)\\s*\\)/' - $isImport = ($m[0][0] === '@'); - // determine URI and the quote character (if any) - if ($isImport) { - $quoteChar = $m[1]; - $uri = $m[2]; - } else { - // $m[1] is either quoted or not - $quoteChar = ($m[1][0] === "'" || $m[1][0] === '"') - ? $m[1][0] - : ''; - $uri = ($quoteChar === '') - ? $m[1] - : substr($m[1], 1, strlen($m[1]) - 2); - } - // if not root/scheme relative and not starts with scheme - if (!preg_match('~^(/|[a-z]+\:)~', $uri)) { - // URI is file-relative: rewrite depending on options - if (self::$_prependPath === null) { - $uri = self::rewriteRelative($uri, self::$_currentDir, self::$_docRoot, self::$_symlinks); - } else { - $uri = self::$_prependPath . $uri; - if ($uri[0] === '/') { - $root = ''; - $rootRelative = $uri; - $uri = $root . self::removeDots($rootRelative); - } elseif (preg_match('@^((https?\:)?//([^/]+))/@', $uri, $m) && (false !== strpos($m[3], '.'))) { - $root = $m[1]; - $rootRelative = substr($uri, strlen($root)); - $uri = $root . self::removeDots($rootRelative); - } - } - } - return $isImport - ? "@import {$quoteChar}{$uri}{$quoteChar}" - : "url({$quoteChar}{$uri}{$quoteChar})"; - } -} diff --git a/vendor/mrclay/minify/min/lib/Minify/CSSmin.php b/vendor/mrclay/minify/min/lib/Minify/CSSmin.php deleted file mode 100644 index 440338387..000000000 --- a/vendor/mrclay/minify/min/lib/Minify/CSSmin.php +++ /dev/null @@ -1,85 +0,0 @@ - - */ -class Minify_CSSmin { - - /** - * Minify a CSS string - * - * @param string $css - * - * @param array $options available options: - * - * 'removeCharsets': (default true) remove all @charset at-rules - * - * 'prependRelativePath': (default null) if given, this string will be - * prepended to all relative URIs in import/url declarations - * - * 'currentDir': (default null) if given, this is assumed to be the - * directory of the current CSS file. Using this, minify will rewrite - * all relative URIs in import/url declarations to correctly point to - * the desired files. For this to work, the files *must* exist and be - * visible by the PHP process. - * - * 'symlinks': (default = array()) If the CSS file is stored in - * a symlink-ed directory, provide an array of link paths to - * target paths, where the link paths are within the document root. Because - * paths need to be normalized for this to work, use "//" to substitute - * the doc root in the link paths (the array keys). E.g.: - * - * array('//symlink' => '/real/target/path') // unix - * array('//static' => 'D:\\staticStorage') // Windows - * - * - * 'docRoot': (default = $_SERVER['DOCUMENT_ROOT']) - * see Minify_CSS_UriRewriter::rewrite - * - * @return string - */ - public static function minify($css, $options = array()) - { - $options = array_merge(array( - 'compress' => true, - 'removeCharsets' => true, - 'currentDir' => null, - 'docRoot' => $_SERVER['DOCUMENT_ROOT'], - 'prependRelativePath' => null, - 'symlinks' => array(), - ), $options); - - if ($options['removeCharsets']) { - $css = preg_replace('/@charset[^;]+;\\s*/', '', $css); - } - if ($options['compress']) { - $obj = new CSSmin(); - $css = $obj->run($css); - } - if (! $options['currentDir'] && ! $options['prependRelativePath']) { - return $css; - } - if ($options['currentDir']) { - return Minify_CSS_UriRewriter::rewrite( - $css - ,$options['currentDir'] - ,$options['docRoot'] - ,$options['symlinks'] - ); - } else { - return Minify_CSS_UriRewriter::prepend( - $css - ,$options['prependRelativePath'] - ); - } - } -} diff --git a/vendor/mrclay/minify/min/lib/Minify/Cache/APC.php b/vendor/mrclay/minify/min/lib/Minify/Cache/APC.php deleted file mode 100644 index 24ab04620..000000000 --- a/vendor/mrclay/minify/min/lib/Minify/Cache/APC.php +++ /dev/null @@ -1,133 +0,0 @@ - - * Minify::setCache(new Minify_Cache_APC()); - * - * - * @package Minify - * @author Chris Edwards - **/ -class Minify_Cache_APC { - - /** - * Create a Minify_Cache_APC object, to be passed to - * Minify::setCache(). - * - * - * @param int $expire seconds until expiration (default = 0 - * meaning the item will not get an expiration date) - * - * @return null - */ - public function __construct($expire = 0) - { - $this->_exp = $expire; - } - - /** - * Write data to cache. - * - * @param string $id cache id - * - * @param string $data - * - * @return bool success - */ - public function store($id, $data) - { - return apc_store($id, "{$_SERVER['REQUEST_TIME']}|{$data}", $this->_exp); - } - - /** - * Get the size of a cache entry - * - * @param string $id cache id - * - * @return int size in bytes - */ - public function getSize($id) - { - if (! $this->_fetch($id)) { - return false; - } - return (function_exists('mb_strlen') && ((int)ini_get('mbstring.func_overload') & 2)) - ? mb_strlen($this->_data, '8bit') - : strlen($this->_data); - } - - /** - * Does a valid cache entry exist? - * - * @param string $id cache id - * - * @param int $srcMtime mtime of the original source file(s) - * - * @return bool exists - */ - public function isValid($id, $srcMtime) - { - return ($this->_fetch($id) && ($this->_lm >= $srcMtime)); - } - - /** - * Send the cached content to output - * - * @param string $id cache id - */ - public function display($id) - { - echo $this->_fetch($id) - ? $this->_data - : ''; - } - - /** - * Fetch the cached content - * - * @param string $id cache id - * - * @return string - */ - public function fetch($id) - { - return $this->_fetch($id) - ? $this->_data - : ''; - } - - private $_exp = null; - - // cache of most recently fetched id - private $_lm = null; - private $_data = null; - private $_id = null; - - /** - * Fetch data and timestamp from apc, store in instance - * - * @param string $id - * - * @return bool success - */ - private function _fetch($id) - { - if ($this->_id === $id) { - return true; - } - $ret = apc_fetch($id); - if (false === $ret) { - $this->_id = null; - return false; - } - list($this->_lm, $this->_data) = explode('|', $ret, 2); - $this->_id = $id; - return true; - } -} diff --git a/vendor/mrclay/minify/min/lib/Minify/Cache/File.php b/vendor/mrclay/minify/min/lib/Minify/Cache/File.php deleted file mode 100644 index c228eb2b2..000000000 --- a/vendor/mrclay/minify/min/lib/Minify/Cache/File.php +++ /dev/null @@ -1,197 +0,0 @@ -_locking = $fileLocking; - $this->_path = $path; - } - - /** - * Write data to cache. - * - * @param string $id cache id (e.g. a filename) - * - * @param string $data - * - * @return bool success - */ - public function store($id, $data) - { - $flag = $this->_locking - ? LOCK_EX - : null; - $file = $this->_path . '/' . $id; - if (! @file_put_contents($file, $data, $flag)) { - $this->_log("Minify_Cache_File: Write failed to '$file'"); - } - // write control - if ($data !== $this->fetch($id)) { - @unlink($file); - $this->_log("Minify_Cache_File: Post-write read failed for '$file'"); - return false; - } - return true; - } - - /** - * Get the size of a cache entry - * - * @param string $id cache id (e.g. a filename) - * - * @return int size in bytes - */ - public function getSize($id) - { - return filesize($this->_path . '/' . $id); - } - - /** - * Does a valid cache entry exist? - * - * @param string $id cache id (e.g. a filename) - * - * @param int $srcMtime mtime of the original source file(s) - * - * @return bool exists - */ - public function isValid($id, $srcMtime) - { - $file = $this->_path . '/' . $id; - return (is_file($file) && (filemtime($file) >= $srcMtime)); - } - - /** - * Send the cached content to output - * - * @param string $id cache id (e.g. a filename) - */ - public function display($id) - { - if ($this->_locking) { - $fp = fopen($this->_path . '/' . $id, 'rb'); - flock($fp, LOCK_SH); - fpassthru($fp); - flock($fp, LOCK_UN); - fclose($fp); - } else { - readfile($this->_path . '/' . $id); - } - } - - /** - * Fetch the cached content - * - * @param string $id cache id (e.g. a filename) - * - * @return string - */ - public function fetch($id) - { - if ($this->_locking) { - $fp = fopen($this->_path . '/' . $id, 'rb'); - if (!$fp) { - return false; - } - flock($fp, LOCK_SH); - $ret = stream_get_contents($fp); - flock($fp, LOCK_UN); - fclose($fp); - return $ret; - } else { - return file_get_contents($this->_path . '/' . $id); - } - } - - /** - * Fetch the cache path used - * - * @return string - */ - public function getPath() - { - return $this->_path; - } - - /** - * Get a usable temp directory - * - * Adapted from Solar/Dir.php - * @author Paul M. Jones - * @license http://opensource.org/licenses/bsd-license.php BSD - * @link http://solarphp.com/trac/core/browser/trunk/Solar/Dir.php - * - * @return string - */ - public static function tmp() - { - static $tmp = null; - if (! $tmp) { - $tmp = function_exists('sys_get_temp_dir') - ? sys_get_temp_dir() - : self::_tmp(); - $tmp = rtrim($tmp, DIRECTORY_SEPARATOR); - } - return $tmp; - } - - /** - * Returns the OS-specific directory for temporary files - * - * @author Paul M. Jones - * @license http://opensource.org/licenses/bsd-license.php BSD - * @link http://solarphp.com/trac/core/browser/trunk/Solar/Dir.php - * - * @return string - */ - protected static function _tmp() - { - // non-Windows system? - if (strtolower(substr(PHP_OS, 0, 3)) != 'win') { - $tmp = empty($_ENV['TMPDIR']) ? getenv('TMPDIR') : $_ENV['TMPDIR']; - if ($tmp) { - return $tmp; - } else { - return '/tmp'; - } - } - // Windows 'TEMP' - $tmp = empty($_ENV['TEMP']) ? getenv('TEMP') : $_ENV['TEMP']; - if ($tmp) { - return $tmp; - } - // Windows 'TMP' - $tmp = empty($_ENV['TMP']) ? getenv('TMP') : $_ENV['TMP']; - if ($tmp) { - return $tmp; - } - // Windows 'windir' - $tmp = empty($_ENV['windir']) ? getenv('windir') : $_ENV['windir']; - if ($tmp) { - return $tmp; - } - // final fallback for Windows - return getenv('SystemRoot') . '\\temp'; - } - - /** - * Send message to the Minify logger - * @param string $msg - * @return null - */ - protected function _log($msg) - { - Minify_Logger::log($msg); - } - - private $_path = null; - private $_locking = null; -} diff --git a/vendor/mrclay/minify/min/lib/Minify/Cache/Memcache.php b/vendor/mrclay/minify/min/lib/Minify/Cache/Memcache.php deleted file mode 100644 index 72bf454b9..000000000 --- a/vendor/mrclay/minify/min/lib/Minify/Cache/Memcache.php +++ /dev/null @@ -1,140 +0,0 @@ - - * // fall back to disk caching if memcache can't connect - * $memcache = new Memcache; - * if ($memcache->connect('localhost', 11211)) { - * Minify::setCache(new Minify_Cache_Memcache($memcache)); - * } else { - * Minify::setCache(); - * } - * - **/ -class Minify_Cache_Memcache { - - /** - * Create a Minify_Cache_Memcache object, to be passed to - * Minify::setCache(). - * - * @param Memcache $memcache already-connected instance - * - * @param int $expire seconds until expiration (default = 0 - * meaning the item will not get an expiration date) - * - * @return null - */ - public function __construct($memcache, $expire = 0) - { - $this->_mc = $memcache; - $this->_exp = $expire; - } - - /** - * Write data to cache. - * - * @param string $id cache id - * - * @param string $data - * - * @return bool success - */ - public function store($id, $data) - { - return $this->_mc->set($id, "{$_SERVER['REQUEST_TIME']}|{$data}", 0, $this->_exp); - } - - - /** - * Get the size of a cache entry - * - * @param string $id cache id - * - * @return int size in bytes - */ - public function getSize($id) - { - if (! $this->_fetch($id)) { - return false; - } - return (function_exists('mb_strlen') && ((int)ini_get('mbstring.func_overload') & 2)) - ? mb_strlen($this->_data, '8bit') - : strlen($this->_data); - } - - /** - * Does a valid cache entry exist? - * - * @param string $id cache id - * - * @param int $srcMtime mtime of the original source file(s) - * - * @return bool exists - */ - public function isValid($id, $srcMtime) - { - return ($this->_fetch($id) && ($this->_lm >= $srcMtime)); - } - - /** - * Send the cached content to output - * - * @param string $id cache id - */ - public function display($id) - { - echo $this->_fetch($id) - ? $this->_data - : ''; - } - - /** - * Fetch the cached content - * - * @param string $id cache id - * - * @return string - */ - public function fetch($id) - { - return $this->_fetch($id) - ? $this->_data - : ''; - } - - private $_mc = null; - private $_exp = null; - - // cache of most recently fetched id - private $_lm = null; - private $_data = null; - private $_id = null; - - /** - * Fetch data and timestamp from memcache, store in instance - * - * @param string $id - * - * @return bool success - */ - private function _fetch($id) - { - if ($this->_id === $id) { - return true; - } - $ret = $this->_mc->get($id); - if (false === $ret) { - $this->_id = null; - return false; - } - list($this->_lm, $this->_data) = explode('|', $ret, 2); - $this->_id = $id; - return true; - } -} diff --git a/vendor/mrclay/minify/min/lib/Minify/Cache/XCache.php b/vendor/mrclay/minify/min/lib/Minify/Cache/XCache.php deleted file mode 100644 index 3039deddc..000000000 --- a/vendor/mrclay/minify/min/lib/Minify/Cache/XCache.php +++ /dev/null @@ -1,126 +0,0 @@ - - * Minify::setCache(new Minify_Cache_XCache()); - * - * - * @package Minify - * @author Elan Ruusamäe - **/ -class Minify_Cache_XCache { - - /** - * Create a Minify_Cache_XCache object, to be passed to - * Minify::setCache(). - * - * @param int $expire seconds until expiration (default = 0 - * meaning the item will not get an expiration date) - */ - public function __construct($expire = 0) - { - $this->_exp = $expire; - } - - /** - * Write data to cache. - * - * @param string $id cache id - * @param string $data - * @return bool success - */ - public function store($id, $data) - { - return xcache_set($id, "{$_SERVER['REQUEST_TIME']}|{$data}", $this->_exp); - } - - /** - * Get the size of a cache entry - * - * @param string $id cache id - * @return int size in bytes - */ - public function getSize($id) - { - if (! $this->_fetch($id)) { - return false; - } - return (function_exists('mb_strlen') && ((int)ini_get('mbstring.func_overload') & 2)) - ? mb_strlen($this->_data, '8bit') - : strlen($this->_data); - } - - /** - * Does a valid cache entry exist? - * - * @param string $id cache id - * @param int $srcMtime mtime of the original source file(s) - * @return bool exists - */ - public function isValid($id, $srcMtime) - { - return ($this->_fetch($id) && ($this->_lm >= $srcMtime)); - } - - /** - * Send the cached content to output - * - * @param string $id cache id - */ - public function display($id) - { - echo $this->_fetch($id) - ? $this->_data - : ''; - } - - /** - * Fetch the cached content - * - * @param string $id cache id - * @return string - */ - public function fetch($id) - { - return $this->_fetch($id) - ? $this->_data - : ''; - } - - private $_exp = null; - - // cache of most recently fetched id - private $_lm = null; - private $_data = null; - private $_id = null; - - /** - * Fetch data and timestamp from xcache, store in instance - * - * @param string $id - * @return bool success - */ - private function _fetch($id) - { - if ($this->_id === $id) { - return true; - } - $ret = xcache_get($id); - if (false === $ret) { - $this->_id = null; - return false; - } - list($this->_lm, $this->_data) = explode('|', $ret, 2); - $this->_id = $id; - return true; - } -} diff --git a/vendor/mrclay/minify/min/lib/Minify/Cache/ZendPlatform.php b/vendor/mrclay/minify/min/lib/Minify/Cache/ZendPlatform.php deleted file mode 100644 index 3130d69a7..000000000 --- a/vendor/mrclay/minify/min/lib/Minify/Cache/ZendPlatform.php +++ /dev/null @@ -1,142 +0,0 @@ - - * Minify::setCache(new Minify_Cache_ZendPlatform()); - * - * - * @package Minify - * @author Patrick van Dissel - */ -class Minify_Cache_ZendPlatform { - - - /** - * Create a Minify_Cache_ZendPlatform object, to be passed to - * Minify::setCache(). - * - * @param int $expire seconds until expiration (default = 0 - * meaning the item will not get an expiration date) - * - * @return null - */ - public function __construct($expire = 0) - { - $this->_exp = $expire; - } - - - /** - * Write data to cache. - * - * @param string $id cache id - * - * @param string $data - * - * @return bool success - */ - public function store($id, $data) - { - return output_cache_put($id, "{$_SERVER['REQUEST_TIME']}|{$data}"); - } - - - /** - * Get the size of a cache entry - * - * @param string $id cache id - * - * @return int size in bytes - */ - public function getSize($id) - { - return $this->_fetch($id) - ? strlen($this->_data) - : false; - } - - - /** - * Does a valid cache entry exist? - * - * @param string $id cache id - * - * @param int $srcMtime mtime of the original source file(s) - * - * @return bool exists - */ - public function isValid($id, $srcMtime) - { - $ret = ($this->_fetch($id) && ($this->_lm >= $srcMtime)); - return $ret; - } - - - /** - * Send the cached content to output - * - * @param string $id cache id - */ - public function display($id) - { - echo $this->_fetch($id) - ? $this->_data - : ''; - } - - - /** - * Fetch the cached content - * - * @param string $id cache id - * - * @return string - */ - public function fetch($id) - { - return $this->_fetch($id) - ? $this->_data - : ''; - } - - - private $_exp = null; - - - // cache of most recently fetched id - private $_lm = null; - private $_data = null; - private $_id = null; - - - /** - * Fetch data and timestamp from ZendPlatform, store in instance - * - * @param string $id - * - * @return bool success - */ - private function _fetch($id) - { - if ($this->_id === $id) { - return true; - } - $ret = output_cache_get($id, $this->_exp); - if (false === $ret) { - $this->_id = null; - return false; - } - list($this->_lm, $this->_data) = explode('|', $ret, 2); - $this->_id = $id; - return true; - } -} diff --git a/vendor/mrclay/minify/min/lib/Minify/ClosureCompiler.php b/vendor/mrclay/minify/min/lib/Minify/ClosureCompiler.php deleted file mode 100644 index 53983a52a..000000000 --- a/vendor/mrclay/minify/min/lib/Minify/ClosureCompiler.php +++ /dev/null @@ -1,139 +0,0 @@ - - * Minify_ClosureCompiler::$jarFile = '/path/to/closure-compiler-20120123.jar'; - * Minify_ClosureCompiler::$tempDir = '/tmp'; - * $code = Minify_ClosureCompiler::minify( - * $code, - * array('compilation_level' => 'SIMPLE_OPTIMIZATIONS') - * ); - * - * --compilation_level WHITESPACE_ONLY, SIMPLE_OPTIMIZATIONS, ADVANCED_OPTIMIZATIONS - * - * - * - * @todo unit tests, $options docs - * @todo more options support (or should just passthru them all?) - * - * @package Minify - * @author Stephen Clay - * @author Elan Ruusamäe - */ -class Minify_ClosureCompiler { - - const OPTION_CHARSET = 'charset'; - const OPTION_COMPILATION_LEVEL = 'compilation_level'; - - public static $isDebug = false; - - /** - * Filepath of the Closure Compiler jar file. This must be set before - * calling minifyJs(). - * - * @var string - */ - public static $jarFile = null; - - /** - * Writable temp directory. This must be set before calling minifyJs(). - * - * @var string - */ - public static $tempDir = null; - - /** - * Filepath of "java" executable (may be needed if not in shell's PATH) - * - * @var string - */ - public static $javaExecutable = 'java'; - - /** - * Minify a Javascript string - * - * @param string $js - * - * @param array $options (verbose is ignored) - * - * @see https://code.google.com/p/closure-compiler/source/browse/trunk/README - * - * @return string - * - * @throws Minify_ClosureCompiler_Exception - */ - public static function minify($js, $options = array()) - { - self::_prepare(); - if (! ($tmpFile = tempnam(self::$tempDir, 'cc_'))) { - throw new Minify_ClosureCompiler_Exception('Minify_ClosureCompiler : could not create temp file in "'.self::$tempDir.'".'); - } - file_put_contents($tmpFile, $js); - $cmd = self::_getCmd($options, $tmpFile); - exec($cmd, $output, $result_code); - unlink($tmpFile); - if ($result_code != 0) { - $message = 'Minify_ClosureCompiler : Closure Compiler execution failed.'; - if (self::$isDebug) { - exec($cmd . ' 2>&1', $error); - if ($error) { - $message .= "\nReason:\n" . join("\n", $error); - } - } - throw new Minify_ClosureCompiler_Exception($message); - } - return implode("\n", $output); - } - - private static function _getCmd($userOptions, $tmpFile) - { - $o = array_merge( - array( - self::OPTION_CHARSET => 'utf-8', - self::OPTION_COMPILATION_LEVEL => 'SIMPLE_OPTIMIZATIONS', - ), - $userOptions - ); - $charsetOption = $o[self::OPTION_CHARSET]; - $cmd = self::$javaExecutable . ' -jar ' . escapeshellarg(self::$jarFile) - . (preg_match('/^[\\da-zA-Z0-9\\-]+$/', $charsetOption) - ? " --charset {$charsetOption}" - : ''); - - foreach (array(self::OPTION_COMPILATION_LEVEL) as $opt) { - if ($o[$opt]) { - $cmd .= " --{$opt} ". escapeshellarg($o[$opt]); - } - } - return $cmd . ' ' . escapeshellarg($tmpFile); - } - - private static function _prepare() - { - if (! is_file(self::$jarFile)) { - throw new Minify_ClosureCompiler_Exception('Minify_ClosureCompiler : $jarFile('.self::$jarFile.') is not a valid file.'); - } - if (! is_readable(self::$jarFile)) { - throw new Minify_ClosureCompiler_Exception('Minify_ClosureCompiler : $jarFile('.self::$jarFile.') is not readable.'); - } - if (! is_dir(self::$tempDir)) { - throw new Minify_ClosureCompiler_Exception('Minify_ClosureCompiler : $tempDir('.self::$tempDir.') is not a valid direcotry.'); - } - if (! is_writable(self::$tempDir)) { - throw new Minify_ClosureCompiler_Exception('Minify_ClosureCompiler : $tempDir('.self::$tempDir.') is not writable.'); - } - } -} - -class Minify_ClosureCompiler_Exception extends Exception {} diff --git a/vendor/mrclay/minify/min/lib/Minify/CommentPreserver.php b/vendor/mrclay/minify/min/lib/Minify/CommentPreserver.php deleted file mode 100644 index 7a359bf9b..000000000 --- a/vendor/mrclay/minify/min/lib/Minify/CommentPreserver.php +++ /dev/null @@ -1,89 +0,0 @@ - - */ -class Minify_CommentPreserver { - - /** - * String to be prepended to each preserved comment - * - * @var string - */ - public static $prepend = "\n"; - - /** - * String to be appended to each preserved comment - * - * @var string - */ - public static $append = "\n"; - - /** - * Process a string outside of C-style comments that begin with "/*!" - * - * On each non-empty string outside these comments, the given processor - * function will be called. The comments will be surrounded by - * Minify_CommentPreserver::$preprend and Minify_CommentPreserver::$append. - * - * @param string $content - * @param callback $processor function - * @param array $args array of extra arguments to pass to the processor - * function (default = array()) - * @return string - */ - public static function process($content, $processor, $args = array()) - { - $ret = ''; - while (true) { - list($beforeComment, $comment, $afterComment) = self::_nextComment($content); - if ('' !== $beforeComment) { - $callArgs = $args; - array_unshift($callArgs, $beforeComment); - $ret .= call_user_func_array($processor, $callArgs); - } - if (false === $comment) { - break; - } - $ret .= $comment; - $content = $afterComment; - } - return $ret; - } - - /** - * Extract comments that YUI Compressor preserves. - * - * @param string $in input - * - * @return array 3 elements are returned. If a YUI comment is found, the - * 2nd element is the comment and the 1st and 3rd are the surrounding - * strings. If no comment is found, the entire string is returned as the - * 1st element and the other two are false. - */ - private static function _nextComment($in) - { - if ( - false === ($start = strpos($in, '/*!')) - || false === ($end = strpos($in, '*/', $start + 3)) - ) { - return array($in, false, false); - } - $ret = array( - substr($in, 0, $start) - ,self::$prepend . '/*!' . substr($in, $start + 3, $end - $start - 1) . self::$append - ); - $endChars = (strlen($in) - $end - 2); - $ret[] = (0 === $endChars) - ? '' - : substr($in, -$endChars); - return $ret; - } -} diff --git a/vendor/mrclay/minify/min/lib/Minify/Controller/Base.php b/vendor/mrclay/minify/min/lib/Minify/Controller/Base.php deleted file mode 100644 index 5a8632903..000000000 --- a/vendor/mrclay/minify/min/lib/Minify/Controller/Base.php +++ /dev/null @@ -1,222 +0,0 @@ - - */ -abstract class Minify_Controller_Base { - - /** - * Setup controller sources and set an needed options for Minify::source - * - * You must override this method in your subclass controller to set - * $this->sources. If the request is NOT valid, make sure $this->sources - * is left an empty array. Then strip any controller-specific options from - * $options and return it. To serve files, $this->sources must be an array of - * Minify_Source objects. - * - * @param array $options controller and Minify options - * - * @return array $options Minify::serve options - */ - abstract public function setupSources($options); - - /** - * Get default Minify options for this controller. - * - * Override in subclass to change defaults - * - * @return array options for Minify - */ - public function getDefaultMinifyOptions() { - return array( - 'isPublic' => true - ,'encodeOutput' => function_exists('gzdeflate') - ,'encodeMethod' => null // determine later - ,'encodeLevel' => 9 - ,'minifierOptions' => array() // no minifier options - ,'contentTypeCharset' => 'utf-8' - ,'maxAge' => 1800 // 30 minutes - ,'rewriteCssUris' => true - ,'bubbleCssImports' => false - ,'quiet' => false // serve() will send headers and output - ,'debug' => false - - // if you override these, the response codes MUST be directly after - // the first space. - ,'badRequestHeader' => 'HTTP/1.0 400 Bad Request' - ,'errorHeader' => 'HTTP/1.0 500 Internal Server Error' - - // callback function to see/modify content of all sources - ,'postprocessor' => null - // file to require to load preprocessor - ,'postprocessorRequire' => null - ); - } - - /** - * Get default minifiers for this controller. - * - * Override in subclass to change defaults - * - * @return array minifier callbacks for common types - */ - public function getDefaultMinifers() { - $ret[Minify::TYPE_JS] = array('JSMin', 'minify'); - $ret[Minify::TYPE_CSS] = array('Minify_CSS', 'minify'); - $ret[Minify::TYPE_HTML] = array('Minify_HTML', 'minify'); - return $ret; - } - - /** - * Is a user-given file within an allowable directory, existing, - * and having an extension js/css/html/txt ? - * - * This is a convenience function for controllers that have to accept - * user-given paths - * - * @param string $file full file path (already processed by realpath()) - * - * @param array $safeDirs directories where files are safe to serve. Files can also - * be in subdirectories of these directories. - * - * @return bool file is safe - * - * @deprecated use checkAllowDirs, checkNotHidden instead - */ - public static function _fileIsSafe($file, $safeDirs) - { - $pathOk = false; - foreach ((array)$safeDirs as $safeDir) { - if (strpos($file, $safeDir) === 0) { - $pathOk = true; - break; - } - } - $base = basename($file); - if (! $pathOk || ! is_file($file) || $base[0] === '.') { - return false; - } - list($revExt) = explode('.', strrev($base)); - return in_array(strrev($revExt), array('js', 'css', 'html', 'txt')); - } - - /** - * @param string $file - * @param array $allowDirs - * @param string $uri - * @return bool - * @throws Exception - */ - public static function checkAllowDirs($file, $allowDirs, $uri) - { - foreach ((array)$allowDirs as $allowDir) { - if (strpos($file, $allowDir) === 0) { - return true; - } - } - throw new Exception("File '$file' is outside \$allowDirs. If the path is" - . " resolved via an alias/symlink, look into the \$min_symlinks option." - . " E.g. \$min_symlinks['/" . dirname($uri) . "'] = '" . dirname($file) . "';"); - } - - /** - * @param string $file - * @throws Exception - */ - public static function checkNotHidden($file) - { - $b = basename($file); - if (0 === strpos($b, '.')) { - throw new Exception("Filename '$b' starts with period (may be hidden)"); - } - } - - /** - * instances of Minify_Source, which provide content and any individual minification needs. - * - * @var array - * - * @see Minify_Source - */ - public $sources = array(); - - /** - * Short name to place inside cache id - * - * The setupSources() method may choose to set this, making it easier to - * recognize a particular set of sources/settings in the cache folder. It - * will be filtered and truncated to make the final cache id <= 250 bytes. - * - * @var string - */ - public $selectionId = ''; - - /** - * Mix in default controller options with user-given options - * - * @param array $options user options - * - * @return array mixed options - */ - public final function mixInDefaultOptions($options) - { - $ret = array_merge( - $this->getDefaultMinifyOptions(), $options - ); - if (! isset($options['minifiers'])) { - $options['minifiers'] = array(); - } - $ret['minifiers'] = array_merge( - $this->getDefaultMinifers(), $options['minifiers'] - ); - return $ret; - } - - /** - * Analyze sources (if there are any) and set $options 'contentType' - * and 'lastModifiedTime' if they already aren't. - * - * @param array $options options for Minify - * - * @return array options for Minify - */ - public final function analyzeSources($options = array()) - { - if ($this->sources) { - if (! isset($options['contentType'])) { - $options['contentType'] = Minify_Source::getContentType($this->sources); - } - // last modified is needed for caching, even if setExpires is set - if (! isset($options['lastModifiedTime'])) { - $max = 0; - foreach ($this->sources as $source) { - $max = max($source->lastModified, $max); - } - $options['lastModifiedTime'] = $max; - } - } - return $options; - } - - /** - * Send message to the Minify logger - * - * @param string $msg - * - * @return null - */ - public function log($msg) { - Minify_Logger::log($msg); - } -} diff --git a/vendor/mrclay/minify/min/lib/Minify/Controller/Files.php b/vendor/mrclay/minify/min/lib/Minify/Controller/Files.php deleted file mode 100644 index f084cd07e..000000000 --- a/vendor/mrclay/minify/min/lib/Minify/Controller/Files.php +++ /dev/null @@ -1,76 +0,0 @@ - - * Minify::serve('Files', array( - * 'files' => array( - * '//js/jquery.js' - * ,'//js/plugins.js' - * ,'/home/username/file.js' - * ) - * )); - * - * - * As a shortcut, the controller will replace "//" at the beginning - * of a filename with $_SERVER['DOCUMENT_ROOT'] . '/'. - * - * @package Minify - * @author Stephen Clay - */ -class Minify_Controller_Files extends Minify_Controller_Base { - - /** - * Set up file sources - * - * @param array $options controller and Minify options - * @return array Minify options - * - * Controller options: - * - * 'files': (required) array of complete file paths, or a single path - */ - public function setupSources($options) { - // strip controller options - - $files = $options['files']; - // if $files is a single object, casting will break it - if (is_object($files)) { - $files = array($files); - } elseif (! is_array($files)) { - $files = (array)$files; - } - unset($options['files']); - - $sources = array(); - foreach ($files as $file) { - if ($file instanceof Minify_Source) { - $sources[] = $file; - continue; - } - if (0 === strpos($file, '//')) { - $file = $_SERVER['DOCUMENT_ROOT'] . substr($file, 1); - } - $realPath = realpath($file); - if (is_file($realPath)) { - $sources[] = new Minify_Source(array( - 'filepath' => $realPath - )); - } else { - $this->log("The path \"{$file}\" could not be found (or was not a file)"); - return $options; - } - } - if ($sources) { - $this->sources = $sources; - } - return $options; - } -} - diff --git a/vendor/mrclay/minify/min/lib/Minify/Controller/Groups.php b/vendor/mrclay/minify/min/lib/Minify/Controller/Groups.php deleted file mode 100644 index c4c25db12..000000000 --- a/vendor/mrclay/minify/min/lib/Minify/Controller/Groups.php +++ /dev/null @@ -1,91 +0,0 @@ - - * Minify::serve('Groups', array( - * 'groups' => array( - * 'css' => array('//css/type.css', '//css/layout.css') - * ,'js' => array('//js/jquery.js', '//js/site.js') - * ) - * )); - * - * - * If the above code were placed in /serve.php, it would enable the URLs - * /serve.php/js and /serve.php/css - * - * As a shortcut, the controller will replace "//" at the beginning - * of a filename with $_SERVER['DOCUMENT_ROOT'] . '/'. - * - * @package Minify - * @author Stephen Clay - */ -class Minify_Controller_Groups extends Minify_Controller_Base { - - /** - * Set up groups of files as sources - * - * @param array $options controller and Minify options - * - * 'groups': (required) array mapping PATH_INFO strings to arrays - * of complete file paths. @see Minify_Controller_Groups - * - * @return array Minify options - */ - public function setupSources($options) { - // strip controller options - $groups = $options['groups']; - unset($options['groups']); - - // mod_fcgid places PATH_INFO in ORIG_PATH_INFO - $pi = isset($_SERVER['ORIG_PATH_INFO']) - ? substr($_SERVER['ORIG_PATH_INFO'], 1) - : (isset($_SERVER['PATH_INFO']) - ? substr($_SERVER['PATH_INFO'], 1) - : false - ); - if (false === $pi || ! isset($groups[$pi])) { - // no PATH_INFO or not a valid group - $this->log("Missing PATH_INFO or no group set for \"$pi\""); - return $options; - } - $sources = array(); - - $files = $groups[$pi]; - // if $files is a single object, casting will break it - if (is_object($files)) { - $files = array($files); - } elseif (! is_array($files)) { - $files = (array)$files; - } - foreach ($files as $file) { - if ($file instanceof Minify_Source) { - $sources[] = $file; - continue; - } - if (0 === strpos($file, '//')) { - $file = $_SERVER['DOCUMENT_ROOT'] . substr($file, 1); - } - $realPath = realpath($file); - if (is_file($realPath)) { - $sources[] = new Minify_Source(array( - 'filepath' => $realPath - )); - } else { - $this->log("The path \"{$file}\" could not be found (or was not a file)"); - return $options; - } - } - if ($sources) { - $this->sources = $sources; - } - return $options; - } -} - diff --git a/vendor/mrclay/minify/min/lib/Minify/Controller/MinApp.php b/vendor/mrclay/minify/min/lib/Minify/Controller/MinApp.php deleted file mode 100644 index 6943ee6bf..000000000 --- a/vendor/mrclay/minify/min/lib/Minify/Controller/MinApp.php +++ /dev/null @@ -1,238 +0,0 @@ - - */ -class Minify_Controller_MinApp extends Minify_Controller_Base { - - /** - * Set up groups of files as sources - * - * @param array $options controller and Minify options - * - * @return array Minify options - */ - public function setupSources($options) { - // PHP insecure by default: realpath() and other FS functions can't handle null bytes. - foreach (array('g', 'b', 'f') as $key) { - if (isset($_GET[$key])) { - $_GET[$key] = str_replace("\x00", '', (string)$_GET[$key]); - } - } - - // filter controller options - $cOptions = array_merge( - array( - 'allowDirs' => '//' - ,'groupsOnly' => false - ,'groups' => array() - ,'noMinPattern' => '@[-\\.]min\\.(?:js|css)$@i' // matched against basename - ) - ,(isset($options['minApp']) ? $options['minApp'] : array()) - ); - unset($options['minApp']); - $sources = array(); - $this->selectionId = ''; - $firstMissingResource = null; - if (isset($_GET['g'])) { - // add group(s) - $this->selectionId .= 'g=' . $_GET['g']; - $keys = explode(',', $_GET['g']); - if ($keys != array_unique($keys)) { - $this->log("Duplicate group key found."); - return $options; - } - $keys = explode(',', $_GET['g']); - foreach ($keys as $key) { - if (! isset($cOptions['groups'][$key])) { - $this->log("A group configuration for \"{$key}\" was not found"); - return $options; - } - $files = $cOptions['groups'][$key]; - // if $files is a single object, casting will break it - if (is_object($files)) { - $files = array($files); - } elseif (! is_array($files)) { - $files = (array)$files; - } - foreach ($files as $file) { - if ($file instanceof Minify_Source) { - $sources[] = $file; - continue; - } - if (0 === strpos($file, '//')) { - $file = $_SERVER['DOCUMENT_ROOT'] . substr($file, 1); - } - $realpath = realpath($file); - if ($realpath && is_file($realpath)) { - $sources[] = $this->_getFileSource($realpath, $cOptions); - } else { - $this->log("The path \"{$file}\" (realpath \"{$realpath}\") could not be found (or was not a file)"); - if (null === $firstMissingResource) { - $firstMissingResource = basename($file); - continue; - } else { - $secondMissingResource = basename($file); - $this->log("More than one file was missing: '$firstMissingResource', '$secondMissingResource'"); - return $options; - } - } - } - if ($sources) { - try { - $this->checkType($sources[0]); - } catch (Exception $e) { - $this->log($e->getMessage()); - return $options; - } - } - } - } - if (! $cOptions['groupsOnly'] && isset($_GET['f'])) { - // try user files - // The following restrictions are to limit the URLs that minify will - // respond to. - if (// verify at least one file, files are single comma separated, - // and are all same extension - ! preg_match('/^[^,]+\\.(css|js)(?:,[^,]+\\.\\1)*$/', $_GET['f'], $m) - // no "//" - || strpos($_GET['f'], '//') !== false - // no "\" - || strpos($_GET['f'], '\\') !== false - ) { - $this->log("GET param 'f' was invalid"); - return $options; - } - $ext = ".{$m[1]}"; - try { - $this->checkType($m[1]); - } catch (Exception $e) { - $this->log($e->getMessage()); - return $options; - } - $files = explode(',', $_GET['f']); - if ($files != array_unique($files)) { - $this->log("Duplicate files were specified"); - return $options; - } - if (isset($_GET['b'])) { - // check for validity - if (preg_match('@^[^/]+(?:/[^/]+)*$@', $_GET['b']) - && false === strpos($_GET['b'], '..') - && $_GET['b'] !== '.') { - // valid base - $base = "/{$_GET['b']}/"; - } else { - $this->log("GET param 'b' was invalid"); - return $options; - } - } else { - $base = '/'; - } - $allowDirs = array(); - foreach ((array)$cOptions['allowDirs'] as $allowDir) { - $allowDirs[] = realpath(str_replace('//', $_SERVER['DOCUMENT_ROOT'] . '/', $allowDir)); - } - $basenames = array(); // just for cache id - foreach ($files as $file) { - $uri = $base . $file; - $path = $_SERVER['DOCUMENT_ROOT'] . $uri; - $realpath = realpath($path); - if (false === $realpath || ! is_file($realpath)) { - $this->log("The path \"{$path}\" (realpath \"{$realpath}\") could not be found (or was not a file)"); - if (null === $firstMissingResource) { - $firstMissingResource = $uri; - continue; - } else { - $secondMissingResource = $uri; - $this->log("More than one file was missing: '$firstMissingResource', '$secondMissingResource`'"); - return $options; - } - } - try { - parent::checkNotHidden($realpath); - parent::checkAllowDirs($realpath, $allowDirs, $uri); - } catch (Exception $e) { - $this->log($e->getMessage()); - return $options; - } - $sources[] = $this->_getFileSource($realpath, $cOptions); - $basenames[] = basename($realpath, $ext); - } - if ($this->selectionId) { - $this->selectionId .= '_f='; - } - $this->selectionId .= implode(',', $basenames) . $ext; - } - if ($sources) { - if (null !== $firstMissingResource) { - array_unshift($sources, new Minify_Source(array( - 'id' => 'missingFile' - // should not cause cache invalidation - ,'lastModified' => 0 - // due to caching, filename is unreliable. - ,'content' => "/* Minify: at least one missing file. See " . Minify::URL_DEBUG . " */\n" - ,'minifier' => '' - ))); - } - $this->sources = $sources; - } else { - $this->log("No sources to serve"); - } - return $options; - } - - /** - * @param string $file - * - * @param array $cOptions - * - * @return Minify_Source - */ - protected function _getFileSource($file, $cOptions) - { - $spec['filepath'] = $file; - if ($cOptions['noMinPattern'] && preg_match($cOptions['noMinPattern'], basename($file))) { - if (preg_match('~\.css$~i', $file)) { - $spec['minifyOptions']['compress'] = false; - } else { - $spec['minifier'] = ''; - } - } - return new Minify_Source($spec); - } - - protected $_type = null; - - /** - * Make sure that only source files of a single type are registered - * - * @param string $sourceOrExt - * - * @throws Exception - */ - public function checkType($sourceOrExt) - { - if ($sourceOrExt === 'js') { - $type = Minify::TYPE_JS; - } elseif ($sourceOrExt === 'css') { - $type = Minify::TYPE_CSS; - } elseif ($sourceOrExt->contentType !== null) { - $type = $sourceOrExt->contentType; - } else { - return; - } - if ($this->_type === null) { - $this->_type = $type; - } elseif ($this->_type !== $type) { - throw new Exception('Content-Type mismatch'); - } - } -} diff --git a/vendor/mrclay/minify/min/lib/Minify/Controller/Page.php b/vendor/mrclay/minify/min/lib/Minify/Controller/Page.php deleted file mode 100644 index 1095fb46f..000000000 --- a/vendor/mrclay/minify/min/lib/Minify/Controller/Page.php +++ /dev/null @@ -1,68 +0,0 @@ - - */ -class Minify_Controller_Page extends Minify_Controller_Base { - - /** - * Set up source of HTML content - * - * @param array $options controller and Minify options - * @return array Minify options - * - * Controller options: - * - * 'content': (required) HTML markup - * - * 'id': (required) id of page (string for use in server-side caching) - * - * 'lastModifiedTime': timestamp of when this content changed. This - * is recommended to allow both server and client-side caching. - * - * 'minifyAll': should all CSS and Javascript blocks be individually - * minified? (default false) - * - * @todo Add 'file' option to read HTML file. - */ - public function setupSources($options) { - if (isset($options['file'])) { - $sourceSpec = array( - 'filepath' => $options['file'] - ); - $f = $options['file']; - } else { - // strip controller options - $sourceSpec = array( - 'content' => $options['content'] - ,'id' => $options['id'] - ); - $f = $options['id']; - unset($options['content'], $options['id']); - } - // something like "builder,index.php" or "directory,file.html" - $this->selectionId = strtr(substr($f, 1 + strlen(dirname(dirname($f)))), '/\\', ',,'); - - if (isset($options['minifyAll'])) { - // this will be the 2nd argument passed to Minify_HTML::minify() - $sourceSpec['minifyOptions'] = array( - 'cssMinifier' => array('Minify_CSS', 'minify') - ,'jsMinifier' => array('JSMin', 'minify') - ); - unset($options['minifyAll']); - } - $this->sources[] = new Minify_Source($sourceSpec); - - $options['contentType'] = Minify::TYPE_HTML; - return $options; - } -} - diff --git a/vendor/mrclay/minify/min/lib/Minify/Controller/Version1.php b/vendor/mrclay/minify/min/lib/Minify/Controller/Version1.php deleted file mode 100644 index 91fcf6144..000000000 --- a/vendor/mrclay/minify/min/lib/Minify/Controller/Version1.php +++ /dev/null @@ -1,119 +0,0 @@ - - * Minify::serve('Version1'); - * - * - * @package Minify - * @author Stephen Clay - */ -class Minify_Controller_Version1 extends Minify_Controller_Base { - - /** - * Set up groups of files as sources - * - * @param array $options controller and Minify options - * @return array Minify options - * - */ - public function setupSources($options) { - // PHP insecure by default: realpath() and other FS functions can't handle null bytes. - if (isset($_GET['files'])) { - $_GET['files'] = str_replace("\x00", '', (string)$_GET['files']); - } - - self::_setupDefines(); - if (MINIFY_USE_CACHE) { - $cacheDir = defined('MINIFY_CACHE_DIR') - ? MINIFY_CACHE_DIR - : ''; - Minify::setCache($cacheDir); - } - $options['badRequestHeader'] = 'HTTP/1.0 404 Not Found'; - $options['contentTypeCharset'] = MINIFY_ENCODING; - - // The following restrictions are to limit the URLs that minify will - // respond to. Ideally there should be only one way to reference a file. - if (! isset($_GET['files']) - // verify at least one file, files are single comma separated, - // and are all same extension - || ! preg_match('/^[^,]+\\.(css|js)(,[^,]+\\.\\1)*$/', $_GET['files'], $m) - // no "//" (makes URL rewriting easier) - || strpos($_GET['files'], '//') !== false - // no "\" - || strpos($_GET['files'], '\\') !== false - // no "./" - || preg_match('/(?:^|[^\\.])\\.\\//', $_GET['files']) - ) { - return $options; - } - - $files = explode(',', $_GET['files']); - if (count($files) > MINIFY_MAX_FILES) { - return $options; - } - - // strings for prepending to relative/absolute paths - $prependRelPaths = dirname($_SERVER['SCRIPT_FILENAME']) - . DIRECTORY_SEPARATOR; - $prependAbsPaths = $_SERVER['DOCUMENT_ROOT']; - - $goodFiles = array(); - $hasBadSource = false; - - $allowDirs = isset($options['allowDirs']) - ? $options['allowDirs'] - : MINIFY_BASE_DIR; - - foreach ($files as $file) { - // prepend appropriate string for abs/rel paths - $file = ($file[0] === '/' ? $prependAbsPaths : $prependRelPaths) . $file; - // make sure a real file! - $file = realpath($file); - // don't allow unsafe or duplicate files - if (parent::_fileIsSafe($file, $allowDirs) - && !in_array($file, $goodFiles)) - { - $goodFiles[] = $file; - $srcOptions = array( - 'filepath' => $file - ); - $this->sources[] = new Minify_Source($srcOptions); - } else { - $hasBadSource = true; - break; - } - } - if ($hasBadSource) { - $this->sources = array(); - } - if (! MINIFY_REWRITE_CSS_URLS) { - $options['rewriteCssUris'] = false; - } - return $options; - } - - private static function _setupDefines() - { - $defaults = array( - 'MINIFY_BASE_DIR' => realpath($_SERVER['DOCUMENT_ROOT']) - ,'MINIFY_ENCODING' => 'utf-8' - ,'MINIFY_MAX_FILES' => 16 - ,'MINIFY_REWRITE_CSS_URLS' => true - ,'MINIFY_USE_CACHE' => true - ); - foreach ($defaults as $const => $val) { - if (! defined($const)) { - define($const, $val); - } - } - } -} - diff --git a/vendor/mrclay/minify/min/lib/Minify/DebugDetector.php b/vendor/mrclay/minify/min/lib/Minify/DebugDetector.php deleted file mode 100644 index 1def97484..000000000 --- a/vendor/mrclay/minify/min/lib/Minify/DebugDetector.php +++ /dev/null @@ -1,26 +0,0 @@ - - */ -class Minify_DebugDetector { - public static function shouldDebugRequest($cookie, $get, $requestUri) - { - if (isset($get['debug'])) { - return true; - } - if (! empty($cookie['minifyDebug'])) { - foreach (preg_split('/\\s+/', $cookie['minifyDebug']) as $debugUri) { - $pattern = '@' . preg_quote($debugUri, '@') . '@i'; - $pattern = str_replace(array('\\*', '\\?'), array('.*', '.'), $pattern); - if (preg_match($pattern, $requestUri)) { - return true; - } - } - } - return false; - } -} diff --git a/vendor/mrclay/minify/min/lib/Minify/HTML.php b/vendor/mrclay/minify/min/lib/Minify/HTML.php deleted file mode 100644 index 40f730761..000000000 --- a/vendor/mrclay/minify/min/lib/Minify/HTML.php +++ /dev/null @@ -1,255 +0,0 @@ - - */ -class Minify_HTML { - /** - * @var boolean - */ - protected $_jsCleanComments = true; - - /** - * "Minify" an HTML page - * - * @param string $html - * - * @param array $options - * - * 'cssMinifier' : (optional) callback function to process content of STYLE - * elements. - * - * 'jsMinifier' : (optional) callback function to process content of SCRIPT - * elements. Note: the type attribute is ignored. - * - * 'xhtml' : (optional boolean) should content be treated as XHTML1.0? If - * unset, minify will sniff for an XHTML doctype. - * - * @return string - */ - public static function minify($html, $options = array()) { - $min = new self($html, $options); - return $min->process(); - } - - - /** - * Create a minifier object - * - * @param string $html - * - * @param array $options - * - * 'cssMinifier' : (optional) callback function to process content of STYLE - * elements. - * - * 'jsMinifier' : (optional) callback function to process content of SCRIPT - * elements. Note: the type attribute is ignored. - * - * 'jsCleanComments' : (optional) whether to remove HTML comments beginning and end of script block - * - * 'xhtml' : (optional boolean) should content be treated as XHTML1.0? If - * unset, minify will sniff for an XHTML doctype. - */ - public function __construct($html, $options = array()) - { - $this->_html = str_replace("\r\n", "\n", trim($html)); - if (isset($options['xhtml'])) { - $this->_isXhtml = (bool)$options['xhtml']; - } - if (isset($options['cssMinifier'])) { - $this->_cssMinifier = $options['cssMinifier']; - } - if (isset($options['jsMinifier'])) { - $this->_jsMinifier = $options['jsMinifier']; - } - if (isset($options['jsCleanComments'])) { - $this->_jsCleanComments = (bool)$options['jsCleanComments']; - } - } - - - /** - * Minify the markeup given in the constructor - * - * @return string - */ - public function process() - { - if ($this->_isXhtml === null) { - $this->_isXhtml = (false !== strpos($this->_html, '_replacementHash = 'MINIFYHTML' . md5($_SERVER['REQUEST_TIME']); - $this->_placeholders = array(); - - // replace SCRIPTs (and minify) with placeholders - $this->_html = preg_replace_callback( - '/(\\s*)]*?>)([\\s\\S]*?)<\\/script>(\\s*)/i' - ,array($this, '_removeScriptCB') - ,$this->_html); - - // replace STYLEs (and minify) with placeholders - $this->_html = preg_replace_callback( - '/\\s*]*>)([\\s\\S]*?)<\\/style>\\s*/i' - ,array($this, '_removeStyleCB') - ,$this->_html); - - // remove HTML comments (not containing IE conditional comments). - $this->_html = preg_replace_callback( - '//' - ,array($this, '_commentCB') - ,$this->_html); - - // replace PREs with placeholders - $this->_html = preg_replace_callback('/\\s*]*?>[\\s\\S]*?<\\/pre>)\\s*/i' - ,array($this, '_removePreCB') - ,$this->_html); - - // replace TEXTAREAs with placeholders - $this->_html = preg_replace_callback( - '/\\s*]*?>[\\s\\S]*?<\\/textarea>)\\s*/i' - ,array($this, '_removeTextareaCB') - ,$this->_html); - - // trim each line. - // @todo take into account attribute values that span multiple lines. - $this->_html = preg_replace('/^\\s+|\\s+$/m', '', $this->_html); - - // remove ws around block/undisplayed elements - $this->_html = preg_replace('/\\s+(<\\/?(?:area|base(?:font)?|blockquote|body' - .'|caption|center|col(?:group)?|dd|dir|div|dl|dt|fieldset|form' - .'|frame(?:set)?|h[1-6]|head|hr|html|legend|li|link|map|menu|meta' - .'|ol|opt(?:group|ion)|p|param|t(?:able|body|head|d|h||r|foot|itle)' - .'|ul)\\b[^>]*>)/i', '$1', $this->_html); - - // remove ws outside of all elements - $this->_html = preg_replace( - '/>(\\s(?:\\s*))?([^<]+)(\\s(?:\s*))?$1$2$3<' - ,$this->_html); - - // use newlines before 1st attribute in open tags (to limit line lengths) - $this->_html = preg_replace('/(<[a-z\\-]+)\\s+([^>]+>)/i', "$1\n$2", $this->_html); - - // fill placeholders - $this->_html = str_replace( - array_keys($this->_placeholders) - ,array_values($this->_placeholders) - ,$this->_html - ); - // issue 229: multi-pass to catch scripts that didn't get replaced in textareas - $this->_html = str_replace( - array_keys($this->_placeholders) - ,array_values($this->_placeholders) - ,$this->_html - ); - return $this->_html; - } - - protected function _commentCB($m) - { - return (0 === strpos($m[1], '[') || false !== strpos($m[1], '_replacementHash . count($this->_placeholders) . '%'; - $this->_placeholders[$placeholder] = $content; - return $placeholder; - } - - protected $_isXhtml = null; - protected $_replacementHash = null; - protected $_placeholders = array(); - protected $_cssMinifier = null; - protected $_jsMinifier = null; - - protected function _removePreCB($m) - { - return $this->_reservePlace("_reservePlace("\\s*$)/', '', $css); - - // remove CDATA section markers - $css = $this->_removeCdata($css); - - // minify - $minifier = $this->_cssMinifier - ? $this->_cssMinifier - : 'trim'; - $css = call_user_func($minifier, $css); - - return $this->_reservePlace($this->_needsCdata($css) - ? "{$openStyle}/**/" - : "{$openStyle}{$css}" - ); - } - - protected function _removeScriptCB($m) - { - $openScript = "_jsCleanComments) { - $js = preg_replace('/(?:^\\s*\\s*$)/', '', $js); - } - - // remove CDATA section markers - $js = $this->_removeCdata($js); - - // minify - $minifier = $this->_jsMinifier - ? $this->_jsMinifier - : 'trim'; - $js = call_user_func($minifier, $js); - - return $this->_reservePlace($this->_needsCdata($js) - ? "{$ws1}{$openScript}/**/{$ws2}" - : "{$ws1}{$openScript}{$js}{$ws2}" - ); - } - - protected function _removeCdata($str) - { - return (false !== strpos($str, ''), '', $str) - : $str; - } - - protected function _needsCdata($str) - { - return ($this->_isXhtml && preg_match('/(?:[<&]|\\-\\-|\\]\\]>)/', $str)); - } -} diff --git a/vendor/mrclay/minify/min/lib/Minify/HTML/Helper.php b/vendor/mrclay/minify/min/lib/Minify/HTML/Helper.php deleted file mode 100644 index f92ab854c..000000000 --- a/vendor/mrclay/minify/min/lib/Minify/HTML/Helper.php +++ /dev/null @@ -1,225 +0,0 @@ - - */ -class Minify_HTML_Helper { - public $rewriteWorks = true; - public $minAppUri = '/min'; - public $groupsConfigFile = ''; - - /** - * Get an HTML-escaped Minify URI for a group or set of files - * - * @param string|array $keyOrFiles a group key or array of filepaths/URIs - * @param array $opts options: - * 'farExpires' : (default true) append a modified timestamp for cache revving - * 'debug' : (default false) append debug flag - * 'charset' : (default 'UTF-8') for htmlspecialchars - * 'minAppUri' : (default '/min') URI of min directory - * 'rewriteWorks' : (default true) does mod_rewrite work in min app? - * 'groupsConfigFile' : specify if different - * @return string - */ - public static function getUri($keyOrFiles, $opts = array()) - { - $opts = array_merge(array( // default options - 'farExpires' => true - ,'debug' => false - ,'charset' => 'UTF-8' - ,'minAppUri' => '/min' - ,'rewriteWorks' => true - ,'groupsConfigFile' => '' - ), $opts); - $h = new self; - $h->minAppUri = $opts['minAppUri']; - $h->rewriteWorks = $opts['rewriteWorks']; - $h->groupsConfigFile = $opts['groupsConfigFile']; - if (is_array($keyOrFiles)) { - $h->setFiles($keyOrFiles, $opts['farExpires']); - } else { - $h->setGroup($keyOrFiles, $opts['farExpires']); - } - $uri = $h->getRawUri($opts['farExpires'], $opts['debug']); - return htmlspecialchars($uri, ENT_QUOTES, $opts['charset']); - } - - /** - * Get non-HTML-escaped URI to minify the specified files - * - * @param bool $farExpires - * @param bool $debug - * @return string - */ - public function getRawUri($farExpires = true, $debug = false) - { - $path = rtrim($this->minAppUri, '/') . '/'; - if (! $this->rewriteWorks) { - $path .= '?'; - } - if (null === $this->_groupKey) { - // @todo: implement shortest uri - $path = self::_getShortestUri($this->_filePaths, $path); - } else { - $path .= "g=" . $this->_groupKey; - } - if ($debug) { - $path .= "&debug"; - } elseif ($farExpires && $this->_lastModified) { - $path .= "&" . $this->_lastModified; - } - return $path; - } - - /** - * Set the files that will comprise the URI we're building - * - * @param array $files - * @param bool $checkLastModified - */ - public function setFiles($files, $checkLastModified = true) - { - $this->_groupKey = null; - if ($checkLastModified) { - $this->_lastModified = self::getLastModified($files); - } - // normalize paths like in /min/f= - foreach ($files as $k => $file) { - if (0 === strpos($file, '//')) { - $file = substr($file, 2); - } elseif (0 === strpos($file, '/') - || 1 === strpos($file, ':\\')) { - $file = substr($file, strlen($_SERVER['DOCUMENT_ROOT']) + 1); - } - $file = strtr($file, '\\', '/'); - $files[$k] = $file; - } - $this->_filePaths = $files; - } - - /** - * Set the group of files that will comprise the URI we're building - * - * @param string $key - * @param bool $checkLastModified - */ - public function setGroup($key, $checkLastModified = true) - { - $this->_groupKey = $key; - if ($checkLastModified) { - if (! $this->groupsConfigFile) { - $this->groupsConfigFile = dirname(dirname(dirname(dirname(__FILE__)))) . '/groupsConfig.php'; - } - if (is_file($this->groupsConfigFile)) { - $gc = (require $this->groupsConfigFile); - $keys = explode(',', $key); - foreach ($keys as $key) { - if (isset($gc[$key])) { - $this->_lastModified = self::getLastModified($gc[$key], $this->_lastModified); - } - } - } - } - } - - /** - * Get the max(lastModified) of all files - * - * @param array|string $sources - * @param int $lastModified - * @return int - */ - public static function getLastModified($sources, $lastModified = 0) - { - $max = $lastModified; - foreach ((array)$sources as $source) { - if (is_object($source) && isset($source->lastModified)) { - $max = max($max, $source->lastModified); - } elseif (is_string($source)) { - if (0 === strpos($source, '//')) { - $source = $_SERVER['DOCUMENT_ROOT'] . substr($source, 1); - } - if (is_file($source)) { - $max = max($max, filemtime($source)); - } - } - } - return $max; - } - - protected $_groupKey = null; // if present, URI will be like g=... - protected $_filePaths = array(); - protected $_lastModified = null; - - - /** - * In a given array of strings, find the character they all have at - * a particular index - * - * @param array $arr array of strings - * @param int $pos index to check - * @return mixed a common char or '' if any do not match - */ - protected static function _getCommonCharAtPos($arr, $pos) { - if (!isset($arr[0][$pos])) { - return ''; - } - $c = $arr[0][$pos]; - $l = count($arr); - if ($l === 1) { - return $c; - } - for ($i = 1; $i < $l; ++$i) { - if ($arr[$i][$pos] !== $c) { - return ''; - } - } - return $c; - } - - /** - * Get the shortest URI to minify the set of source files - * - * @param array $paths root-relative URIs of files - * @param string $minRoot root-relative URI of the "min" application - * @return string - */ - protected static function _getShortestUri($paths, $minRoot = '/min/') { - $pos = 0; - $base = ''; - while (true) { - $c = self::_getCommonCharAtPos($paths, $pos); - if ($c === '') { - break; - } else { - $base .= $c; - } - ++$pos; - } - $base = preg_replace('@[^/]+$@', '', $base); - $uri = $minRoot . 'f=' . implode(',', $paths); - - if (substr($base, -1) === '/') { - // we have a base dir! - $basedPaths = $paths; - $l = count($paths); - for ($i = 0; $i < $l; ++$i) { - $basedPaths[$i] = substr($paths[$i], strlen($base)); - } - $base = substr($base, 0, strlen($base) - 1); - $bUri = $minRoot . 'b=' . $base . '&f=' . implode(',', $basedPaths); - - $uri = strlen($uri) < strlen($bUri) - ? $uri - : $bUri; - } - return $uri; - } -} diff --git a/vendor/mrclay/minify/min/lib/Minify/ImportProcessor.php b/vendor/mrclay/minify/min/lib/Minify/ImportProcessor.php deleted file mode 100644 index bdfae547d..000000000 --- a/vendor/mrclay/minify/min/lib/Minify/ImportProcessor.php +++ /dev/null @@ -1,216 +0,0 @@ - - * @author Simon Schick - */ -class Minify_ImportProcessor { - - public static $filesIncluded = array(); - - public static function process($file) - { - self::$filesIncluded = array(); - self::$_isCss = (strtolower(substr($file, -4)) === '.css'); - $obj = new Minify_ImportProcessor(dirname($file)); - return $obj->_getContent($file); - } - - // allows callback funcs to know the current directory - private $_currentDir = null; - - // allows callback funcs to know the directory of the file that inherits this one - private $_previewsDir = null; - - // allows _importCB to write the fetched content back to the obj - private $_importedContent = ''; - - private static $_isCss = null; - - /** - * @param String $currentDir - * @param String $previewsDir Is only used internally - */ - private function __construct($currentDir, $previewsDir = "") - { - $this->_currentDir = $currentDir; - $this->_previewsDir = $previewsDir; - } - - private function _getContent($file, $is_imported = false) - { - $file = realpath($file); - if (! $file - || in_array($file, self::$filesIncluded) - || false === ($content = @file_get_contents($file)) - ) { - // file missing, already included, or failed read - return ''; - } - self::$filesIncluded[] = realpath($file); - $this->_currentDir = dirname($file); - - // remove UTF-8 BOM if present - if (pack("CCC",0xef,0xbb,0xbf) === substr($content, 0, 3)) { - $content = substr($content, 3); - } - // ensure uniform EOLs - $content = str_replace("\r\n", "\n", $content); - - // process @imports - $content = preg_replace_callback( - '/ - @import\\s+ - (?:url\\(\\s*)? # maybe url( - [\'"]? # maybe quote - (.*?) # 1 = URI - [\'"]? # maybe end quote - (?:\\s*\\))? # maybe ) - ([a-zA-Z,\\s]*)? # 2 = media list - ; # end token - /x' - ,array($this, '_importCB') - ,$content - ); - - // You only need to rework the import-path if the script is imported - if (self::$_isCss && $is_imported) { - // rewrite remaining relative URIs - $content = preg_replace_callback( - '/url\\(\\s*([^\\)\\s]+)\\s*\\)/' - ,array($this, '_urlCB') - ,$content - ); - } - - return $this->_importedContent . $content; - } - - private function _importCB($m) - { - $url = $m[1]; - $mediaList = preg_replace('/\\s+/', '', $m[2]); - - if (strpos($url, '://') > 0) { - // protocol, leave in place for CSS, comment for JS - return self::$_isCss - ? $m[0] - : "/* Minify_ImportProcessor will not include remote content */"; - } - if ('/' === $url[0]) { - // protocol-relative or root path - $url = ltrim($url, '/'); - $file = realpath($_SERVER['DOCUMENT_ROOT']) . DIRECTORY_SEPARATOR - . strtr($url, '/', DIRECTORY_SEPARATOR); - } else { - // relative to current path - $file = $this->_currentDir . DIRECTORY_SEPARATOR - . strtr($url, '/', DIRECTORY_SEPARATOR); - } - $obj = new Minify_ImportProcessor(dirname($file), $this->_currentDir); - $content = $obj->_getContent($file, true); - if ('' === $content) { - // failed. leave in place for CSS, comment for JS - return self::$_isCss - ? $m[0] - : "/* Minify_ImportProcessor could not fetch '{$file}' */"; - } - return (!self::$_isCss || preg_match('@(?:^$|\\ball\\b)@', $mediaList)) - ? $content - : "@media {$mediaList} {\n{$content}\n}\n"; - } - - private function _urlCB($m) - { - // $m[1] is either quoted or not - $quote = ($m[1][0] === "'" || $m[1][0] === '"') - ? $m[1][0] - : ''; - $url = ($quote === '') - ? $m[1] - : substr($m[1], 1, strlen($m[1]) - 2); - if ('/' !== $url[0]) { - if (strpos($url, '//') > 0) { - // probably starts with protocol, do not alter - } else { - // prepend path with current dir separator (OS-independent) - $path = $this->_currentDir - . DIRECTORY_SEPARATOR . strtr($url, '/', DIRECTORY_SEPARATOR); - // update the relative path by the directory of the file that imported this one - $url = self::getPathDiff(realpath($this->_previewsDir), $path); - } - } - return "url({$quote}{$url}{$quote})"; - } - - /** - * @param string $from - * @param string $to - * @param string $ps - * @return string - */ - private function getPathDiff($from, $to, $ps = DIRECTORY_SEPARATOR) - { - $realFrom = $this->truepath($from); - $realTo = $this->truepath($to); - - $arFrom = explode($ps, rtrim($realFrom, $ps)); - $arTo = explode($ps, rtrim($realTo, $ps)); - while (count($arFrom) && count($arTo) && ($arFrom[0] == $arTo[0])) - { - array_shift($arFrom); - array_shift($arTo); - } - return str_pad("", count($arFrom) * 3, '..' . $ps) . implode($ps, $arTo); - } - - /** - * This function is to replace PHP's extremely buggy realpath(). - * @param string $path The original path, can be relative etc. - * @return string The resolved path, it might not exist. - * @see http://stackoverflow.com/questions/4049856/replace-phps-realpath - */ - function truepath($path) - { - // whether $path is unix or not - $unipath = strlen($path) == 0 || $path{0} != '/'; - // attempts to detect if path is relative in which case, add cwd - if (strpos($path, ':') === false && $unipath) - $path = $this->_currentDir . DIRECTORY_SEPARATOR . $path; - - // resolve path parts (single dot, double dot and double delimiters) - $path = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, $path); - $parts = array_filter(explode(DIRECTORY_SEPARATOR, $path), 'strlen'); - $absolutes = array(); - foreach ($parts as $part) { - if ('.' == $part) - continue; - if ('..' == $part) { - array_pop($absolutes); - } else { - $absolutes[] = $part; - } - } - $path = implode(DIRECTORY_SEPARATOR, $absolutes); - // resolve any symlinks - if (file_exists($path) && linkinfo($path) > 0) - $path = readlink($path); - // put initial separator that could have been lost - $path = !$unipath ? '/' . $path : $path; - return $path; - } -} diff --git a/vendor/mrclay/minify/min/lib/Minify/JS/ClosureCompiler.php b/vendor/mrclay/minify/min/lib/Minify/JS/ClosureCompiler.php deleted file mode 100644 index e067d7c85..000000000 --- a/vendor/mrclay/minify/min/lib/Minify/JS/ClosureCompiler.php +++ /dev/null @@ -1,230 +0,0 @@ - - * - * @todo can use a stream wrapper to unit test this? - */ -class Minify_JS_ClosureCompiler { - - /** - * @var string The option key for the maximum POST byte size - */ - const OPTION_MAX_BYTES = 'maxBytes'; - - /** - * @var string The option key for additional params. @see __construct - */ - const OPTION_ADDITIONAL_OPTIONS = 'additionalParams'; - - /** - * @var string The option key for the fallback Minifier - */ - const OPTION_FALLBACK_FUNCTION = 'fallbackFunc'; - - /** - * @var string The option key for the service URL - */ - const OPTION_COMPILER_URL = 'compilerUrl'; - - /** - * @var int The default maximum POST byte size according to https://developers.google.com/closure/compiler/docs/api-ref - */ - const DEFAULT_MAX_BYTES = 200000; - - /** - * @var string[] $DEFAULT_OPTIONS The default options to pass to the compiler service - * - * @note This would be a constant if PHP allowed it - */ - private static $DEFAULT_OPTIONS = array( - 'output_format' => 'text', - 'compilation_level' => 'SIMPLE_OPTIMIZATIONS' - ); - - /** - * @var string $url URL of compiler server. defaults to Google's - */ - protected $serviceUrl = 'http://closure-compiler.appspot.com/compile'; - - /** - * @var int $maxBytes The maximum JS size that can be sent to the compiler server in bytes - */ - protected $maxBytes = self::DEFAULT_MAX_BYTES; - - /** - * @var string[] $additionalOptions Additional options to pass to the compiler service - */ - protected $additionalOptions = array(); - - /** - * @var callable Function to minify JS if service fails. Default is JSMin - */ - protected $fallbackMinifier = array('JSMin', 'minify'); - - /** - * Minify JavaScript code via HTTP request to a Closure Compiler API - * - * @param string $js input code - * @param array $options Options passed to __construct(). @see __construct - * - * @return string - */ - public static function minify($js, array $options = array()) - { - $obj = new self($options); - return $obj->min($js); - } - - /** - * @param array $options Options with keys available below: - * - * fallbackFunc : (callable) function to minify if service unavailable. Default is JSMin. - * - * compilerUrl : (string) URL to closure compiler server - * - * maxBytes : (int) The maximum amount of bytes to be sent as js_code in the POST request. - * Defaults to 200000. - * - * additionalParams : (string[]) Additional parameters to pass to the compiler server. Can be anything named - * in https://developers.google.com/closure/compiler/docs/api-ref except for js_code and - * output_info - */ - public function __construct(array $options = array()) - { - if (isset($options[self::OPTION_FALLBACK_FUNCTION])) { - $this->fallbackMinifier = $options[self::OPTION_FALLBACK_FUNCTION]; - } - if (isset($options[self::OPTION_COMPILER_URL])) { - $this->serviceUrl = $options[self::OPTION_COMPILER_URL]; - } - if (isset($options[self::OPTION_ADDITIONAL_OPTIONS]) && is_array($options[self::OPTION_ADDITIONAL_OPTIONS])) { - $this->additionalOptions = $options[self::OPTION_ADDITIONAL_OPTIONS]; - } - if (isset($options[self::OPTION_MAX_BYTES])) { - $this->maxBytes = (int) $options[self::OPTION_MAX_BYTES]; - } - } - - /** - * Call the service to perform the minification - * - * @param string $js JavaScript code - * @return string - * @throws Minify_JS_ClosureCompiler_Exception - */ - public function min($js) - { - $postBody = $this->buildPostBody($js); - - if ($this->maxBytes > 0) { - $bytes = (function_exists('mb_strlen') && ((int)ini_get('mbstring.func_overload') & 2)) - ? mb_strlen($postBody, '8bit') - : strlen($postBody); - if ($bytes > $this->maxBytes) { - throw new Minify_JS_ClosureCompiler_Exception( - 'POST content larger than ' . $this->maxBytes . ' bytes' - ); - } - } - - $response = $this->getResponse($postBody); - - if (preg_match('/^Error\(\d\d?\):/', $response)) { - if (is_callable($this->fallbackMinifier)) { - // use fallback - $response = "/* Received errors from Closure Compiler API:\n$response" - . "\n(Using fallback minifier)\n*/\n"; - $response .= call_user_func($this->fallbackMinifier, $js); - } else { - throw new Minify_JS_ClosureCompiler_Exception($response); - } - } - - if ($response === '') { - $errors = $this->getResponse($this->buildPostBody($js, true)); - throw new Minify_JS_ClosureCompiler_Exception($errors); - } - - return $response; - } - - /** - * Get the response for a given POST body - * - * @param string $postBody - * @return string - * @throws Minify_JS_ClosureCompiler_Exception - */ - protected function getResponse($postBody) - { - $allowUrlFopen = preg_match('/1|yes|on|true/i', ini_get('allow_url_fopen')); - - if ($allowUrlFopen) { - $contents = file_get_contents($this->serviceUrl, false, stream_context_create(array( - 'http' => array( - 'method' => 'POST', - 'header' => "Content-type: application/x-www-form-urlencoded\r\nConnection: close\r\n", - 'content' => $postBody, - 'max_redirects' => 0, - 'timeout' => 15, - ) - ))); - } elseif (defined('CURLOPT_POST')) { - $ch = curl_init($this->serviceUrl); - curl_setopt($ch, CURLOPT_POST, true); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/x-www-form-urlencoded')); - curl_setopt($ch, CURLOPT_POSTFIELDS, $postBody); - curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); - curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15); - $contents = curl_exec($ch); - curl_close($ch); - } else { - throw new Minify_JS_ClosureCompiler_Exception( - "Could not make HTTP request: allow_url_open is false and cURL not available" - ); - } - - if (false === $contents) { - throw new Minify_JS_ClosureCompiler_Exception( - "No HTTP response from server" - ); - } - - return trim($contents); - } - - /** - * Build a POST request body - * - * @param string $js JavaScript code - * @param bool $returnErrors - * @return string - */ - protected function buildPostBody($js, $returnErrors = false) - { - return http_build_query( - array_merge( - self::$DEFAULT_OPTIONS, - $this->additionalOptions, - array( - 'js_code' => $js, - 'output_info' => ($returnErrors ? 'errors' : 'compiled_code') - ) - ), - null, - '&' - ); - } -} - -class Minify_JS_ClosureCompiler_Exception extends Exception {} diff --git a/vendor/mrclay/minify/min/lib/Minify/Lines.php b/vendor/mrclay/minify/min/lib/Minify/Lines.php deleted file mode 100644 index e999a6c2b..000000000 --- a/vendor/mrclay/minify/min/lib/Minify/Lines.php +++ /dev/null @@ -1,143 +0,0 @@ - - * @author Adam Pedersen (Issue 55 fix) - */ -class Minify_Lines { - - /** - * Add line numbers in C-style comments - * - * This uses a very basic parser easily fooled by comment tokens inside - * strings or regexes, but, otherwise, generally clean code will not be - * mangled. URI rewriting can also be performed. - * - * @param string $content - * - * @param array $options available options: - * - * 'id': (optional) string to identify file. E.g. file name/path - * - * 'currentDir': (default null) if given, this is assumed to be the - * directory of the current CSS file. Using this, minify will rewrite - * all relative URIs in import/url declarations to correctly point to - * the desired files, and prepend a comment with debugging information about - * this process. - * - * @return string - */ - public static function minify($content, $options = array()) - { - $id = (isset($options['id']) && $options['id']) - ? $options['id'] - : ''; - $content = str_replace("\r\n", "\n", $content); - - // Hackily rewrite strings with XPath expressions that are - // likely to throw off our dumb parser (for Prototype 1.6.1). - $content = str_replace('"/*"', '"/"+"*"', $content); - $content = preg_replace('@([\'"])(\\.?//?)\\*@', '$1$2$1+$1*', $content); - - $lines = explode("\n", $content); - $numLines = count($lines); - // determine left padding - $padTo = strlen((string) $numLines); // e.g. 103 lines = 3 digits - $inComment = false; - $i = 0; - $newLines = array(); - while (null !== ($line = array_shift($lines))) { - if (('' !== $id) && (0 == $i % 50)) { - if ($inComment) { - array_push($newLines, '', "/* {$id} *|", ''); - } else { - array_push($newLines, '', "/* {$id} */", ''); - } - } - ++$i; - $newLines[] = self::_addNote($line, $i, $inComment, $padTo); - $inComment = self::_eolInComment($line, $inComment); - } - $content = implode("\n", $newLines) . "\n"; - - // check for desired URI rewriting - if (isset($options['currentDir'])) { - Minify_CSS_UriRewriter::$debugText = ''; - $content = Minify_CSS_UriRewriter::rewrite( - $content - ,$options['currentDir'] - ,isset($options['docRoot']) ? $options['docRoot'] : $_SERVER['DOCUMENT_ROOT'] - ,isset($options['symlinks']) ? $options['symlinks'] : array() - ); - $content = "/* Minify_CSS_UriRewriter::\$debugText\n\n" - . Minify_CSS_UriRewriter::$debugText . "*/\n" - . $content; - } - - return $content; - } - - /** - * Is the parser within a C-style comment at the end of this line? - * - * @param string $line current line of code - * - * @param bool $inComment was the parser in a comment at the - * beginning of the line? - * - * @return bool - */ - private static function _eolInComment($line, $inComment) - { - // crude way to avoid things like // */ - $line = preg_replace('~//.*?(\\*/|/\\*).*~', '', $line); - - while (strlen($line)) { - $search = $inComment - ? '*/' - : '/*'; - $pos = strpos($line, $search); - if (false === $pos) { - return $inComment; - } else { - if ($pos == 0 - || ($inComment - ? substr($line, $pos, 3) - : substr($line, $pos-1, 3)) != '*/*') - { - $inComment = ! $inComment; - } - $line = substr($line, $pos + 2); - } - } - return $inComment; - } - - /** - * Prepend a comment (or note) to the given line - * - * @param string $line current line of code - * - * @param string $note content of note/comment - * - * @param bool $inComment was the parser in a comment at the - * beginning of the line? - * - * @param int $padTo minimum width of comment - * - * @return string - */ - private static function _addNote($line, $note, $inComment, $padTo) - { - return $inComment - ? '/* ' . str_pad($note, $padTo, ' ', STR_PAD_RIGHT) . ' *| ' . $line - : '/* ' . str_pad($note, $padTo, ' ', STR_PAD_RIGHT) . ' */ ' . $line; - } -} diff --git a/vendor/mrclay/minify/min/lib/Minify/Loader.php b/vendor/mrclay/minify/min/lib/Minify/Loader.php deleted file mode 100644 index 0a225c056..000000000 --- a/vendor/mrclay/minify/min/lib/Minify/Loader.php +++ /dev/null @@ -1,28 +0,0 @@ - - */ -class Minify_Loader { - public function loadClass($class) - { - $file = dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR; - $file .= strtr($class, "\\_", DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR) . '.php'; - if (is_readable($file)) { - require $file; - } - } - - static public function register() - { - $inst = new self(); - spl_autoload_register(array($inst, 'loadClass')); - } -} diff --git a/vendor/mrclay/minify/min/lib/Minify/Logger.php b/vendor/mrclay/minify/min/lib/Minify/Logger.php deleted file mode 100644 index 8eb72f452..000000000 --- a/vendor/mrclay/minify/min/lib/Minify/Logger.php +++ /dev/null @@ -1,47 +0,0 @@ - - * - * @todo lose this singleton! pass log object in Minify::serve and distribute to others - */ -class Minify_Logger { - - /** - * Set logger object. - * - * The object should have a method "log" that accepts a value as 1st argument and - * an optional string label as the 2nd. - * - * @param mixed $obj or a "falsey" value to disable - * @return null - */ - public static function setLogger($obj = null) { - self::$_logger = $obj - ? $obj - : null; - } - - /** - * Pass a message to the logger (if set) - * - * @param string $msg message to log - * @return null - */ - public static function log($msg, $label = 'Minify') { - if (! self::$_logger) return; - self::$_logger->log($msg, $label); - } - - /** - * @var mixed logger object (like FirePHP) or null (i.e. no logger available) - */ - private static $_logger = null; -} diff --git a/vendor/mrclay/minify/min/lib/Minify/Packer.php b/vendor/mrclay/minify/min/lib/Minify/Packer.php deleted file mode 100644 index 949c3eef0..000000000 --- a/vendor/mrclay/minify/min/lib/Minify/Packer.php +++ /dev/null @@ -1,37 +0,0 @@ -pack()); - } -} diff --git a/vendor/mrclay/minify/min/lib/Minify/Source.php b/vendor/mrclay/minify/min/lib/Minify/Source.php deleted file mode 100644 index 5a85d10d0..000000000 --- a/vendor/mrclay/minify/min/lib/Minify/Source.php +++ /dev/null @@ -1,187 +0,0 @@ - - */ -class Minify_Source { - - /** - * @var int time of last modification - */ - public $lastModified = null; - - /** - * @var callback minifier function specifically for this source. - */ - public $minifier = null; - - /** - * @var array minification options specific to this source. - */ - public $minifyOptions = null; - - /** - * @var string full path of file - */ - public $filepath = null; - - /** - * @var string HTTP Content Type (Minify requires one of the constants Minify::TYPE_*) - */ - public $contentType = null; - - /** - * Create a Minify_Source - * - * In the $spec array(), you can either provide a 'filepath' to an existing - * file (existence will not be checked!) or give 'id' (unique string for - * the content), 'content' (the string content) and 'lastModified' - * (unixtime of last update). - * - * As a shortcut, the controller will replace "//" at the beginning - * of a filepath with $_SERVER['DOCUMENT_ROOT'] . '/'. - * - * @param array $spec options - */ - public function __construct($spec) - { - if (isset($spec['filepath'])) { - if (0 === strpos($spec['filepath'], '//')) { - $spec['filepath'] = $_SERVER['DOCUMENT_ROOT'] . substr($spec['filepath'], 1); - } - $segments = explode('.', $spec['filepath']); - $ext = strtolower(array_pop($segments)); - switch ($ext) { - case 'js' : $this->contentType = 'application/x-javascript'; - break; - case 'css' : $this->contentType = 'text/css'; - break; - case 'htm' : // fallthrough - case 'html' : $this->contentType = 'text/html'; - break; - } - $this->filepath = $spec['filepath']; - $this->_id = $spec['filepath']; - $this->lastModified = filemtime($spec['filepath']) - // offset for Windows uploaders with out of sync clocks - + round(Minify::$uploaderHoursBehind * 3600); - } elseif (isset($spec['id'])) { - $this->_id = 'id::' . $spec['id']; - if (isset($spec['content'])) { - $this->_content = $spec['content']; - } else { - $this->_getContentFunc = $spec['getContentFunc']; - } - $this->lastModified = isset($spec['lastModified']) - ? $spec['lastModified'] - : time(); - } - if (isset($spec['contentType'])) { - $this->contentType = $spec['contentType']; - } - if (isset($spec['minifier'])) { - $this->minifier = $spec['minifier']; - } - if (isset($spec['minifyOptions'])) { - $this->minifyOptions = $spec['minifyOptions']; - } - } - - /** - * Get content - * - * @return string - */ - public function getContent() - { - $content = (null !== $this->filepath) - ? file_get_contents($this->filepath) - : ((null !== $this->_content) - ? $this->_content - : call_user_func($this->_getContentFunc, $this->_id) - ); - // remove UTF-8 BOM if present - return (pack("CCC",0xef,0xbb,0xbf) === substr($content, 0, 3)) - ? substr($content, 3) - : $content; - } - - /** - * Get id - * - * @return string - */ - public function getId() - { - return $this->_id; - } - - /** - * Verifies a single minification call can handle all sources - * - * @param array $sources Minify_Source instances - * - * @return bool true iff there no sources with specific minifier preferences. - */ - public static function haveNoMinifyPrefs($sources) - { - foreach ($sources as $source) { - if (null !== $source->minifier - || null !== $source->minifyOptions) { - return false; - } - } - return true; - } - - /** - * Get unique string for a set of sources - * - * @param array $sources Minify_Source instances - * - * @return string - */ - public static function getDigest($sources) - { - foreach ($sources as $source) { - $info[] = array( - $source->_id, $source->minifier, $source->minifyOptions - ); - } - return md5(serialize($info)); - } - - /** - * Get content type from a group of sources - * - * This is called if the user doesn't pass in a 'contentType' options - * - * @param array $sources Minify_Source instances - * - * @return string content type. e.g. 'text/css' - */ - public static function getContentType($sources) - { - foreach ($sources as $source) { - if ($source->contentType !== null) { - return $source->contentType; - } - } - return 'text/plain'; - } - - protected $_content = null; - protected $_getContentFunc = null; - protected $_id = null; -} - diff --git a/vendor/mrclay/minify/min/lib/Minify/YUI/CssCompressor.java b/vendor/mrclay/minify/min/lib/Minify/YUI/CssCompressor.java deleted file mode 100644 index 3fb497a96..000000000 --- a/vendor/mrclay/minify/min/lib/Minify/YUI/CssCompressor.java +++ /dev/null @@ -1,382 +0,0 @@ -/* - * YUI Compressor - * http://developer.yahoo.com/yui/compressor/ - * Author: Julien Lecomte - http://www.julienlecomte.net/ - * Author: Isaac Schlueter - http://foohack.com/ - * Author: Stoyan Stefanov - http://phpied.com/ - * Copyright (c) 2011 Yahoo! Inc. All rights reserved. - * The copyrights embodied in the content of this file are licensed - * by Yahoo! Inc. under the BSD (revised) open source license. - */ -package com.yahoo.platform.yui.compressor; - -import java.io.IOException; -import java.io.Reader; -import java.io.Writer; -import java.util.regex.Pattern; -import java.util.regex.Matcher; -import java.util.ArrayList; - -public class CssCompressor { - - private StringBuffer srcsb = new StringBuffer(); - - public CssCompressor(Reader in) throws IOException { - // Read the stream... - int c; - while ((c = in.read()) != -1) { - srcsb.append((char) c); - } - } - - // Leave data urls alone to increase parse performance. - protected String extractDataUrls(String css, ArrayList preservedTokens) { - - int maxIndex = css.length() - 1; - int appendIndex = 0; - - StringBuffer sb = new StringBuffer(); - - Pattern p = Pattern.compile("url\\(\\s*([\"']?)data\\:"); - Matcher m = p.matcher(css); - - /* - * Since we need to account for non-base64 data urls, we need to handle - * ' and ) being part of the data string. Hence switching to indexOf, - * to determine whether or not we have matching string terminators and - * handling sb appends directly, instead of using matcher.append* methods. - */ - - while (m.find()) { - - int startIndex = m.start() + 4; // "url(".length() - String terminator = m.group(1); // ', " or empty (not quoted) - - if (terminator.length() == 0) { - terminator = ")"; - } - - boolean foundTerminator = false; - - int endIndex = m.end() - 1; - while(foundTerminator == false && endIndex+1 <= maxIndex) { - endIndex = css.indexOf(terminator, endIndex+1); - - if ((endIndex > 0) && (css.charAt(endIndex-1) != '\\')) { - foundTerminator = true; - if (!")".equals(terminator)) { - endIndex = css.indexOf(")", endIndex); - } - } - } - - // Enough searching, start moving stuff over to the buffer - sb.append(css.substring(appendIndex, m.start())); - - if (foundTerminator) { - String token = css.substring(startIndex, endIndex); - token = token.replaceAll("\\s+", ""); - preservedTokens.add(token); - - String preserver = "url(___YUICSSMIN_PRESERVED_TOKEN_" + (preservedTokens.size() - 1) + "___)"; - sb.append(preserver); - - appendIndex = endIndex + 1; - } else { - // No end terminator found, re-add the whole match. Should we throw/warn here? - sb.append(css.substring(m.start(), m.end())); - appendIndex = m.end(); - } - } - - sb.append(css.substring(appendIndex)); - - return sb.toString(); - } - - public void compress(Writer out, int linebreakpos) - throws IOException { - - Pattern p; - Matcher m; - String css = srcsb.toString(); - - int startIndex = 0; - int endIndex = 0; - int i = 0; - int max = 0; - ArrayList preservedTokens = new ArrayList(0); - ArrayList comments = new ArrayList(0); - String token; - int totallen = css.length(); - String placeholder; - - css = this.extractDataUrls(css, preservedTokens); - - StringBuffer sb = new StringBuffer(css); - - // collect all comment blocks... - while ((startIndex = sb.indexOf("/*", startIndex)) >= 0) { - endIndex = sb.indexOf("*/", startIndex + 2); - if (endIndex < 0) { - endIndex = totallen; - } - - token = sb.substring(startIndex + 2, endIndex); - comments.add(token); - sb.replace(startIndex + 2, endIndex, "___YUICSSMIN_PRESERVE_CANDIDATE_COMMENT_" + (comments.size() - 1) + "___"); - startIndex += 2; - } - css = sb.toString(); - - // preserve strings so their content doesn't get accidentally minified - sb = new StringBuffer(); - p = Pattern.compile("(\"([^\\\\\"]|\\\\.|\\\\)*\")|(\'([^\\\\\']|\\\\.|\\\\)*\')"); - m = p.matcher(css); - while (m.find()) { - token = m.group(); - char quote = token.charAt(0); - token = token.substring(1, token.length() - 1); - - // maybe the string contains a comment-like substring? - // one, maybe more? put'em back then - if (token.indexOf("___YUICSSMIN_PRESERVE_CANDIDATE_COMMENT_") >= 0) { - for (i = 0, max = comments.size(); i < max; i += 1) { - token = token.replace("___YUICSSMIN_PRESERVE_CANDIDATE_COMMENT_" + i + "___", comments.get(i).toString()); - } - } - - // minify alpha opacity in filter strings - token = token.replaceAll("(?i)progid:DXImageTransform.Microsoft.Alpha\\(Opacity=", "alpha(opacity="); - - preservedTokens.add(token); - String preserver = quote + "___YUICSSMIN_PRESERVED_TOKEN_" + (preservedTokens.size() - 1) + "___" + quote; - m.appendReplacement(sb, preserver); - } - m.appendTail(sb); - css = sb.toString(); - - - // strings are safe, now wrestle the comments - for (i = 0, max = comments.size(); i < max; i += 1) { - - token = comments.get(i).toString(); - placeholder = "___YUICSSMIN_PRESERVE_CANDIDATE_COMMENT_" + i + "___"; - - // ! in the first position of the comment means preserve - // so push to the preserved tokens while stripping the ! - if (token.startsWith("!")) { - preservedTokens.add(token); - css = css.replace(placeholder, "___YUICSSMIN_PRESERVED_TOKEN_" + (preservedTokens.size() - 1) + "___"); - continue; - } - - // \ in the last position looks like hack for Mac/IE5 - // shorten that to /*\*/ and the next one to /**/ - if (token.endsWith("\\")) { - preservedTokens.add("\\"); - css = css.replace(placeholder, "___YUICSSMIN_PRESERVED_TOKEN_" + (preservedTokens.size() - 1) + "___"); - i = i + 1; // attn: advancing the loop - preservedTokens.add(""); - css = css.replace("___YUICSSMIN_PRESERVE_CANDIDATE_COMMENT_" + i + "___", "___YUICSSMIN_PRESERVED_TOKEN_" + (preservedTokens.size() - 1) + "___"); - continue; - } - - // keep empty comments after child selectors (IE7 hack) - // e.g. html >/**/ body - if (token.length() == 0) { - startIndex = css.indexOf(placeholder); - if (startIndex > 2) { - if (css.charAt(startIndex - 3) == '>') { - preservedTokens.add(""); - css = css.replace(placeholder, "___YUICSSMIN_PRESERVED_TOKEN_" + (preservedTokens.size() - 1) + "___"); - } - } - } - - // in all other cases kill the comment - css = css.replace("/*" + placeholder + "*/", ""); - } - - - // Normalize all whitespace strings to single spaces. Easier to work with that way. - css = css.replaceAll("\\s+", " "); - - // Remove the spaces before the things that should not have spaces before them. - // But, be careful not to turn "p :link {...}" into "p:link{...}" - // Swap out any pseudo-class colons with the token, and then swap back. - sb = new StringBuffer(); - p = Pattern.compile("(^|\\})(([^\\{:])+:)+([^\\{]*\\{)"); - m = p.matcher(css); - while (m.find()) { - String s = m.group(); - s = s.replaceAll(":", "___YUICSSMIN_PSEUDOCLASSCOLON___"); - s = s.replaceAll( "\\\\", "\\\\\\\\" ).replaceAll( "\\$", "\\\\\\$" ); - m.appendReplacement(sb, s); - } - m.appendTail(sb); - css = sb.toString(); - // Remove spaces before the things that should not have spaces before them. - css = css.replaceAll("\\s+([!{};:>+\\(\\)\\],])", "$1"); - // bring back the colon - css = css.replaceAll("___YUICSSMIN_PSEUDOCLASSCOLON___", ":"); - - // retain space for special IE6 cases - css = css.replaceAll(":first\\-(line|letter)(\\{|,)", ":first-$1 $2"); - - // no space after the end of a preserved comment - css = css.replaceAll("\\*/ ", "*/"); - - // If there is a @charset, then only allow one, and push to the top of the file. - css = css.replaceAll("^(.*)(@charset \"[^\"]*\";)", "$2$1"); - css = css.replaceAll("^(\\s*@charset [^;]+;\\s*)+", "$1"); - - // Put the space back in some cases, to support stuff like - // @media screen and (-webkit-min-device-pixel-ratio:0){ - css = css.replaceAll("\\band\\(", "and ("); - - // Remove the spaces after the things that should not have spaces after them. - css = css.replaceAll("([!{}:;>+\\(\\[,])\\s+", "$1"); - - // remove unnecessary semicolons - css = css.replaceAll(";+}", "}"); - - // Replace 0(px,em,%) with 0. - css = css.replaceAll("([\\s:])(0)(px|em|%|in|cm|mm|pc|pt|ex)", "$1$2"); - - // Replace 0 0 0 0; with 0. - css = css.replaceAll(":0 0 0 0(;|})", ":0$1"); - css = css.replaceAll(":0 0 0(;|})", ":0$1"); - css = css.replaceAll(":0 0(;|})", ":0$1"); - - - // Replace background-position:0; with background-position:0 0; - // same for transform-origin - sb = new StringBuffer(); - p = Pattern.compile("(?i)(background-position|transform-origin|webkit-transform-origin|moz-transform-origin|o-transform-origin|ms-transform-origin):0(;|})"); - m = p.matcher(css); - while (m.find()) { - m.appendReplacement(sb, m.group(1).toLowerCase() + ":0 0" + m.group(2)); - } - m.appendTail(sb); - css = sb.toString(); - - // Replace 0.6 to .6, but only when preceded by : or a white-space - css = css.replaceAll("(:|\\s)0+\\.(\\d+)", "$1.$2"); - - // Shorten colors from rgb(51,102,153) to #336699 - // This makes it more likely that it'll get further compressed in the next step. - p = Pattern.compile("rgb\\s*\\(\\s*([0-9,\\s]+)\\s*\\)"); - m = p.matcher(css); - sb = new StringBuffer(); - while (m.find()) { - String[] rgbcolors = m.group(1).split(","); - StringBuffer hexcolor = new StringBuffer("#"); - for (i = 0; i < rgbcolors.length; i++) { - int val = Integer.parseInt(rgbcolors[i]); - if (val < 16) { - hexcolor.append("0"); - } - hexcolor.append(Integer.toHexString(val)); - } - m.appendReplacement(sb, hexcolor.toString()); - } - m.appendTail(sb); - css = sb.toString(); - - // Shorten colors from #AABBCC to #ABC. Note that we want to make sure - // the color is not preceded by either ", " or =. Indeed, the property - // filter: chroma(color="#FFFFFF"); - // would become - // filter: chroma(color="#FFF"); - // which makes the filter break in IE. - // We also want to make sure we're only compressing #AABBCC patterns inside { }, not id selectors ( #FAABAC {} ) - // We also want to avoid compressing invalid values (e.g. #AABBCCD to #ABCD) - p = Pattern.compile("(\\=\\s*?[\"']?)?" + "#([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])" + "(:?\\}|[^0-9a-fA-F{][^{]*?\\})"); - - m = p.matcher(css); - sb = new StringBuffer(); - int index = 0; - - while (m.find(index)) { - - sb.append(css.substring(index, m.start())); - - boolean isFilter = (m.group(1) != null && !"".equals(m.group(1))); - - if (isFilter) { - // Restore, as is. Compression will break filters - sb.append(m.group(1) + "#" + m.group(2) + m.group(3) + m.group(4) + m.group(5) + m.group(6) + m.group(7)); - } else { - if( m.group(2).equalsIgnoreCase(m.group(3)) && - m.group(4).equalsIgnoreCase(m.group(5)) && - m.group(6).equalsIgnoreCase(m.group(7))) { - - // #AABBCC pattern - sb.append("#" + (m.group(3) + m.group(5) + m.group(7)).toLowerCase()); - - } else { - - // Non-compressible color, restore, but lower case. - sb.append("#" + (m.group(2) + m.group(3) + m.group(4) + m.group(5) + m.group(6) + m.group(7)).toLowerCase()); - } - } - - index = m.end(7); - } - - sb.append(css.substring(index)); - css = sb.toString(); - - // border: none -> border:0 - sb = new StringBuffer(); - p = Pattern.compile("(?i)(border|border-top|border-right|border-bottom|border-right|outline|background):none(;|})"); - m = p.matcher(css); - while (m.find()) { - m.appendReplacement(sb, m.group(1).toLowerCase() + ":0" + m.group(2)); - } - m.appendTail(sb); - css = sb.toString(); - - // shorter opacity IE filter - css = css.replaceAll("(?i)progid:DXImageTransform.Microsoft.Alpha\\(Opacity=", "alpha(opacity="); - - // Remove empty rules. - css = css.replaceAll("[^\\}\\{/;]+\\{\\}", ""); - - // TODO: Should this be after we re-insert tokens. These could alter the break points. However then - // we'd need to make sure we don't break in the middle of a string etc. - if (linebreakpos >= 0) { - // Some source control tools don't like it when files containing lines longer - // than, say 8000 characters, are checked in. The linebreak option is used in - // that case to split long lines after a specific column. - i = 0; - int linestartpos = 0; - sb = new StringBuffer(css); - while (i < sb.length()) { - char c = sb.charAt(i++); - if (c == '}' && i - linestartpos > linebreakpos) { - sb.insert(i, '\n'); - linestartpos = i; - } - } - - css = sb.toString(); - } - - // Replace multiple semi-colons in a row by a single one - // See SF bug #1980989 - css = css.replaceAll(";;+", ";"); - - // restore preserved comments and strings - for(i = 0, max = preservedTokens.size(); i < max; i++) { - css = css.replace("___YUICSSMIN_PRESERVED_TOKEN_" + i + "___", preservedTokens.get(i).toString()); - } - - // Trim the final string (for any leading or trailing white spaces) - css = css.trim(); - - // Write the output... - out.write(css); - } -} diff --git a/vendor/mrclay/minify/min/lib/Minify/YUI/CssCompressor.php b/vendor/mrclay/minify/min/lib/Minify/YUI/CssCompressor.php deleted file mode 100644 index ae3443d44..000000000 --- a/vendor/mrclay/minify/min/lib/Minify/YUI/CssCompressor.php +++ /dev/null @@ -1,171 +0,0 @@ -+\\(\\)\\],])@", "$1", $css); - $css = str_replace("___PSEUDOCLASSCOLON___", ":", $css); - - // Remove the spaces after the things that should not have spaces after them. - $css = preg_replace("@([!{}:;>+\\(\\[,])\\s+@", "$1", $css); - - // Add the semicolon where it's missing. - $css = preg_replace("@([^;\\}])}@", "$1;}", $css); - - // Replace 0(px,em,%) with 0. - $css = preg_replace("@([\\s:])(0)(px|em|%|in|cm|mm|pc|pt|ex)@", "$1$2", $css); - - // Replace 0 0 0 0; with 0. - $css = str_replace(":0 0 0 0;", ":0;", $css); - $css = str_replace(":0 0 0;", ":0;", $css); - $css = str_replace(":0 0;", ":0;", $css); - - // Replace background-position:0; with background-position:0 0; - $css = str_replace("background-position:0;", "background-position:0 0;", $css); - - // Replace 0.6 to .6, but only when preceded by : or a white-space - $css = preg_replace("@(:|\\s)0+\\.(\\d+)@", "$1.$2", $css); - - // Shorten colors from rgb(51,102,153) to #336699 - // This makes it more likely that it'll get further compressed in the next step. - $css = preg_replace_callback("@rgb\\s*\\(\\s*([0-9,\\s]+)\\s*\\)@", array($this, '_shortenRgbCB'), $css); - - // Shorten colors from #AABBCC to #ABC. Note that we want to make sure - // the color is not preceded by either ", " or =. Indeed, the property - // filter: chroma(color="#FFFFFF"); - // would become - // filter: chroma(color="#FFF"); - // which makes the filter break in IE. - $css = preg_replace_callback("@([^\"'=\\s])(\\s*)#([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])([0-9a-fA-F])@", array($this, '_shortenHexCB'), $css); - - // Remove empty rules. - $css = preg_replace("@[^\\}]+\\{;\\}@", "", $css); - - $linebreakpos = isset($this->_options['linebreakpos']) - ? $this->_options['linebreakpos'] - : 0; - - if ($linebreakpos > 0) { - // Some source control tools don't like it when files containing lines longer - // than, say 8000 characters, are checked in. The linebreak option is used in - // that case to split long lines after a specific column. - $i = 0; - $linestartpos = 0; - $sb = $css; - - // make sure strlen returns byte count - $mbIntEnc = null; - if (function_exists('mb_strlen') && ((int)ini_get('mbstring.func_overload') & 2)) { - $mbIntEnc = mb_internal_encoding(); - mb_internal_encoding('8bit'); - } - $sbLength = strlen($css); - while ($i < $sbLength) { - $c = $sb[$i++]; - if ($c === '}' && $i - $linestartpos > $linebreakpos) { - $sb = substr_replace($sb, "\n", $i, 0); - $sbLength++; - $linestartpos = $i; - } - } - $css = $sb; - - // undo potential mb_encoding change - if ($mbIntEnc !== null) { - mb_internal_encoding($mbIntEnc); - } - } - - // Replace the pseudo class for the Box Model Hack - $css = str_replace("___PSEUDOCLASSBMH___", "\"\\\\\"}\\\\\"\"", $css); - - // Replace multiple semi-colons in a row by a single one - // See SF bug #1980989 - $css = preg_replace("@;;+@", ";", $css); - - // prevent triggering IE6 bug: http://www.crankygeek.com/ie6pebug/ - $css = preg_replace('/:first-l(etter|ine)\\{/', ':first-l$1 {', $css); - - // Trim the final string (for any leading or trailing white spaces) - $css = trim($css); - - return $css; - } - - protected function _removeSpacesCB($m) - { - return str_replace(':', '___PSEUDOCLASSCOLON___', $m[0]); - } - - protected function _shortenRgbCB($m) - { - $rgbcolors = explode(',', $m[1]); - $hexcolor = '#'; - for ($i = 0; $i < count($rgbcolors); $i++) { - $val = round($rgbcolors[$i]); - if ($val < 16) { - $hexcolor .= '0'; - } - $hexcolor .= dechex($val); - } - return $hexcolor; - } - - protected function _shortenHexCB($m) - { - // Test for AABBCC pattern - if ((strtolower($m[3])===strtolower($m[4])) && - (strtolower($m[5])===strtolower($m[6])) && - (strtolower($m[7])===strtolower($m[8]))) { - return $m[1] . $m[2] . "#" . $m[3] . $m[5] . $m[7]; - } else { - return $m[0]; - } - } -} \ No newline at end of file diff --git a/vendor/mrclay/minify/min/lib/Minify/YUICompressor.php b/vendor/mrclay/minify/min/lib/Minify/YUICompressor.php deleted file mode 100644 index 5762e890c..000000000 --- a/vendor/mrclay/minify/min/lib/Minify/YUICompressor.php +++ /dev/null @@ -1,156 +0,0 @@ - - * Minify_YUICompressor::$jarFile = '/path/to/yuicompressor-2.4.6.jar'; - * Minify_YUICompressor::$tempDir = '/tmp'; - * $code = Minify_YUICompressor::minifyJs( - * $code - * ,array('nomunge' => true, 'line-break' => 1000) - * ); - * - * - * Note: In case you run out stack (default is 512k), you may increase stack size in $options: - * array('stack-size' => '2048k') - * - * @todo unit tests, $options docs - * - * @package Minify - * @author Stephen Clay - */ -class Minify_YUICompressor { - - /** - * Filepath of the YUI Compressor jar file. This must be set before - * calling minifyJs() or minifyCss(). - * - * @var string - */ - public static $jarFile = null; - - /** - * Writable temp directory. This must be set before calling minifyJs() - * or minifyCss(). - * - * @var string - */ - public static $tempDir = null; - - /** - * Filepath of "java" executable (may be needed if not in shell's PATH) - * - * @var string - */ - public static $javaExecutable = 'java'; - - /** - * Minify a Javascript string - * - * @param string $js - * - * @param array $options (verbose is ignored) - * - * @see http://www.julienlecomte.net/yuicompressor/README - * - * @return string - */ - public static function minifyJs($js, $options = array()) - { - return self::_minify('js', $js, $options); - } - - /** - * Minify a CSS string - * - * @param string $css - * - * @param array $options (verbose is ignored) - * - * @see http://www.julienlecomte.net/yuicompressor/README - * - * @return string - */ - public static function minifyCss($css, $options = array()) - { - return self::_minify('css', $css, $options); - } - - private static function _minify($type, $content, $options) - { - self::_prepare(); - if (! ($tmpFile = tempnam(self::$tempDir, 'yuic_'))) { - throw new Exception('Minify_YUICompressor : could not create temp file in "'.self::$tempDir.'".'); - } - file_put_contents($tmpFile, $content); - exec(self::_getCmd($options, $type, $tmpFile), $output, $result_code); - unlink($tmpFile); - if ($result_code != 0) { - throw new Exception('Minify_YUICompressor : YUI compressor execution failed.'); - } - return implode("\n", $output); - } - - private static function _getCmd($userOptions, $type, $tmpFile) - { - $o = array_merge( - array( - 'charset' => '' - ,'line-break' => 5000 - ,'type' => $type - ,'nomunge' => false - ,'preserve-semi' => false - ,'disable-optimizations' => false - ,'stack-size' => '' - ) - ,$userOptions - ); - $cmd = self::$javaExecutable - . (!empty($o['stack-size']) - ? ' -Xss' . $o['stack-size'] - : '') - . ' -jar ' . escapeshellarg(self::$jarFile) - . " --type {$type}" - . (preg_match('/^[\\da-zA-Z0-9\\-]+$/', $o['charset']) - ? " --charset {$o['charset']}" - : '') - . (is_numeric($o['line-break']) && $o['line-break'] >= 0 - ? ' --line-break ' . (int)$o['line-break'] - : ''); - if ($type === 'js') { - foreach (array('nomunge', 'preserve-semi', 'disable-optimizations') as $opt) { - $cmd .= $o[$opt] - ? " --{$opt}" - : ''; - } - } - return $cmd . ' ' . escapeshellarg($tmpFile); - } - - private static function _prepare() - { - if (! is_file(self::$jarFile)) { - throw new Exception('Minify_YUICompressor : $jarFile('.self::$jarFile.') is not a valid file.'); - } - if (! is_readable(self::$jarFile)) { - throw new Exception('Minify_YUICompressor : $jarFile('.self::$jarFile.') is not readable.'); - } - if (! is_dir(self::$tempDir)) { - throw new Exception('Minify_YUICompressor : $tempDir('.self::$tempDir.') is not a valid direcotry.'); - } - if (! is_writable(self::$tempDir)) { - throw new Exception('Minify_YUICompressor : $tempDir('.self::$tempDir.') is not writable.'); - } - } -} - diff --git a/vendor/mrclay/minify/min/lib/MrClay/Cli.php b/vendor/mrclay/minify/min/lib/MrClay/Cli.php deleted file mode 100644 index 9aa8e06f2..000000000 --- a/vendor/mrclay/minify/min/lib/MrClay/Cli.php +++ /dev/null @@ -1,384 +0,0 @@ -values. - * - * You may also specify that some arguments be used to provide input/output. By communicating - * solely through the file pointers provided by openInput()/openOutput(), you can make your - * app more flexible to end users. - * - * @author Steve Clay - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -class Cli { - - /** - * @var array validation errors - */ - public $errors = array(); - - /** - * @var array option values available after validation. - * - * E.g. array( - * 'a' => false // option was missing - * ,'b' => true // option was present - * ,'c' => "Hello" // option had value - * ,'f' => "/home/user/file" // file path from root - * ,'f.raw' => "~/file" // file path as given to option - * ) - */ - public $values = array(); - - /** - * @var array - */ - public $moreArgs = array(); - - /** - * @var array - */ - public $debug = array(); - - /** - * @var bool The user wants help info - */ - public $isHelpRequest = false; - - /** - * @var Arg[] - */ - protected $_args = array(); - - /** - * @var resource - */ - protected $_stdin = null; - - /** - * @var resource - */ - protected $_stdout = null; - - /** - * @param bool $exitIfNoStdin (default true) Exit() if STDIN is not defined - */ - public function __construct($exitIfNoStdin = true) - { - if ($exitIfNoStdin && ! defined('STDIN')) { - exit('This script is for command-line use only.'); - } - if (isset($GLOBALS['argv'][1]) - && ($GLOBALS['argv'][1] === '-?' || $GLOBALS['argv'][1] === '--help')) { - $this->isHelpRequest = true; - } - } - - /** - * @param Arg|string $letter - * @return Arg - */ - public function addOptionalArg($letter) - { - return $this->addArgument($letter, false); - } - - /** - * @param Arg|string $letter - * @return Arg - */ - public function addRequiredArg($letter) - { - return $this->addArgument($letter, true); - } - - /** - * @param string $letter - * @param bool $required - * @param Arg|null $arg - * @return Arg - * @throws InvalidArgumentException - */ - public function addArgument($letter, $required, Arg $arg = null) - { - if (! preg_match('/^[a-zA-Z]$/', $letter)) { - throw new InvalidArgumentException('$letter must be in [a-zA-Z]'); - } - if (! $arg) { - $arg = new Arg($required); - } - $this->_args[$letter] = $arg; - return $arg; - } - - /** - * @param string $letter - * @return Arg|null - */ - public function getArgument($letter) - { - return isset($this->_args[$letter]) ? $this->_args[$letter] : null; - } - - /* - * Read and validate options - * - * @return bool true if all options are valid - */ - public function validate() - { - $options = ''; - $this->errors = array(); - $this->values = array(); - $this->_stdin = null; - - if ($this->isHelpRequest) { - return false; - } - - $lettersUsed = ''; - foreach ($this->_args as $letter => $arg) { - /* @var Arg $arg */ - $options .= $letter; - $lettersUsed .= $letter; - - if ($arg->mayHaveValue || $arg->mustHaveValue) { - $options .= ($arg->mustHaveValue ? ':' : '::'); - } - } - - $this->debug['argv'] = $GLOBALS['argv']; - $argvCopy = array_slice($GLOBALS['argv'], 1); - $o = getopt($options); - $this->debug['getopt_options'] = $options; - $this->debug['getopt_return'] = $o; - - foreach ($this->_args as $letter => $arg) { - /* @var Arg $arg */ - $this->values[$letter] = false; - if (isset($o[$letter])) { - if (is_bool($o[$letter])) { - - // remove from argv copy - $k = array_search("-$letter", $argvCopy); - if ($k !== false) { - array_splice($argvCopy, $k, 1); - } - - if ($arg->mustHaveValue) { - $this->addError($letter, "Missing value"); - } else { - $this->values[$letter] = true; - } - } else { - // string - $this->values[$letter] = $o[$letter]; - $v =& $this->values[$letter]; - - // remove from argv copy - // first look for -ovalue or -o=value - $pattern = "/^-{$letter}=?" . preg_quote($v, '/') . "$/"; - $foundInArgv = false; - foreach ($argvCopy as $k => $argV) { - if (preg_match($pattern, $argV)) { - array_splice($argvCopy, $k, 1); - $foundInArgv = true; - break; - } - } - if (! $foundInArgv) { - // space separated - $k = array_search("-$letter", $argvCopy); - if ($k !== false) { - array_splice($argvCopy, $k, 2); - } - } - - // check that value isn't really another option - if (strlen($lettersUsed) > 1) { - $pattern = "/^-[" . str_replace($letter, '', $lettersUsed) . "]/i"; - if (preg_match($pattern, $v)) { - $this->addError($letter, "Value was read as another option: %s", $v); - return false; - } - } - if ($arg->assertFile || $arg->assertDir) { - if ($v[0] !== '/' && $v[0] !== '~') { - $this->values["$letter.raw"] = $v; - $v = getcwd() . "/$v"; - } - } - if ($arg->assertFile) { - if ($arg->useAsInfile) { - $this->_stdin = $v; - } elseif ($arg->useAsOutfile) { - $this->_stdout = $v; - } - if ($arg->assertReadable && ! is_readable($v)) { - $this->addError($letter, "File not readable: %s", $v); - continue; - } - if ($arg->assertWritable) { - if (is_file($v)) { - if (! is_writable($v)) { - $this->addError($letter, "File not writable: %s", $v); - } - } else { - if (! is_writable(dirname($v))) { - $this->addError($letter, "Directory not writable: %s", dirname($v)); - } - } - } - } elseif ($arg->assertDir && $arg->assertWritable && ! is_writable($v)) { - $this->addError($letter, "Directory not readable: %s", $v); - } - } - } else { - if ($arg->isRequired()) { - $this->addError($letter, "Missing"); - } - } - } - $this->moreArgs = $argvCopy; - reset($this->moreArgs); - return empty($this->errors); - } - - /** - * Get the full paths of file(s) passed in as unspecified arguments - * - * @return array - */ - public function getPathArgs() - { - $r = $this->moreArgs; - foreach ($r as $k => $v) { - if ($v[0] !== '/' && $v[0] !== '~') { - $v = getcwd() . "/$v"; - $v = str_replace('/./', '/', $v); - do { - $v = preg_replace('@/[^/]+/\\.\\./@', '/', $v, 1, $changed); - } while ($changed); - $r[$k] = $v; - } - } - return $r; - } - - /** - * Get a short list of errors with options - * - * @return string - */ - public function getErrorReport() - { - if (empty($this->errors)) { - return ''; - } - $r = "Some arguments did not pass validation:\n"; - foreach ($this->errors as $letter => $arr) { - $r .= " $letter : " . implode(', ', $arr) . "\n"; - } - $r .= "\n"; - return $r; - } - - /** - * @return string - */ - public function getArgumentsListing() - { - $r = "\n"; - foreach ($this->_args as $letter => $arg) { - /* @var Arg $arg */ - $desc = $arg->getDescription(); - $flag = " -$letter "; - if ($arg->mayHaveValue) { - $flag .= "[VAL]"; - } elseif ($arg->mustHaveValue) { - $flag .= "VAL"; - } - if ($arg->assertFile) { - $flag = str_replace('VAL', 'FILE', $flag); - } elseif ($arg->assertDir) { - $flag = str_replace('VAL', 'DIR', $flag); - } - if ($arg->isRequired()) { - $desc = "(required) $desc"; - } - $flag = str_pad($flag, 12, " ", STR_PAD_RIGHT); - $desc = wordwrap($desc, 70); - $r .= $flag . str_replace("\n", "\n ", $desc) . "\n\n"; - } - return $r; - } - - /** - * Get resource of open input stream. May be STDIN or a file pointer - * to the file specified by an option with 'STDIN'. - * - * @return resource - */ - public function openInput() - { - if (null === $this->_stdin) { - return STDIN; - } else { - $this->_stdin = fopen($this->_stdin, 'rb'); - return $this->_stdin; - } - } - - public function closeInput() - { - if (null !== $this->_stdin) { - fclose($this->_stdin); - } - } - - /** - * Get resource of open output stream. May be STDOUT or a file pointer - * to the file specified by an option with 'STDOUT'. The file will be - * truncated to 0 bytes on opening. - * - * @return resource - */ - public function openOutput() - { - if (null === $this->_stdout) { - return STDOUT; - } else { - $this->_stdout = fopen($this->_stdout, 'wb'); - return $this->_stdout; - } - } - - public function closeOutput() - { - if (null !== $this->_stdout) { - fclose($this->_stdout); - } - } - - /** - * @param string $letter - * @param string $msg - * @param string $value - */ - protected function addError($letter, $msg, $value = null) - { - if ($value !== null) { - $value = var_export($value, 1); - } - $this->errors[$letter][] = sprintf($msg, $value); - } -} - diff --git a/vendor/mrclay/minify/min/lib/MrClay/Cli/Arg.php b/vendor/mrclay/minify/min/lib/MrClay/Cli/Arg.php deleted file mode 100644 index 5fa593273..000000000 --- a/vendor/mrclay/minify/min/lib/MrClay/Cli/Arg.php +++ /dev/null @@ -1,183 +0,0 @@ -values['f.raw'] - * - * Use assertReadable()/assertWritable() to cause the validator to test the file/dir for - * read/write permissions respectively. - * - * @method \MrClay\Cli\Arg mayHaveValue() Assert that the argument, if present, may receive a string value - * @method \MrClay\Cli\Arg mustHaveValue() Assert that the argument, if present, must receive a string value - * @method \MrClay\Cli\Arg assertFile() Assert that the argument's value must specify a file - * @method \MrClay\Cli\Arg assertDir() Assert that the argument's value must specify a directory - * @method \MrClay\Cli\Arg assertReadable() Assert that the specified file/dir must be readable - * @method \MrClay\Cli\Arg assertWritable() Assert that the specified file/dir must be writable - * - * @property-read bool mayHaveValue - * @property-read bool mustHaveValue - * @property-read bool assertFile - * @property-read bool assertDir - * @property-read bool assertReadable - * @property-read bool assertWritable - * @property-read bool useAsInfile - * @property-read bool useAsOutfile - * - * @author Steve Clay - * @license http://www.opensource.org/licenses/mit-license.php MIT License - */ -class Arg { - /** - * @return array - */ - public function getDefaultSpec() - { - return array( - 'mayHaveValue' => false, - 'mustHaveValue' => false, - 'assertFile' => false, - 'assertDir' => false, - 'assertReadable' => false, - 'assertWritable' => false, - 'useAsInfile' => false, - 'useAsOutfile' => false, - ); - } - - /** - * @var array - */ - protected $spec = array(); - - /** - * @var bool - */ - protected $required = false; - - /** - * @var string - */ - protected $description = ''; - - /** - * @param bool $isRequired - */ - public function __construct($isRequired = false) - { - $this->spec = $this->getDefaultSpec(); - $this->required = (bool) $isRequired; - if ($isRequired) { - $this->spec['mustHaveValue'] = true; - } - } - - /** - * Assert that the argument's value points to a writable file. When - * Cli::openOutput() is called, a write pointer to this file will - * be provided. - * @return Arg - */ - public function useAsOutfile() - { - $this->spec['useAsOutfile'] = true; - return $this->assertFile()->assertWritable(); - } - - /** - * Assert that the argument's value points to a readable file. When - * Cli::openInput() is called, a read pointer to this file will - * be provided. - * @return Arg - */ - public function useAsInfile() - { - $this->spec['useAsInfile'] = true; - return $this->assertFile()->assertReadable(); - } - - /** - * @return array - */ - public function getSpec() - { - return $this->spec; - } - - /** - * @param string $desc - * @return Arg - */ - public function setDescription($desc) - { - $this->description = $desc; - return $this; - } - - /** - * @return string - */ - public function getDescription() - { - return $this->description; - } - - /** - * @return bool - */ - public function isRequired() - { - return $this->required; - } - - /** - * Note: magic methods declared in class PHPDOC - * - * @param string $name - * @param array $args - * @return Arg - * @throws BadMethodCallException - */ - public function __call($name, array $args = array()) - { - if (array_key_exists($name, $this->spec)) { - $this->spec[$name] = true; - if ($name === 'assertFile' || $name === 'assertDir') { - $this->spec['mustHaveValue'] = true; - } - } else { - throw new BadMethodCallException('Method does not exist'); - } - return $this; - } - - /** - * Note: magic properties declared in class PHPDOC - * - * @param string $name - * @return bool|null - */ - public function __get($name) - { - if (array_key_exists($name, $this->spec)) { - return $this->spec[$name]; - } - return null; - } -} diff --git a/vendor/pimple/pimple/CHANGELOG b/vendor/pimple/pimple/CHANGELOG deleted file mode 100644 index 776a9153e..000000000 --- a/vendor/pimple/pimple/CHANGELOG +++ /dev/null @@ -1,25 +0,0 @@ -* 3.0.0 (2014-07-24) - - * removed the Pimple class alias (use Pimple\Container instead) - -* 2.1.1 (2014-07-24) - - * fixed compiler warnings for the C extension - * fixed code when dealing with circular references - -* 2.1.0 (2014-06-24) - - * moved the Pimple to Pimple\Container (with a BC layer -- Pimple is now a - deprecated alias which will be removed in Pimple 3.0) - * added Pimple\ServiceProviderInterface (and Pimple::register()) - -* 2.0.0 (2014-02-10) - - * changed extend to automatically re-assign the extended service and keep it as shared or factory - (to keep BC, extend still returns the extended service) - * changed services to be shared by default (use factory() for factory - services) - -* 1.0.0 - - * initial version diff --git a/vendor/pimple/pimple/LICENSE b/vendor/pimple/pimple/LICENSE deleted file mode 100644 index 86b4721be..000000000 --- a/vendor/pimple/pimple/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2009-2014 Fabien Potencier - -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/vendor/pimple/pimple/README.rst b/vendor/pimple/pimple/README.rst deleted file mode 100644 index c345b6a11..000000000 --- a/vendor/pimple/pimple/README.rst +++ /dev/null @@ -1,200 +0,0 @@ -Pimple -====== - -.. caution:: - - This is the documentation for Pimple 3.x. If you are using Pimple 1.x, read - the `Pimple 1.x documentation`_. Reading the Pimple 1.x code is also a good - way to learn more about how to create a simple Dependency Injection - Container (recent versions of Pimple are more focused on performance). - -Pimple is a small Dependency Injection Container for PHP. - -Installation ------------- - -Before using Pimple in your project, add it to your ``composer.json`` file: - -.. code-block:: bash - - $ ./composer.phar require pimple/pimple ~3.0 - -Alternatively, Pimple is also available as a PHP C extension: - -.. code-block:: bash - - $ cd ext/pimple - $ phpize - $ ./configure - $ make - $ make install - -Usage ------ - -Creating a container is a matter of creating a ``Container`` instance: - -.. code-block:: php - - use Pimple\Container; - - $container = new Container(); - -As many other dependency injection containers, Pimple manages two different -kind of data: **services** and **parameters**. - -Defining Services -~~~~~~~~~~~~~~~~~ - -A service is an object that does something as part of a larger system. Examples -of services: a database connection, a templating engine, or a mailer. Almost -any **global** object can be a service. - -Services are defined by **anonymous functions** that return an instance of an -object: - -.. code-block:: php - - // define some services - $container['session_storage'] = function ($c) { - return new SessionStorage('SESSION_ID'); - }; - - $container['session'] = function ($c) { - return new Session($c['session_storage']); - }; - -Notice that the anonymous function has access to the current container -instance, allowing references to other services or parameters. - -As objects are only created when you get them, the order of the definitions -does not matter. - -Using the defined services is also very easy: - -.. code-block:: php - - // get the session object - $session = $container['session']; - - // the above call is roughly equivalent to the following code: - // $storage = new SessionStorage('SESSION_ID'); - // $session = new Session($storage); - -Defining Factory Services -~~~~~~~~~~~~~~~~~~~~~~~~~ - -By default, each time you get a service, Pimple returns the **same instance** -of it. If you want a different instance to be returned for all calls, wrap your -anonymous function with the ``factory()`` method - -.. code-block:: php - - $container['session'] = $container->factory(function ($c) { - return new Session($c['session_storage']); - }); - -Now, each call to ``$container['session']`` returns a new instance of the -session. - -Defining Parameters -~~~~~~~~~~~~~~~~~~~ - -Defining a parameter allows to ease the configuration of your container from -the outside and to store global values: - -.. code-block:: php - - // define some parameters - $container['cookie_name'] = 'SESSION_ID'; - $container['session_storage_class'] = 'SessionStorage'; - -If you change the ``session_storage`` service definition like below: - -.. code-block:: php - - $container['session_storage'] = function ($c) { - return new $c['session_storage_class']($c['cookie_name']); - }; - -You can now easily change the cookie name by overriding the -``session_storage_class`` parameter instead of redefining the service -definition. - -Protecting Parameters -~~~~~~~~~~~~~~~~~~~~~ - -Because Pimple sees anonymous functions as service definitions, you need to -wrap anonymous functions with the ``protect()`` method to store them as -parameters: - -.. code-block:: php - - $container['random_func'] = $container->protect(function () { - return rand(); - }); - -Modifying Services after Definition -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -In some cases you may want to modify a service definition after it has been -defined. You can use the ``extend()`` method to define additional code to be -run on your service just after it is created: - -.. code-block:: php - - $container['session_storage'] = function ($c) { - return new $c['session_storage_class']($c['cookie_name']); - }; - - $container->extend('session_storage', function ($storage, $c) { - $storage->...(); - - return $storage; - }; - -The first argument is the name of the service to extend, the second a function -that gets access to the object instance and the container. - -Extending a Container -~~~~~~~~~~~~~~~~~~~~~ - -If you use the same libraries over and over, you might want to reuse some -services from one project to the next one; package your services into a -**provider** by implementing ``Pimple\ServiceProviderInterface``: - -.. code-block:: php - - use Pimple\Container; - - class FooProvider implements Pimple\ServiceProviderInterface - { - public function register(Container $pimple) - { - // register some services and parameters - // on $pimple - } - } - -Then, register the provider on a Container: - -.. code-block:: php - - $pimple->register(new FooProvider()); - -Fetching the Service Creation Function -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -When you access an object, Pimple automatically calls the anonymous function -that you defined, which creates the service object for you. If you want to get -raw access to this function, you can use the ``raw()`` method: - -.. code-block:: php - - $container['session'] = function ($c) { - return new Session($c['session_storage']); - }; - - $sessionFunction = $container->raw('session'); - -.. _Pimple 1.x documentation: https://github.com/fabpot/Pimple/tree/1.1 diff --git a/vendor/pimple/pimple/src/Pimple/Container.php b/vendor/pimple/pimple/src/Pimple/Container.php deleted file mode 100644 index 26edefc9d..000000000 --- a/vendor/pimple/pimple/src/Pimple/Container.php +++ /dev/null @@ -1,281 +0,0 @@ -factories = new \SplObjectStorage(); - $this->protected = new \SplObjectStorage(); - - foreach ($values as $key => $value) { - $this->offsetSet($key, $value); - } - } - - /** - * Sets a parameter or an object. - * - * Objects must be defined as Closures. - * - * Allowing any PHP callable leads to difficult to debug problems - * as function names (strings) are callable (creating a function with - * the same name as an existing parameter would break your container). - * - * @param string $id The unique identifier for the parameter or object - * @param mixed $value The value of the parameter or a closure to define an object - * @throws \RuntimeException Prevent override of a frozen service - */ - public function offsetSet($id, $value) - { - if (isset($this->frozen[$id])) { - throw new \RuntimeException(sprintf('Cannot override frozen service "%s".', $id)); - } - - $this->values[$id] = $value; - $this->keys[$id] = true; - } - - /** - * Gets a parameter or an object. - * - * @param string $id The unique identifier for the parameter or object - * - * @return mixed The value of the parameter or an object - * - * @throws \InvalidArgumentException if the identifier is not defined - */ - public function offsetGet($id) - { - if (!isset($this->keys[$id])) { - throw new \InvalidArgumentException(sprintf('Identifier "%s" is not defined.', $id)); - } - - if ( - isset($this->raw[$id]) - || !is_object($this->values[$id]) - || isset($this->protected[$this->values[$id]]) - || !method_exists($this->values[$id], '__invoke') - ) { - return $this->values[$id]; - } - - if (isset($this->factories[$this->values[$id]])) { - return $this->values[$id]($this); - } - - $raw = $this->values[$id]; - $val = $this->values[$id] = $raw($this); - $this->raw[$id] = $raw; - - $this->frozen[$id] = true; - - return $val; - } - - /** - * Checks if a parameter or an object is set. - * - * @param string $id The unique identifier for the parameter or object - * - * @return bool - */ - public function offsetExists($id) - { - return isset($this->keys[$id]); - } - - /** - * Unsets a parameter or an object. - * - * @param string $id The unique identifier for the parameter or object - */ - public function offsetUnset($id) - { - if (isset($this->keys[$id])) { - if (is_object($this->values[$id])) { - unset($this->factories[$this->values[$id]], $this->protected[$this->values[$id]]); - } - - unset($this->values[$id], $this->frozen[$id], $this->raw[$id], $this->keys[$id]); - } - } - - /** - * Marks a callable as being a factory service. - * - * @param callable $callable A service definition to be used as a factory - * - * @return callable The passed callable - * - * @throws \InvalidArgumentException Service definition has to be a closure of an invokable object - */ - public function factory($callable) - { - if (!is_object($callable) || !method_exists($callable, '__invoke')) { - throw new \InvalidArgumentException('Service definition is not a Closure or invokable object.'); - } - - $this->factories->attach($callable); - - return $callable; - } - - /** - * Protects a callable from being interpreted as a service. - * - * This is useful when you want to store a callable as a parameter. - * - * @param callable $callable A callable to protect from being evaluated - * - * @return callable The passed callable - * - * @throws \InvalidArgumentException Service definition has to be a closure of an invokable object - */ - public function protect($callable) - { - if (!is_object($callable) || !method_exists($callable, '__invoke')) { - throw new \InvalidArgumentException('Callable is not a Closure or invokable object.'); - } - - $this->protected->attach($callable); - - return $callable; - } - - /** - * Gets a parameter or the closure defining an object. - * - * @param string $id The unique identifier for the parameter or object - * - * @return mixed The value of the parameter or the closure defining an object - * - * @throws \InvalidArgumentException if the identifier is not defined - */ - public function raw($id) - { - if (!isset($this->keys[$id])) { - throw new \InvalidArgumentException(sprintf('Identifier "%s" is not defined.', $id)); - } - - if (isset($this->raw[$id])) { - return $this->raw[$id]; - } - - return $this->values[$id]; - } - - /** - * Extends an object definition. - * - * Useful when you want to extend an existing object definition, - * without necessarily loading that object. - * - * @param string $id The unique identifier for the object - * @param callable $callable A service definition to extend the original - * - * @return callable The wrapped callable - * - * @throws \InvalidArgumentException if the identifier is not defined or not a service definition - */ - public function extend($id, $callable) - { - if (!isset($this->keys[$id])) { - throw new \InvalidArgumentException(sprintf('Identifier "%s" is not defined.', $id)); - } - - if (!is_object($this->values[$id]) || !method_exists($this->values[$id], '__invoke')) { - throw new \InvalidArgumentException(sprintf('Identifier "%s" does not contain an object definition.', $id)); - } - - if (!is_object($callable) || !method_exists($callable, '__invoke')) { - throw new \InvalidArgumentException('Extension service definition is not a Closure or invokable object.'); - } - - $factory = $this->values[$id]; - - $extended = function ($c) use ($callable, $factory) { - return $callable($factory($c), $c); - }; - - if (isset($this->factories[$factory])) { - $this->factories->detach($factory); - $this->factories->attach($extended); - } - - return $this[$id] = $extended; - } - - /** - * Returns all defined value names. - * - * @return array An array of value names - */ - public function keys() - { - return array_keys($this->values); - } - - /** - * Registers a service provider. - * - * @param ServiceProviderInterface $provider A ServiceProviderInterface instance - * @param array $values An array of values that customizes the provider - * - * @return static - */ - public function register(ServiceProviderInterface $provider, array $values = array()) - { - $provider->register($this); - - foreach ($values as $key => $value) { - $this[$key] = $value; - } - - return $this; - } -} diff --git a/vendor/pimple/pimple/src/Pimple/ServiceProviderInterface.php b/vendor/pimple/pimple/src/Pimple/ServiceProviderInterface.php deleted file mode 100644 index 9b122bd43..000000000 --- a/vendor/pimple/pimple/src/Pimple/ServiceProviderInterface.php +++ /dev/null @@ -1,46 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console; - -use Symfony\Component\Console\Descriptor\TextDescriptor; -use Symfony\Component\Console\Descriptor\XmlDescriptor; -use Symfony\Component\Console\Helper\QuestionHelper; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\ArgvInput; -use Symfony\Component\Console\Input\ArrayInput; -use Symfony\Component\Console\Input\InputDefinition; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputAwareInterface; -use Symfony\Component\Console\Output\BufferedOutput; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Output\ConsoleOutput; -use Symfony\Component\Console\Output\ConsoleOutputInterface; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Command\HelpCommand; -use Symfony\Component\Console\Command\ListCommand; -use Symfony\Component\Console\Helper\HelperSet; -use Symfony\Component\Console\Helper\FormatterHelper; -use Symfony\Component\Console\Helper\DialogHelper; -use Symfony\Component\Console\Helper\ProgressHelper; -use Symfony\Component\Console\Helper\TableHelper; -use Symfony\Component\Console\Event\ConsoleCommandEvent; -use Symfony\Component\Console\Event\ConsoleExceptionEvent; -use Symfony\Component\Console\Event\ConsoleTerminateEvent; -use Symfony\Component\EventDispatcher\EventDispatcherInterface; - -/** - * An Application is the container for a collection of commands. - * - * It is the main entry point of a Console application. - * - * This class is optimized for a standard CLI environment. - * - * Usage: - * - * $app = new Application('myapp', '1.0 (stable)'); - * $app->add(new SimpleCommand()); - * $app->run(); - * - * @author Fabien Potencier - * - * @api - */ -class Application -{ - private $commands = array(); - private $wantHelps = false; - private $runningCommand; - private $name; - private $version; - private $catchExceptions = true; - private $autoExit = true; - private $definition; - private $helperSet; - private $dispatcher; - private $terminalDimensions; - private $defaultCommand; - - /** - * Constructor. - * - * @param string $name The name of the application - * @param string $version The version of the application - * - * @api - */ - public function __construct($name = 'UNKNOWN', $version = 'UNKNOWN') - { - $this->name = $name; - $this->version = $version; - $this->defaultCommand = 'list'; - $this->helperSet = $this->getDefaultHelperSet(); - $this->definition = $this->getDefaultInputDefinition(); - - foreach ($this->getDefaultCommands() as $command) { - $this->add($command); - } - } - - public function setDispatcher(EventDispatcherInterface $dispatcher) - { - $this->dispatcher = $dispatcher; - } - - /** - * Runs the current application. - * - * @param InputInterface $input An Input instance - * @param OutputInterface $output An Output instance - * - * @return int 0 if everything went fine, or an error code - * - * @throws \Exception When doRun returns Exception - * - * @api - */ - public function run(InputInterface $input = null, OutputInterface $output = null) - { - if (null === $input) { - $input = new ArgvInput(); - } - - if (null === $output) { - $output = new ConsoleOutput(); - } - - $this->configureIO($input, $output); - - try { - $exitCode = $this->doRun($input, $output); - } catch (\Exception $e) { - if (!$this->catchExceptions) { - throw $e; - } - - if ($output instanceof ConsoleOutputInterface) { - $this->renderException($e, $output->getErrorOutput()); - } else { - $this->renderException($e, $output); - } - - $exitCode = $e->getCode(); - if (is_numeric($exitCode)) { - $exitCode = (int) $exitCode; - if (0 === $exitCode) { - $exitCode = 1; - } - } else { - $exitCode = 1; - } - } - - if ($this->autoExit) { - if ($exitCode > 255) { - $exitCode = 255; - } - - exit($exitCode); - } - - return $exitCode; - } - - /** - * Runs the current application. - * - * @param InputInterface $input An Input instance - * @param OutputInterface $output An Output instance - * - * @return int 0 if everything went fine, or an error code - */ - public function doRun(InputInterface $input, OutputInterface $output) - { - if (true === $input->hasParameterOption(array('--version', '-V'))) { - $output->writeln($this->getLongVersion()); - - return 0; - } - - $name = $this->getCommandName($input); - if (true === $input->hasParameterOption(array('--help', '-h'))) { - if (!$name) { - $name = 'help'; - $input = new ArrayInput(array('command' => 'help')); - } else { - $this->wantHelps = true; - } - } - - if (!$name) { - $name = $this->defaultCommand; - $input = new ArrayInput(array('command' => $this->defaultCommand)); - } - - // the command name MUST be the first element of the input - $command = $this->find($name); - - $this->runningCommand = $command; - $exitCode = $this->doRunCommand($command, $input, $output); - $this->runningCommand = null; - - return $exitCode; - } - - /** - * Set a helper set to be used with the command. - * - * @param HelperSet $helperSet The helper set - * - * @api - */ - public function setHelperSet(HelperSet $helperSet) - { - $this->helperSet = $helperSet; - } - - /** - * Get the helper set associated with the command. - * - * @return HelperSet The HelperSet instance associated with this command - * - * @api - */ - public function getHelperSet() - { - return $this->helperSet; - } - - /** - * Set an input definition set to be used with this application - * - * @param InputDefinition $definition The input definition - * - * @api - */ - public function setDefinition(InputDefinition $definition) - { - $this->definition = $definition; - } - - /** - * Gets the InputDefinition related to this Application. - * - * @return InputDefinition The InputDefinition instance - */ - public function getDefinition() - { - return $this->definition; - } - - /** - * Gets the help message. - * - * @return string A help message. - */ - public function getHelp() - { - $messages = array( - $this->getLongVersion(), - '', - 'Usage:', - ' [options] command [arguments]', - '', - 'Options:', - ); - - foreach ($this->getDefinition()->getOptions() as $option) { - $messages[] = sprintf(' %-29s %s %s', - '--'.$option->getName().'', - $option->getShortcut() ? '-'.$option->getShortcut().'' : ' ', - $option->getDescription() - ); - } - - return implode(PHP_EOL, $messages); - } - - /** - * Sets whether to catch exceptions or not during commands execution. - * - * @param bool $boolean Whether to catch exceptions or not during commands execution - * - * @api - */ - public function setCatchExceptions($boolean) - { - $this->catchExceptions = (bool) $boolean; - } - - /** - * Sets whether to automatically exit after a command execution or not. - * - * @param bool $boolean Whether to automatically exit after a command execution or not - * - * @api - */ - public function setAutoExit($boolean) - { - $this->autoExit = (bool) $boolean; - } - - /** - * Gets the name of the application. - * - * @return string The application name - * - * @api - */ - public function getName() - { - return $this->name; - } - - /** - * Sets the application name. - * - * @param string $name The application name - * - * @api - */ - public function setName($name) - { - $this->name = $name; - } - - /** - * Gets the application version. - * - * @return string The application version - * - * @api - */ - public function getVersion() - { - return $this->version; - } - - /** - * Sets the application version. - * - * @param string $version The application version - * - * @api - */ - public function setVersion($version) - { - $this->version = $version; - } - - /** - * Returns the long version of the application. - * - * @return string The long application version - * - * @api - */ - public function getLongVersion() - { - if ('UNKNOWN' !== $this->getName() && 'UNKNOWN' !== $this->getVersion()) { - return sprintf('%s version %s', $this->getName(), $this->getVersion()); - } - - return 'Console Tool'; - } - - /** - * Registers a new command. - * - * @param string $name The command name - * - * @return Command The newly created command - * - * @api - */ - public function register($name) - { - return $this->add(new Command($name)); - } - - /** - * Adds an array of command objects. - * - * @param Command[] $commands An array of commands - * - * @api - */ - public function addCommands(array $commands) - { - foreach ($commands as $command) { - $this->add($command); - } - } - - /** - * Adds a command object. - * - * If a command with the same name already exists, it will be overridden. - * - * @param Command $command A Command object - * - * @return Command The registered command - * - * @api - */ - public function add(Command $command) - { - $command->setApplication($this); - - if (!$command->isEnabled()) { - $command->setApplication(null); - - return; - } - - if (null === $command->getDefinition()) { - throw new \LogicException(sprintf('Command class "%s" is not correctly initialized. You probably forgot to call the parent constructor.', get_class($command))); - } - - $this->commands[$command->getName()] = $command; - - foreach ($command->getAliases() as $alias) { - $this->commands[$alias] = $command; - } - - return $command; - } - - /** - * Returns a registered command by name or alias. - * - * @param string $name The command name or alias - * - * @return Command A Command object - * - * @throws \InvalidArgumentException When command name given does not exist - * - * @api - */ - public function get($name) - { - if (!isset($this->commands[$name])) { - throw new \InvalidArgumentException(sprintf('The command "%s" does not exist.', $name)); - } - - $command = $this->commands[$name]; - - if ($this->wantHelps) { - $this->wantHelps = false; - - $helpCommand = $this->get('help'); - $helpCommand->setCommand($command); - - return $helpCommand; - } - - return $command; - } - - /** - * Returns true if the command exists, false otherwise. - * - * @param string $name The command name or alias - * - * @return bool true if the command exists, false otherwise - * - * @api - */ - public function has($name) - { - return isset($this->commands[$name]); - } - - /** - * Returns an array of all unique namespaces used by currently registered commands. - * - * It does not returns the global namespace which always exists. - * - * @return array An array of namespaces - */ - public function getNamespaces() - { - $namespaces = array(); - foreach ($this->commands as $command) { - $namespaces[] = $this->extractNamespace($command->getName()); - - foreach ($command->getAliases() as $alias) { - $namespaces[] = $this->extractNamespace($alias); - } - } - - return array_values(array_unique(array_filter($namespaces))); - } - - /** - * Finds a registered namespace by a name or an abbreviation. - * - * @param string $namespace A namespace or abbreviation to search for - * - * @return string A registered namespace - * - * @throws \InvalidArgumentException When namespace is incorrect or ambiguous - */ - public function findNamespace($namespace) - { - $allNamespaces = $this->getNamespaces(); - $expr = preg_replace_callback('{([^:]+|)}', function ($matches) { return preg_quote($matches[1]).'[^:]*'; }, $namespace); - $namespaces = preg_grep('{^'.$expr.'}', $allNamespaces); - - if (empty($namespaces)) { - $message = sprintf('There are no commands defined in the "%s" namespace.', $namespace); - - if ($alternatives = $this->findAlternatives($namespace, $allNamespaces, array())) { - if (1 == count($alternatives)) { - $message .= "\n\nDid you mean this?\n "; - } else { - $message .= "\n\nDid you mean one of these?\n "; - } - - $message .= implode("\n ", $alternatives); - } - - throw new \InvalidArgumentException($message); - } - - $exact = in_array($namespace, $namespaces, true); - if (count($namespaces) > 1 && !$exact) { - throw new \InvalidArgumentException(sprintf('The namespace "%s" is ambiguous (%s).', $namespace, $this->getAbbreviationSuggestions(array_values($namespaces)))); - } - - return $exact ? $namespace : reset($namespaces); - } - - /** - * Finds a command by name or alias. - * - * Contrary to get, this command tries to find the best - * match if you give it an abbreviation of a name or alias. - * - * @param string $name A command name or a command alias - * - * @return Command A Command instance - * - * @throws \InvalidArgumentException When command name is incorrect or ambiguous - * - * @api - */ - public function find($name) - { - $allCommands = array_keys($this->commands); - $expr = preg_replace_callback('{([^:]+|)}', function ($matches) { return preg_quote($matches[1]).'[^:]*'; }, $name); - $commands = preg_grep('{^'.$expr.'}', $allCommands); - - if (empty($commands) || count(preg_grep('{^'.$expr.'$}', $commands)) < 1) { - if (false !== $pos = strrpos($name, ':')) { - // check if a namespace exists and contains commands - $this->findNamespace(substr($name, 0, $pos)); - } - - $message = sprintf('Command "%s" is not defined.', $name); - - if ($alternatives = $this->findAlternatives($name, $allCommands, array())) { - if (1 == count($alternatives)) { - $message .= "\n\nDid you mean this?\n "; - } else { - $message .= "\n\nDid you mean one of these?\n "; - } - $message .= implode("\n ", $alternatives); - } - - throw new \InvalidArgumentException($message); - } - - // filter out aliases for commands which are already on the list - if (count($commands) > 1) { - $commandList = $this->commands; - $commands = array_filter($commands, function ($nameOrAlias) use ($commandList, $commands) { - $commandName = $commandList[$nameOrAlias]->getName(); - - return $commandName === $nameOrAlias || !in_array($commandName, $commands); - }); - } - - $exact = in_array($name, $commands, true); - if (count($commands) > 1 && !$exact) { - $suggestions = $this->getAbbreviationSuggestions(array_values($commands)); - - throw new \InvalidArgumentException(sprintf('Command "%s" is ambiguous (%s).', $name, $suggestions)); - } - - return $this->get($exact ? $name : reset($commands)); - } - - /** - * Gets the commands (registered in the given namespace if provided). - * - * The array keys are the full names and the values the command instances. - * - * @param string $namespace A namespace name - * - * @return Command[] An array of Command instances - * - * @api - */ - public function all($namespace = null) - { - if (null === $namespace) { - return $this->commands; - } - - $commands = array(); - foreach ($this->commands as $name => $command) { - if ($namespace === $this->extractNamespace($name, substr_count($namespace, ':') + 1)) { - $commands[$name] = $command; - } - } - - return $commands; - } - - /** - * Returns an array of possible abbreviations given a set of names. - * - * @param array $names An array of names - * - * @return array An array of abbreviations - */ - public static function getAbbreviations($names) - { - $abbrevs = array(); - foreach ($names as $name) { - for ($len = strlen($name); $len > 0; --$len) { - $abbrev = substr($name, 0, $len); - $abbrevs[$abbrev][] = $name; - } - } - - return $abbrevs; - } - - /** - * Returns a text representation of the Application. - * - * @param string $namespace An optional namespace name - * @param bool $raw Whether to return raw command list - * - * @return string A string representing the Application - * - * @deprecated Deprecated since version 2.3, to be removed in 3.0. - */ - public function asText($namespace = null, $raw = false) - { - $descriptor = new TextDescriptor(); - $output = new BufferedOutput(BufferedOutput::VERBOSITY_NORMAL, !$raw); - $descriptor->describe($output, $this, array('namespace' => $namespace, 'raw_output' => true)); - - return $output->fetch(); - } - - /** - * Returns an XML representation of the Application. - * - * @param string $namespace An optional namespace name - * @param bool $asDom Whether to return a DOM or an XML string - * - * @return string|\DOMDocument An XML string representing the Application - * - * @deprecated Deprecated since version 2.3, to be removed in 3.0. - */ - public function asXml($namespace = null, $asDom = false) - { - $descriptor = new XmlDescriptor(); - - if ($asDom) { - return $descriptor->getApplicationDocument($this, $namespace); - } - - $output = new BufferedOutput(); - $descriptor->describe($output, $this, array('namespace' => $namespace)); - - return $output->fetch(); - } - - /** - * Renders a caught exception. - * - * @param \Exception $e An exception instance - * @param OutputInterface $output An OutputInterface instance - */ - public function renderException($e, $output) - { - do { - $title = sprintf(' [%s] ', get_class($e)); - - $len = $this->stringWidth($title); - - $width = $this->getTerminalWidth() ? $this->getTerminalWidth() - 1 : PHP_INT_MAX; - // HHVM only accepts 32 bits integer in str_split, even when PHP_INT_MAX is a 64 bit integer: https://github.com/facebook/hhvm/issues/1327 - if (defined('HHVM_VERSION') && $width > 1 << 31) { - $width = 1 << 31; - } - $formatter = $output->getFormatter(); - $lines = array(); - foreach (preg_split('/\r?\n/', $e->getMessage()) as $line) { - foreach ($this->splitStringByWidth($line, $width - 4) as $line) { - // pre-format lines to get the right string length - $lineLength = $this->stringWidth(preg_replace('/\[[^m]*m/', '', $formatter->format($line))) + 4; - $lines[] = array($line, $lineLength); - - $len = max($lineLength, $len); - } - } - - $messages = array('', ''); - $messages[] = $emptyLine = $formatter->format(sprintf('%s', str_repeat(' ', $len))); - $messages[] = $formatter->format(sprintf('%s%s', $title, str_repeat(' ', max(0, $len - $this->stringWidth($title))))); - foreach ($lines as $line) { - $messages[] = $formatter->format(sprintf(' %s %s', $line[0], str_repeat(' ', $len - $line[1]))); - } - $messages[] = $emptyLine; - $messages[] = ''; - $messages[] = ''; - - $output->writeln($messages, OutputInterface::OUTPUT_RAW); - - if (OutputInterface::VERBOSITY_VERBOSE <= $output->getVerbosity()) { - $output->writeln('Exception trace:'); - - // exception related properties - $trace = $e->getTrace(); - array_unshift($trace, array( - 'function' => '', - 'file' => $e->getFile() != null ? $e->getFile() : 'n/a', - 'line' => $e->getLine() != null ? $e->getLine() : 'n/a', - 'args' => array(), - )); - - for ($i = 0, $count = count($trace); $i < $count; $i++) { - $class = isset($trace[$i]['class']) ? $trace[$i]['class'] : ''; - $type = isset($trace[$i]['type']) ? $trace[$i]['type'] : ''; - $function = $trace[$i]['function']; - $file = isset($trace[$i]['file']) ? $trace[$i]['file'] : 'n/a'; - $line = isset($trace[$i]['line']) ? $trace[$i]['line'] : 'n/a'; - - $output->writeln(sprintf(' %s%s%s() at %s:%s', $class, $type, $function, $file, $line)); - } - - $output->writeln(""); - $output->writeln(""); - } - } while ($e = $e->getPrevious()); - - if (null !== $this->runningCommand) { - $output->writeln(sprintf('%s', sprintf($this->runningCommand->getSynopsis(), $this->getName()))); - $output->writeln(""); - $output->writeln(""); - } - } - - /** - * Tries to figure out the terminal width in which this application runs - * - * @return int|null - */ - protected function getTerminalWidth() - { - $dimensions = $this->getTerminalDimensions(); - - return $dimensions[0]; - } - - /** - * Tries to figure out the terminal height in which this application runs - * - * @return int|null - */ - protected function getTerminalHeight() - { - $dimensions = $this->getTerminalDimensions(); - - return $dimensions[1]; - } - - /** - * Tries to figure out the terminal dimensions based on the current environment - * - * @return array Array containing width and height - */ - public function getTerminalDimensions() - { - if ($this->terminalDimensions) { - return $this->terminalDimensions; - } - - if (defined('PHP_WINDOWS_VERSION_BUILD')) { - // extract [w, H] from "wxh (WxH)" - if (preg_match('/^(\d+)x\d+ \(\d+x(\d+)\)$/', trim(getenv('ANSICON')), $matches)) { - return array((int) $matches[1], (int) $matches[2]); - } - // extract [w, h] from "wxh" - if (preg_match('/^(\d+)x(\d+)$/', $this->getConsoleMode(), $matches)) { - return array((int) $matches[1], (int) $matches[2]); - } - } - - if ($sttyString = $this->getSttyColumns()) { - // extract [w, h] from "rows h; columns w;" - if (preg_match('/rows.(\d+);.columns.(\d+);/i', $sttyString, $matches)) { - return array((int) $matches[2], (int) $matches[1]); - } - // extract [w, h] from "; h rows; w columns" - if (preg_match('/;.(\d+).rows;.(\d+).columns/i', $sttyString, $matches)) { - return array((int) $matches[2], (int) $matches[1]); - } - } - - return array(null, null); - } - - /** - * Sets terminal dimensions. - * - * Can be useful to force terminal dimensions for functional tests. - * - * @param int $width The width - * @param int $height The height - * - * @return Application The current application - */ - public function setTerminalDimensions($width, $height) - { - $this->terminalDimensions = array($width, $height); - - return $this; - } - - /** - * Configures the input and output instances based on the user arguments and options. - * - * @param InputInterface $input An InputInterface instance - * @param OutputInterface $output An OutputInterface instance - */ - protected function configureIO(InputInterface $input, OutputInterface $output) - { - if (true === $input->hasParameterOption(array('--ansi'))) { - $output->setDecorated(true); - } elseif (true === $input->hasParameterOption(array('--no-ansi'))) { - $output->setDecorated(false); - } - - if (true === $input->hasParameterOption(array('--no-interaction', '-n'))) { - $input->setInteractive(false); - } elseif (function_exists('posix_isatty') && $this->getHelperSet()->has('dialog')) { - $inputStream = $this->getHelperSet()->get('dialog')->getInputStream(); - if (!@posix_isatty($inputStream)) { - $input->setInteractive(false); - } - } - - if (true === $input->hasParameterOption(array('--quiet', '-q'))) { - $output->setVerbosity(OutputInterface::VERBOSITY_QUIET); - } else { - if ($input->hasParameterOption('-vvv') || $input->hasParameterOption('--verbose=3') || $input->getParameterOption('--verbose') === 3) { - $output->setVerbosity(OutputInterface::VERBOSITY_DEBUG); - } elseif ($input->hasParameterOption('-vv') || $input->hasParameterOption('--verbose=2') || $input->getParameterOption('--verbose') === 2) { - $output->setVerbosity(OutputInterface::VERBOSITY_VERY_VERBOSE); - } elseif ($input->hasParameterOption('-v') || $input->hasParameterOption('--verbose=1') || $input->hasParameterOption('--verbose') || $input->getParameterOption('--verbose')) { - $output->setVerbosity(OutputInterface::VERBOSITY_VERBOSE); - } - } - } - - /** - * Runs the current command. - * - * If an event dispatcher has been attached to the application, - * events are also dispatched during the life-cycle of the command. - * - * @param Command $command A Command instance - * @param InputInterface $input An Input instance - * @param OutputInterface $output An Output instance - * - * @return int 0 if everything went fine, or an error code - * - * @throws \Exception when the command being run threw an exception - */ - protected function doRunCommand(Command $command, InputInterface $input, OutputInterface $output) - { - foreach ($command->getHelperSet() as $helper) { - if ($helper instanceof InputAwareInterface) { - $helper->setInput($input); - } - } - - if (null === $this->dispatcher) { - return $command->run($input, $output); - } - - $event = new ConsoleCommandEvent($command, $input, $output); - $this->dispatcher->dispatch(ConsoleEvents::COMMAND, $event); - - try { - $exitCode = $command->run($input, $output); - } catch (\Exception $e) { - $event = new ConsoleTerminateEvent($command, $input, $output, $e->getCode()); - $this->dispatcher->dispatch(ConsoleEvents::TERMINATE, $event); - - $event = new ConsoleExceptionEvent($command, $input, $output, $e, $event->getExitCode()); - $this->dispatcher->dispatch(ConsoleEvents::EXCEPTION, $event); - - throw $event->getException(); - } - - $event = new ConsoleTerminateEvent($command, $input, $output, $exitCode); - $this->dispatcher->dispatch(ConsoleEvents::TERMINATE, $event); - - return $event->getExitCode(); - } - - /** - * Gets the name of the command based on input. - * - * @param InputInterface $input The input interface - * - * @return string The command name - */ - protected function getCommandName(InputInterface $input) - { - return $input->getFirstArgument(); - } - - /** - * Gets the default input definition. - * - * @return InputDefinition An InputDefinition instance - */ - protected function getDefaultInputDefinition() - { - return new InputDefinition(array( - new InputArgument('command', InputArgument::REQUIRED, 'The command to execute'), - - new InputOption('--help', '-h', InputOption::VALUE_NONE, 'Display this help message.'), - new InputOption('--quiet', '-q', InputOption::VALUE_NONE, 'Do not output any message.'), - new InputOption('--verbose', '-v|vv|vvv', InputOption::VALUE_NONE, 'Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug'), - new InputOption('--version', '-V', InputOption::VALUE_NONE, 'Display this application version.'), - new InputOption('--ansi', '', InputOption::VALUE_NONE, 'Force ANSI output.'), - new InputOption('--no-ansi', '', InputOption::VALUE_NONE, 'Disable ANSI output.'), - new InputOption('--no-interaction', '-n', InputOption::VALUE_NONE, 'Do not ask any interactive question.'), - )); - } - - /** - * Gets the default commands that should always be available. - * - * @return Command[] An array of default Command instances - */ - protected function getDefaultCommands() - { - return array(new HelpCommand(), new ListCommand()); - } - - /** - * Gets the default helper set with the helpers that should always be available. - * - * @return HelperSet A HelperSet instance - */ - protected function getDefaultHelperSet() - { - return new HelperSet(array( - new FormatterHelper(), - new DialogHelper(), - new ProgressHelper(), - new TableHelper(), - new QuestionHelper(), - )); - } - - /** - * Runs and parses stty -a if it's available, suppressing any error output - * - * @return string - */ - private function getSttyColumns() - { - if (!function_exists('proc_open')) { - return; - } - - $descriptorspec = array(1 => array('pipe', 'w'), 2 => array('pipe', 'w')); - $process = proc_open('stty -a | grep columns', $descriptorspec, $pipes, null, null, array('suppress_errors' => true)); - if (is_resource($process)) { - $info = stream_get_contents($pipes[1]); - fclose($pipes[1]); - fclose($pipes[2]); - proc_close($process); - - return $info; - } - } - - /** - * Runs and parses mode CON if it's available, suppressing any error output - * - * @return string x or null if it could not be parsed - */ - private function getConsoleMode() - { - if (!function_exists('proc_open')) { - return; - } - - $descriptorspec = array(1 => array('pipe', 'w'), 2 => array('pipe', 'w')); - $process = proc_open('mode CON', $descriptorspec, $pipes, null, null, array('suppress_errors' => true)); - if (is_resource($process)) { - $info = stream_get_contents($pipes[1]); - fclose($pipes[1]); - fclose($pipes[2]); - proc_close($process); - - if (preg_match('/--------+\r?\n.+?(\d+)\r?\n.+?(\d+)\r?\n/', $info, $matches)) { - return $matches[2].'x'.$matches[1]; - } - } - } - - /** - * Returns abbreviated suggestions in string format. - * - * @param array $abbrevs Abbreviated suggestions to convert - * - * @return string A formatted string of abbreviated suggestions - */ - private function getAbbreviationSuggestions($abbrevs) - { - return sprintf('%s, %s%s', $abbrevs[0], $abbrevs[1], count($abbrevs) > 2 ? sprintf(' and %d more', count($abbrevs) - 2) : ''); - } - - /** - * Returns the namespace part of the command name. - * - * This method is not part of public API and should not be used directly. - * - * @param string $name The full name of the command - * @param string $limit The maximum number of parts of the namespace - * - * @return string The namespace of the command - */ - public function extractNamespace($name, $limit = null) - { - $parts = explode(':', $name); - array_pop($parts); - - return implode(':', null === $limit ? $parts : array_slice($parts, 0, $limit)); - } - - /** - * Finds alternative of $name among $collection, - * if nothing is found in $collection, try in $abbrevs - * - * @param string $name The string - * @param array|\Traversable $collection The collection - * - * @return array A sorted array of similar string - */ - private function findAlternatives($name, $collection) - { - $threshold = 1e3; - $alternatives = array(); - - $collectionParts = array(); - foreach ($collection as $item) { - $collectionParts[$item] = explode(':', $item); - } - - foreach (explode(':', $name) as $i => $subname) { - foreach ($collectionParts as $collectionName => $parts) { - $exists = isset($alternatives[$collectionName]); - if (!isset($parts[$i]) && $exists) { - $alternatives[$collectionName] += $threshold; - continue; - } elseif (!isset($parts[$i])) { - continue; - } - - $lev = levenshtein($subname, $parts[$i]); - if ($lev <= strlen($subname) / 3 || false !== strpos($parts[$i], $subname)) { - $alternatives[$collectionName] = $exists ? $alternatives[$collectionName] + $lev : $lev; - } elseif ($exists) { - $alternatives[$collectionName] += $threshold; - } - } - } - - foreach ($collection as $item) { - $lev = levenshtein($name, $item); - if ($lev <= strlen($name) / 3 || false !== strpos($item, $name)) { - $alternatives[$item] = isset($alternatives[$item]) ? $alternatives[$item] - $lev : $lev; - } - } - - $alternatives = array_filter($alternatives, function ($lev) use ($threshold) { return $lev < 2*$threshold; }); - asort($alternatives); - - return array_keys($alternatives); - } - - /** - * Sets the default Command name. - * - * @param string $commandName The Command name - */ - public function setDefaultCommand($commandName) - { - $this->defaultCommand = $commandName; - } - - private function stringWidth($string) - { - if (!function_exists('mb_strwidth')) { - return strlen($string); - } - - if (false === $encoding = mb_detect_encoding($string)) { - return strlen($string); - } - - return mb_strwidth($string, $encoding); - } - - private function splitStringByWidth($string, $width) - { - // str_split is not suitable for multi-byte characters, we should use preg_split to get char array properly. - // additionally, array_slice() is not enough as some character has doubled width. - // we need a function to split string not by character count but by string width - - if (!function_exists('mb_strwidth')) { - return str_split($string, $width); - } - - if (false === $encoding = mb_detect_encoding($string)) { - return str_split($string, $width); - } - - $utf8String = mb_convert_encoding($string, 'utf8', $encoding); - $lines = array(); - $line = ''; - foreach (preg_split('//u', $utf8String) as $char) { - // test if $char could be appended to current line - if (mb_strwidth($line.$char, 'utf8') <= $width) { - $line .= $char; - continue; - } - // if not, push current line to array and make new line - $lines[] = str_pad($line, $width); - $line = $char; - } - if (strlen($line)) { - $lines[] = count($lines) ? str_pad($line, $width) : $line; - } - - mb_convert_variables($encoding, 'utf8', $lines); - - return $lines; - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/CHANGELOG.md b/vendor/symfony/console/Symfony/Component/Console/CHANGELOG.md deleted file mode 100644 index 704599485..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/CHANGELOG.md +++ /dev/null @@ -1,56 +0,0 @@ -CHANGELOG -========= - -2.5.0 ------ - - * deprecated the dialog helper (use the question helper instead) - * deprecated TableHelper in favor of Table - * deprecated ProgressHelper in favor of ProgressBar - * added ConsoleLogger - * added a question helper - * added a way to set the process name of a command - * added a way to set a default command instead of `ListCommand` - -2.4.0 ------ - - * added a way to force terminal dimensions - * added a convenient method to detect verbosity level - * [BC BREAK] made descriptors use output instead of returning a string - -2.3.0 ------ - - * added multiselect support to the select dialog helper - * added Table Helper for tabular data rendering - * added support for events in `Application` - * added a way to normalize EOLs in `ApplicationTester::getDisplay()` and `CommandTester::getDisplay()` - * added a way to set the progress bar progress via the `setCurrent` method - * added support for multiple InputOption shortcuts, written as `'-a|-b|-c'` - * added two additional verbosity levels, VERBOSITY_VERY_VERBOSE and VERBOSITY_DEBUG - -2.2.0 ------ - - * added support for colorization on Windows via ConEmu - * add a method to Dialog Helper to ask for a question and hide the response - * added support for interactive selections in console (DialogHelper::select()) - * added support for autocompletion as you type in Dialog Helper - -2.1.0 ------ - - * added ConsoleOutputInterface - * added the possibility to disable a command (Command::isEnabled()) - * added suggestions when a command does not exist - * added a --raw option to the list command - * added support for STDERR in the console output class (errors are now sent - to STDERR) - * made the defaults (helper set, commands, input definition) in Application - more easily customizable - * added support for the shell even if readline is not available - * added support for process isolation in Symfony shell via - `--process-isolation` switch - * added support for `--`, which disables options parsing after that point - (tokens will be parsed as arguments) diff --git a/vendor/symfony/console/Symfony/Component/Console/Command/Command.php b/vendor/symfony/console/Symfony/Component/Console/Command/Command.php deleted file mode 100644 index 21ac78c99..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Command/Command.php +++ /dev/null @@ -1,652 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Command; - -use Symfony\Component\Console\Descriptor\TextDescriptor; -use Symfony\Component\Console\Descriptor\XmlDescriptor; -use Symfony\Component\Console\Input\InputDefinition; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\BufferedOutput; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Helper\HelperSet; - -/** - * Base class for all commands. - * - * @author Fabien Potencier - * - * @api - */ -class Command -{ - private $application; - private $name; - private $processTitle; - private $aliases = array(); - private $definition; - private $help; - private $description; - private $ignoreValidationErrors = false; - private $applicationDefinitionMerged = false; - private $applicationDefinitionMergedWithArgs = false; - private $code; - private $synopsis; - private $helperSet; - - /** - * Constructor. - * - * @param string|null $name The name of the command; passing null means it must be set in configure() - * - * @throws \LogicException When the command name is empty - * - * @api - */ - public function __construct($name = null) - { - $this->definition = new InputDefinition(); - - if (null !== $name) { - $this->setName($name); - } - - $this->configure(); - - if (!$this->name) { - throw new \LogicException('The command name cannot be empty.'); - } - } - - /** - * Ignores validation errors. - * - * This is mainly useful for the help command. - */ - public function ignoreValidationErrors() - { - $this->ignoreValidationErrors = true; - } - - /** - * Sets the application instance for this command. - * - * @param Application $application An Application instance - * - * @api - */ - public function setApplication(Application $application = null) - { - $this->application = $application; - if ($application) { - $this->setHelperSet($application->getHelperSet()); - } else { - $this->helperSet = null; - } - } - - /** - * Sets the helper set. - * - * @param HelperSet $helperSet A HelperSet instance - */ - public function setHelperSet(HelperSet $helperSet) - { - $this->helperSet = $helperSet; - } - - /** - * Gets the helper set. - * - * @return HelperSet A HelperSet instance - */ - public function getHelperSet() - { - return $this->helperSet; - } - - /** - * Gets the application instance for this command. - * - * @return Application An Application instance - * - * @api - */ - public function getApplication() - { - return $this->application; - } - - /** - * Checks whether the command is enabled or not in the current environment - * - * Override this to check for x or y and return false if the command can not - * run properly under the current conditions. - * - * @return bool - */ - public function isEnabled() - { - return true; - } - - /** - * Configures the current command. - */ - protected function configure() - { - } - - /** - * Executes the current command. - * - * This method is not abstract because you can use this class - * as a concrete class. In this case, instead of defining the - * execute() method, you set the code to execute by passing - * a Closure to the setCode() method. - * - * @param InputInterface $input An InputInterface instance - * @param OutputInterface $output An OutputInterface instance - * - * @return null|int null or 0 if everything went fine, or an error code - * - * @throws \LogicException When this abstract method is not implemented - * @see setCode() - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - throw new \LogicException('You must override the execute() method in the concrete command class.'); - } - - /** - * Interacts with the user. - * - * @param InputInterface $input An InputInterface instance - * @param OutputInterface $output An OutputInterface instance - */ - protected function interact(InputInterface $input, OutputInterface $output) - { - } - - /** - * Initializes the command just after the input has been validated. - * - * This is mainly useful when a lot of commands extends one main command - * where some things need to be initialized based on the input arguments and options. - * - * @param InputInterface $input An InputInterface instance - * @param OutputInterface $output An OutputInterface instance - */ - protected function initialize(InputInterface $input, OutputInterface $output) - { - } - - /** - * Runs the command. - * - * The code to execute is either defined directly with the - * setCode() method or by overriding the execute() method - * in a sub-class. - * - * @param InputInterface $input An InputInterface instance - * @param OutputInterface $output An OutputInterface instance - * - * @return int The command exit code - * - * @throws \Exception - * - * @see setCode() - * @see execute() - * - * @api - */ - public function run(InputInterface $input, OutputInterface $output) - { - if (null !== $this->processTitle) { - if (function_exists('cli_set_process_title')) { - cli_set_process_title($this->processTitle); - } elseif (function_exists('setproctitle')) { - setproctitle($this->processTitle); - } elseif (OutputInterface::VERBOSITY_VERY_VERBOSE === $output->getVerbosity()) { - $output->writeln('Install the proctitle PECL to be able to change the process title.'); - } - } - - // force the creation of the synopsis before the merge with the app definition - $this->getSynopsis(); - - // add the application arguments and options - $this->mergeApplicationDefinition(); - - // bind the input against the command specific arguments/options - try { - $input->bind($this->definition); - } catch (\Exception $e) { - if (!$this->ignoreValidationErrors) { - throw $e; - } - } - - $this->initialize($input, $output); - - if ($input->isInteractive()) { - $this->interact($input, $output); - } - - $input->validate(); - - if ($this->code) { - $statusCode = call_user_func($this->code, $input, $output); - } else { - $statusCode = $this->execute($input, $output); - } - - return is_numeric($statusCode) ? (int) $statusCode : 0; - } - - /** - * Sets the code to execute when running this command. - * - * If this method is used, it overrides the code defined - * in the execute() method. - * - * @param callable $code A callable(InputInterface $input, OutputInterface $output) - * - * @return Command The current instance - * - * @throws \InvalidArgumentException - * - * @see execute() - * - * @api - */ - public function setCode($code) - { - if (!is_callable($code)) { - throw new \InvalidArgumentException('Invalid callable provided to Command::setCode.'); - } - - $this->code = $code; - - return $this; - } - - /** - * Merges the application definition with the command definition. - * - * This method is not part of public API and should not be used directly. - * - * @param bool $mergeArgs Whether to merge or not the Application definition arguments to Command definition arguments - */ - public function mergeApplicationDefinition($mergeArgs = true) - { - if (null === $this->application || (true === $this->applicationDefinitionMerged && ($this->applicationDefinitionMergedWithArgs || !$mergeArgs))) { - return; - } - - if ($mergeArgs) { - $currentArguments = $this->definition->getArguments(); - $this->definition->setArguments($this->application->getDefinition()->getArguments()); - $this->definition->addArguments($currentArguments); - } - - $this->definition->addOptions($this->application->getDefinition()->getOptions()); - - $this->applicationDefinitionMerged = true; - if ($mergeArgs) { - $this->applicationDefinitionMergedWithArgs = true; - } - } - - /** - * Sets an array of argument and option instances. - * - * @param array|InputDefinition $definition An array of argument and option instances or a definition instance - * - * @return Command The current instance - * - * @api - */ - public function setDefinition($definition) - { - if ($definition instanceof InputDefinition) { - $this->definition = $definition; - } else { - $this->definition->setDefinition($definition); - } - - $this->applicationDefinitionMerged = false; - - return $this; - } - - /** - * Gets the InputDefinition attached to this Command. - * - * @return InputDefinition An InputDefinition instance - * - * @api - */ - public function getDefinition() - { - return $this->definition; - } - - /** - * Gets the InputDefinition to be used to create XML and Text representations of this Command. - * - * Can be overridden to provide the original command representation when it would otherwise - * be changed by merging with the application InputDefinition. - * - * This method is not part of public API and should not be used directly. - * - * @return InputDefinition An InputDefinition instance - */ - public function getNativeDefinition() - { - return $this->getDefinition(); - } - - /** - * Adds an argument. - * - * @param string $name The argument name - * @param int $mode The argument mode: InputArgument::REQUIRED or InputArgument::OPTIONAL - * @param string $description A description text - * @param mixed $default The default value (for InputArgument::OPTIONAL mode only) - * - * @return Command The current instance - * - * @api - */ - public function addArgument($name, $mode = null, $description = '', $default = null) - { - $this->definition->addArgument(new InputArgument($name, $mode, $description, $default)); - - return $this; - } - - /** - * Adds an option. - * - * @param string $name The option name - * @param string $shortcut The shortcut (can be null) - * @param int $mode The option mode: One of the InputOption::VALUE_* constants - * @param string $description A description text - * @param mixed $default The default value (must be null for InputOption::VALUE_REQUIRED or InputOption::VALUE_NONE) - * - * @return Command The current instance - * - * @api - */ - public function addOption($name, $shortcut = null, $mode = null, $description = '', $default = null) - { - $this->definition->addOption(new InputOption($name, $shortcut, $mode, $description, $default)); - - return $this; - } - - /** - * Sets the name of the command. - * - * This method can set both the namespace and the name if - * you separate them by a colon (:) - * - * $command->setName('foo:bar'); - * - * @param string $name The command name - * - * @return Command The current instance - * - * @throws \InvalidArgumentException When the name is invalid - * - * @api - */ - public function setName($name) - { - $this->validateName($name); - - $this->name = $name; - - return $this; - } - - /** - * Sets the process title of the command. - * - * This feature should be used only when creating a long process command, - * like a daemon. - * - * PHP 5.5+ or the proctitle PECL library is required - * - * @param string $title The process title - * - * @return Command The current instance - */ - public function setProcessTitle($title) - { - $this->processTitle = $title; - - return $this; - } - - /** - * Returns the command name. - * - * @return string The command name - * - * @api - */ - public function getName() - { - return $this->name; - } - - /** - * Sets the description for the command. - * - * @param string $description The description for the command - * - * @return Command The current instance - * - * @api - */ - public function setDescription($description) - { - $this->description = $description; - - return $this; - } - - /** - * Returns the description for the command. - * - * @return string The description for the command - * - * @api - */ - public function getDescription() - { - return $this->description; - } - - /** - * Sets the help for the command. - * - * @param string $help The help for the command - * - * @return Command The current instance - * - * @api - */ - public function setHelp($help) - { - $this->help = $help; - - return $this; - } - - /** - * Returns the help for the command. - * - * @return string The help for the command - * - * @api - */ - public function getHelp() - { - return $this->help; - } - - /** - * Returns the processed help for the command replacing the %command.name% and - * %command.full_name% patterns with the real values dynamically. - * - * @return string The processed help for the command - */ - public function getProcessedHelp() - { - $name = $this->name; - - $placeholders = array( - '%command.name%', - '%command.full_name%' - ); - $replacements = array( - $name, - $_SERVER['PHP_SELF'].' '.$name - ); - - return str_replace($placeholders, $replacements, $this->getHelp()); - } - - /** - * Sets the aliases for the command. - * - * @param array $aliases An array of aliases for the command - * - * @return Command The current instance - * - * @throws \InvalidArgumentException When an alias is invalid - * - * @api - */ - public function setAliases($aliases) - { - foreach ($aliases as $alias) { - $this->validateName($alias); - } - - $this->aliases = $aliases; - - return $this; - } - - /** - * Returns the aliases for the command. - * - * @return array An array of aliases for the command - * - * @api - */ - public function getAliases() - { - return $this->aliases; - } - - /** - * Returns the synopsis for the command. - * - * @return string The synopsis - */ - public function getSynopsis() - { - if (null === $this->synopsis) { - $this->synopsis = trim(sprintf('%s %s', $this->name, $this->definition->getSynopsis())); - } - - return $this->synopsis; - } - - /** - * Gets a helper instance by name. - * - * @param string $name The helper name - * - * @return mixed The helper value - * - * @throws \InvalidArgumentException if the helper is not defined - * - * @api - */ - public function getHelper($name) - { - return $this->helperSet->get($name); - } - - /** - * Returns a text representation of the command. - * - * @return string A string representing the command - * - * @deprecated Deprecated since version 2.3, to be removed in 3.0. - */ - public function asText() - { - $descriptor = new TextDescriptor(); - $output = new BufferedOutput(BufferedOutput::VERBOSITY_NORMAL, true); - $descriptor->describe($output, $this, array('raw_output' => true)); - - return $output->fetch(); - } - - /** - * Returns an XML representation of the command. - * - * @param bool $asDom Whether to return a DOM or an XML string - * - * @return string|\DOMDocument An XML string representing the command - * - * @deprecated Deprecated since version 2.3, to be removed in 3.0. - */ - public function asXml($asDom = false) - { - $descriptor = new XmlDescriptor(); - - if ($asDom) { - return $descriptor->getCommandDocument($this); - } - - $output = new BufferedOutput(); - $descriptor->describe($output, $this); - - return $output->fetch(); - } - - /** - * Validates a command name. - * - * It must be non-empty and parts can optionally be separated by ":". - * - * @param string $name - * - * @throws \InvalidArgumentException When the name is invalid - */ - private function validateName($name) - { - if (!preg_match('/^[^\:]++(\:[^\:]++)*$/', $name)) { - throw new \InvalidArgumentException(sprintf('Command name "%s" is invalid.', $name)); - } - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Command/HelpCommand.php b/vendor/symfony/console/Symfony/Component/Console/Command/HelpCommand.php deleted file mode 100644 index e76044a3a..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Command/HelpCommand.php +++ /dev/null @@ -1,91 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Command; - -use Symfony\Component\Console\Helper\DescriptorHelper; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * HelpCommand displays the help for a given command. - * - * @author Fabien Potencier - */ -class HelpCommand extends Command -{ - private $command; - - /** - * {@inheritdoc} - */ - protected function configure() - { - $this->ignoreValidationErrors(); - - $this - ->setName('help') - ->setDefinition(array( - new InputArgument('command_name', InputArgument::OPTIONAL, 'The command name', 'help'), - new InputOption('xml', null, InputOption::VALUE_NONE, 'To output help as XML'), - new InputOption('format', null, InputOption::VALUE_REQUIRED, 'To output help in other formats', 'txt'), - new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command help'), - )) - ->setDescription('Displays help for a command') - ->setHelp(<<%command.name% command displays help for a given command: - - php %command.full_name% list - -You can also output the help in other formats by using the --format option: - - php %command.full_name% --format=xml list - -To display the list of available commands, please use the list command. -EOF - ) - ; - } - - /** - * Sets the command - * - * @param Command $command The command to set - */ - public function setCommand(Command $command) - { - $this->command = $command; - } - - /** - * {@inheritdoc} - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - if (null === $this->command) { - $this->command = $this->getApplication()->find($input->getArgument('command_name')); - } - - if ($input->getOption('xml')) { - $input->setOption('format', 'xml'); - } - - $helper = new DescriptorHelper(); - $helper->describe($output, $this->command, array( - 'format' => $input->getOption('format'), - 'raw' => $input->getOption('raw'), - )); - - $this->command = null; - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Command/ListCommand.php b/vendor/symfony/console/Symfony/Component/Console/Command/ListCommand.php deleted file mode 100644 index 25c21205e..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Command/ListCommand.php +++ /dev/null @@ -1,95 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Command; - -use Symfony\Component\Console\Helper\DescriptorHelper; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Input\InputDefinition; - -/** - * ListCommand displays the list of all available commands for the application. - * - * @author Fabien Potencier - */ -class ListCommand extends Command -{ - /** - * {@inheritdoc} - */ - protected function configure() - { - $this - ->setName('list') - ->setDefinition($this->createDefinition()) - ->setDescription('Lists commands') - ->setHelp(<<%command.name% command lists all commands: - - php %command.full_name% - -You can also display the commands for a specific namespace: - - php %command.full_name% test - -You can also output the information in other formats by using the --format option: - - php %command.full_name% --format=xml - -It's also possible to get raw list of commands (useful for embedding command runner): - - php %command.full_name% --raw -EOF - ) - ; - } - - /** - * {@inheritdoc} - */ - public function getNativeDefinition() - { - return $this->createDefinition(); - } - - /** - * {@inheritdoc} - */ - protected function execute(InputInterface $input, OutputInterface $output) - { - if ($input->getOption('xml')) { - $input->setOption('format', 'xml'); - } - - $helper = new DescriptorHelper(); - $helper->describe($output, $this->getApplication(), array( - 'format' => $input->getOption('format'), - 'raw_text' => $input->getOption('raw'), - 'namespace' => $input->getArgument('namespace'), - )); - } - - /** - * {@inheritdoc} - */ - private function createDefinition() - { - return new InputDefinition(array( - new InputArgument('namespace', InputArgument::OPTIONAL, 'The namespace name'), - new InputOption('xml', null, InputOption::VALUE_NONE, 'To output list as XML'), - new InputOption('raw', null, InputOption::VALUE_NONE, 'To output raw command list'), - new InputOption('format', null, InputOption::VALUE_REQUIRED, 'To output list in other formats', 'txt'), - )); - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/ConsoleEvents.php b/vendor/symfony/console/Symfony/Component/Console/ConsoleEvents.php deleted file mode 100644 index 12ede2d5b..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/ConsoleEvents.php +++ /dev/null @@ -1,55 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console; - -/** - * Contains all events dispatched by an Application. - * - * @author Francesco Levorato - */ -final class ConsoleEvents -{ - /** - * The COMMAND event allows you to attach listeners before any command is - * executed by the console. It also allows you to modify the command, input and output - * before they are handled to the command. - * - * The event listener method receives a Symfony\Component\Console\Event\ConsoleCommandEvent - * instance. - * - * @var string - */ - const COMMAND = 'console.command'; - - /** - * The TERMINATE event allows you to attach listeners after a command is - * executed by the console. - * - * The event listener method receives a Symfony\Component\Console\Event\ConsoleTerminateEvent - * instance. - * - * @var string - */ - const TERMINATE = 'console.terminate'; - - /** - * The EXCEPTION event occurs when an uncaught exception appears. - * - * This event allows you to deal with the exception or - * to modify the thrown exception. The event listener method receives - * a Symfony\Component\Console\Event\ConsoleExceptionEvent - * instance. - * - * @var string - */ - const EXCEPTION = 'console.exception'; -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Descriptor/ApplicationDescription.php b/vendor/symfony/console/Symfony/Component/Console/Descriptor/ApplicationDescription.php deleted file mode 100644 index cdf1493c4..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Descriptor/ApplicationDescription.php +++ /dev/null @@ -1,153 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Descriptor; - -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Command\Command; - -/** - * @author Jean-François Simon - */ -class ApplicationDescription -{ - const GLOBAL_NAMESPACE = '_global'; - - /** - * @var Application - */ - private $application; - - /** - * @var null|string - */ - private $namespace; - - /** - * @var array - */ - private $namespaces; - - /** - * @var Command[] - */ - private $commands; - - /** - * @var Command[] - */ - private $aliases; - - /** - * Constructor. - * - * @param Application $application - * @param string|null $namespace - */ - public function __construct(Application $application, $namespace = null) - { - $this->application = $application; - $this->namespace = $namespace; - } - - /** - * @return array - */ - public function getNamespaces() - { - if (null === $this->namespaces) { - $this->inspectApplication(); - } - - return $this->namespaces; - } - - /** - * @return Command[] - */ - public function getCommands() - { - if (null === $this->commands) { - $this->inspectApplication(); - } - - return $this->commands; - } - - /** - * @param string $name - * - * @return Command - * - * @throws \InvalidArgumentException - */ - public function getCommand($name) - { - if (!isset($this->commands[$name]) && !isset($this->aliases[$name])) { - throw new \InvalidArgumentException(sprintf('Command %s does not exist.', $name)); - } - - return isset($this->commands[$name]) ? $this->commands[$name] : $this->aliases[$name]; - } - - private function inspectApplication() - { - $this->commands = array(); - $this->namespaces = array(); - - $all = $this->application->all($this->namespace ? $this->application->findNamespace($this->namespace) : null); - foreach ($this->sortCommands($all) as $namespace => $commands) { - $names = array(); - - /** @var Command $command */ - foreach ($commands as $name => $command) { - if (!$command->getName()) { - continue; - } - - if ($command->getName() === $name) { - $this->commands[$name] = $command; - } else { - $this->aliases[$name] = $command; - } - - $names[] = $name; - } - - $this->namespaces[$namespace] = array('id' => $namespace, 'commands' => $names); - } - } - - /** - * @param array $commands - * - * @return array - */ - private function sortCommands(array $commands) - { - $namespacedCommands = array(); - foreach ($commands as $name => $command) { - $key = $this->application->extractNamespace($name, 1); - if (!$key) { - $key = '_global'; - } - - $namespacedCommands[$key][$name] = $command; - } - ksort($namespacedCommands); - - foreach ($namespacedCommands as &$commands) { - ksort($commands); - } - - return $namespacedCommands; - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Descriptor/Descriptor.php b/vendor/symfony/console/Symfony/Component/Console/Descriptor/Descriptor.php deleted file mode 100644 index ab7acc63d..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Descriptor/Descriptor.php +++ /dev/null @@ -1,119 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Descriptor; - -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputDefinition; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * @author Jean-François Simon - */ -abstract class Descriptor implements DescriptorInterface -{ - /** - * @var OutputInterface - */ - private $output; - - /** - * {@inheritdoc} - */ - public function describe(OutputInterface $output, $object, array $options = array()) - { - $this->output = $output; - - switch (true) { - case $object instanceof InputArgument: - $this->describeInputArgument($object, $options); - break; - case $object instanceof InputOption: - $this->describeInputOption($object, $options); - break; - case $object instanceof InputDefinition: - $this->describeInputDefinition($object, $options); - break; - case $object instanceof Command: - $this->describeCommand($object, $options); - break; - case $object instanceof Application: - $this->describeApplication($object, $options); - break; - default: - throw new \InvalidArgumentException(sprintf('Object of type "%s" is not describable.', get_class($object))); - } - } - - /** - * Writes content to output. - * - * @param string $content - * @param bool $decorated - */ - protected function write($content, $decorated = false) - { - $this->output->write($content, false, $decorated ? OutputInterface::OUTPUT_NORMAL : OutputInterface::OUTPUT_RAW); - } - - /** - * Describes an InputArgument instance. - * - * @param InputArgument $argument - * @param array $options - * - * @return string|mixed - */ - abstract protected function describeInputArgument(InputArgument $argument, array $options = array()); - - /** - * Describes an InputOption instance. - * - * @param InputOption $option - * @param array $options - * - * @return string|mixed - */ - abstract protected function describeInputOption(InputOption $option, array $options = array()); - - /** - * Describes an InputDefinition instance. - * - * @param InputDefinition $definition - * @param array $options - * - * @return string|mixed - */ - abstract protected function describeInputDefinition(InputDefinition $definition, array $options = array()); - - /** - * Describes a Command instance. - * - * @param Command $command - * @param array $options - * - * @return string|mixed - */ - abstract protected function describeCommand(Command $command, array $options = array()); - - /** - * Describes an Application instance. - * - * @param Application $application - * @param array $options - * - * @return string|mixed - */ - abstract protected function describeApplication(Application $application, array $options = array()); -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Descriptor/DescriptorInterface.php b/vendor/symfony/console/Symfony/Component/Console/Descriptor/DescriptorInterface.php deleted file mode 100644 index 3929b6d9e..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Descriptor/DescriptorInterface.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Descriptor; - -use Symfony\Component\Console\Output\OutputInterface; - -/** - * Descriptor interface. - * - * @author Jean-François Simon - */ -interface DescriptorInterface -{ - /** - * Describes an InputArgument instance. - * - * @param OutputInterface $output - * @param object $object - * @param array $options - */ - public function describe(OutputInterface $output, $object, array $options = array()); -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Descriptor/JsonDescriptor.php b/vendor/symfony/console/Symfony/Component/Console/Descriptor/JsonDescriptor.php deleted file mode 100644 index 05adf0fbd..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Descriptor/JsonDescriptor.php +++ /dev/null @@ -1,165 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Descriptor; - -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputDefinition; -use Symfony\Component\Console\Input\InputOption; - -/** - * JSON descriptor. - * - * @author Jean-François Simon - */ -class JsonDescriptor extends Descriptor -{ - /** - * {@inheritdoc} - */ - protected function describeInputArgument(InputArgument $argument, array $options = array()) - { - $this->writeData($this->getInputArgumentData($argument), $options); - } - - /** - * {@inheritdoc} - */ - protected function describeInputOption(InputOption $option, array $options = array()) - { - $this->writeData($this->getInputOptionData($option), $options); - } - - /** - * {@inheritdoc} - */ - protected function describeInputDefinition(InputDefinition $definition, array $options = array()) - { - $this->writeData($this->getInputDefinitionData($definition), $options); - } - - /** - * {@inheritdoc} - */ - protected function describeCommand(Command $command, array $options = array()) - { - $this->writeData($this->getCommandData($command), $options); - } - - /** - * {@inheritdoc} - */ - protected function describeApplication(Application $application, array $options = array()) - { - $describedNamespace = isset($options['namespace']) ? $options['namespace'] : null; - $description = new ApplicationDescription($application, $describedNamespace); - $commands = array(); - - foreach ($description->getCommands() as $command) { - $commands[] = $this->getCommandData($command); - } - - $data = $describedNamespace - ? array('commands' => $commands, 'namespace' => $describedNamespace) - : array('commands' => $commands, 'namespaces' => array_values($description->getNamespaces())); - - $this->writeData($data, $options); - } - - /** - * Writes data as json. - * - * @param array $data - * @param array $options - * - * @return array|string - */ - private function writeData(array $data, array $options) - { - $this->write(json_encode($data, isset($options['json_encoding']) ? $options['json_encoding'] : 0)); - } - - /** - * @param InputArgument $argument - * - * @return array - */ - private function getInputArgumentData(InputArgument $argument) - { - return array( - 'name' => $argument->getName(), - 'is_required' => $argument->isRequired(), - 'is_array' => $argument->isArray(), - 'description' => $argument->getDescription(), - 'default' => $argument->getDefault(), - ); - } - - /** - * @param InputOption $option - * - * @return array - */ - private function getInputOptionData(InputOption $option) - { - return array( - 'name' => '--'.$option->getName(), - 'shortcut' => $option->getShortcut() ? '-'.implode('|-', explode('|', $option->getShortcut())) : '', - 'accept_value' => $option->acceptValue(), - 'is_value_required' => $option->isValueRequired(), - 'is_multiple' => $option->isArray(), - 'description' => $option->getDescription(), - 'default' => $option->getDefault(), - ); - } - - /** - * @param InputDefinition $definition - * - * @return array - */ - private function getInputDefinitionData(InputDefinition $definition) - { - $inputArguments = array(); - foreach ($definition->getArguments() as $name => $argument) { - $inputArguments[$name] = $this->getInputArgumentData($argument); - } - - $inputOptions = array(); - foreach ($definition->getOptions() as $name => $option) { - $inputOptions[$name] = $this->getInputOptionData($option); - } - - return array('arguments' => $inputArguments, 'options' => $inputOptions); - } - - /** - * @param Command $command - * - * @return array - */ - private function getCommandData(Command $command) - { - $command->getSynopsis(); - $command->mergeApplicationDefinition(false); - - return array( - 'name' => $command->getName(), - 'usage' => $command->getSynopsis(), - 'description' => $command->getDescription(), - 'help' => $command->getProcessedHelp(), - 'aliases' => $command->getAliases(), - 'definition' => $this->getInputDefinitionData($command->getNativeDefinition()), - ); - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Descriptor/MarkdownDescriptor.php b/vendor/symfony/console/Symfony/Component/Console/Descriptor/MarkdownDescriptor.php deleted file mode 100644 index 7bc580852..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Descriptor/MarkdownDescriptor.php +++ /dev/null @@ -1,139 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Descriptor; - -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputDefinition; -use Symfony\Component\Console\Input\InputOption; - -/** - * Markdown descriptor. - * - * @author Jean-François Simon - */ -class MarkdownDescriptor extends Descriptor -{ - /** - * {@inheritdoc} - */ - protected function describeInputArgument(InputArgument $argument, array $options = array()) - { - $this->write( - '**'.$argument->getName().':**'."\n\n" - .'* Name: '.($argument->getName() ?: '')."\n" - .'* Is required: '.($argument->isRequired() ? 'yes' : 'no')."\n" - .'* Is array: '.($argument->isArray() ? 'yes' : 'no')."\n" - .'* Description: '.($argument->getDescription() ?: '')."\n" - .'* Default: `'.str_replace("\n", '', var_export($argument->getDefault(), true)).'`' - ); - } - - /** - * {@inheritdoc} - */ - protected function describeInputOption(InputOption $option, array $options = array()) - { - $this->write( - '**'.$option->getName().':**'."\n\n" - .'* Name: `--'.$option->getName().'`'."\n" - .'* Shortcut: '.($option->getShortcut() ? '`-'.implode('|-', explode('|', $option->getShortcut())).'`' : '')."\n" - .'* Accept value: '.($option->acceptValue() ? 'yes' : 'no')."\n" - .'* Is value required: '.($option->isValueRequired() ? 'yes' : 'no')."\n" - .'* Is multiple: '.($option->isArray() ? 'yes' : 'no')."\n" - .'* Description: '.($option->getDescription() ?: '')."\n" - .'* Default: `'.str_replace("\n", '', var_export($option->getDefault(), true)).'`' - ); - } - - /** - * {@inheritdoc} - */ - protected function describeInputDefinition(InputDefinition $definition, array $options = array()) - { - if ($showArguments = count($definition->getArguments()) > 0) { - $this->write('### Arguments:'); - foreach ($definition->getArguments() as $argument) { - $this->write("\n\n"); - $this->write($this->describeInputArgument($argument)); - } - } - - if (count($definition->getOptions()) > 0) { - if ($showArguments) { - $this->write("\n\n"); - } - - $this->write('### Options:'); - foreach ($definition->getOptions() as $option) { - $this->write("\n\n"); - $this->write($this->describeInputOption($option)); - } - } - } - - /** - * {@inheritdoc} - */ - protected function describeCommand(Command $command, array $options = array()) - { - $command->getSynopsis(); - $command->mergeApplicationDefinition(false); - - $this->write( - $command->getName()."\n" - .str_repeat('-', strlen($command->getName()))."\n\n" - .'* Description: '.($command->getDescription() ?: '')."\n" - .'* Usage: `'.$command->getSynopsis().'`'."\n" - .'* Aliases: '.(count($command->getAliases()) ? '`'.implode('`, `', $command->getAliases()).'`' : '') - ); - - if ($help = $command->getProcessedHelp()) { - $this->write("\n\n"); - $this->write($help); - } - - if ($definition = $command->getNativeDefinition()) { - $this->write("\n\n"); - $this->describeInputDefinition($command->getNativeDefinition()); - } - } - - /** - * {@inheritdoc} - */ - protected function describeApplication(Application $application, array $options = array()) - { - $describedNamespace = isset($options['namespace']) ? $options['namespace'] : null; - $description = new ApplicationDescription($application, $describedNamespace); - - $this->write($application->getName()."\n".str_repeat('=', strlen($application->getName()))); - - foreach ($description->getNamespaces() as $namespace) { - if (ApplicationDescription::GLOBAL_NAMESPACE !== $namespace['id']) { - $this->write("\n\n"); - $this->write('**'.$namespace['id'].':**'); - } - - $this->write("\n\n"); - $this->write(implode("\n", array_map(function ($commandName) { - return '* '.$commandName; - } , $namespace['commands']))); - } - - foreach ($description->getCommands() as $command) { - $this->write("\n\n"); - $this->write($this->describeCommand($command)); - } - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Descriptor/TextDescriptor.php b/vendor/symfony/console/Symfony/Component/Console/Descriptor/TextDescriptor.php deleted file mode 100644 index f979fa7db..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Descriptor/TextDescriptor.php +++ /dev/null @@ -1,229 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Descriptor; - -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputDefinition; -use Symfony\Component\Console\Input\InputOption; - -/** - * Text descriptor. - * - * @author Jean-François Simon - */ -class TextDescriptor extends Descriptor -{ - /** - * {@inheritdoc} - */ - protected function describeInputArgument(InputArgument $argument, array $options = array()) - { - if (null !== $argument->getDefault() && (!is_array($argument->getDefault()) || count($argument->getDefault()))) { - $default = sprintf(' (default: %s)', $this->formatDefaultValue($argument->getDefault())); - } else { - $default = ''; - } - - $nameWidth = isset($options['name_width']) ? $options['name_width'] : strlen($argument->getName()); - - $this->writeText(sprintf(" %-${nameWidth}s %s%s", - $argument->getName(), - str_replace("\n", "\n".str_repeat(' ', $nameWidth + 2), $argument->getDescription()), - $default - ), $options); - } - - /** - * {@inheritdoc} - */ - protected function describeInputOption(InputOption $option, array $options = array()) - { - if ($option->acceptValue() && null !== $option->getDefault() && (!is_array($option->getDefault()) || count($option->getDefault()))) { - $default = sprintf(' (default: %s)', $this->formatDefaultValue($option->getDefault())); - } else { - $default = ''; - } - - $nameWidth = isset($options['name_width']) ? $options['name_width'] : strlen($option->getName()); - $nameWithShortcutWidth = $nameWidth - strlen($option->getName()) - 2; - - $this->writeText(sprintf(" %s %-${nameWithShortcutWidth}s%s%s%s", - '--'.$option->getName(), - $option->getShortcut() ? sprintf('(-%s) ', $option->getShortcut()) : '', - str_replace("\n", "\n".str_repeat(' ', $nameWidth + 2), $option->getDescription()), - $default, - $option->isArray() ? ' (multiple values allowed)' : '' - ), $options); - } - - /** - * {@inheritdoc} - */ - protected function describeInputDefinition(InputDefinition $definition, array $options = array()) - { - $nameWidth = 0; - foreach ($definition->getOptions() as $option) { - $nameLength = strlen($option->getName()) + 2; - if ($option->getShortcut()) { - $nameLength += strlen($option->getShortcut()) + 3; - } - $nameWidth = max($nameWidth, $nameLength); - } - foreach ($definition->getArguments() as $argument) { - $nameWidth = max($nameWidth, strlen($argument->getName())); - } - ++$nameWidth; - - if ($definition->getArguments()) { - $this->writeText('Arguments:', $options); - $this->writeText("\n"); - foreach ($definition->getArguments() as $argument) { - $this->describeInputArgument($argument, array_merge($options, array('name_width' => $nameWidth))); - $this->writeText("\n"); - } - } - - if ($definition->getArguments() && $definition->getOptions()) { - $this->writeText("\n"); - } - - if ($definition->getOptions()) { - $this->writeText('Options:', $options); - $this->writeText("\n"); - foreach ($definition->getOptions() as $option) { - $this->describeInputOption($option, array_merge($options, array('name_width' => $nameWidth))); - $this->writeText("\n"); - } - } - } - - /** - * {@inheritdoc} - */ - protected function describeCommand(Command $command, array $options = array()) - { - $command->getSynopsis(); - $command->mergeApplicationDefinition(false); - - $this->writeText('Usage:', $options); - $this->writeText("\n"); - $this->writeText(' '.$command->getSynopsis(), $options); - $this->writeText("\n"); - - if (count($command->getAliases()) > 0) { - $this->writeText("\n"); - $this->writeText('Aliases: '.implode(', ', $command->getAliases()).'', $options); - } - - if ($definition = $command->getNativeDefinition()) { - $this->writeText("\n"); - $this->describeInputDefinition($definition, $options); - } - - $this->writeText("\n"); - - if ($help = $command->getProcessedHelp()) { - $this->writeText('Help:', $options); - $this->writeText("\n"); - $this->writeText(' '.str_replace("\n", "\n ", $help), $options); - $this->writeText("\n"); - } - } - - /** - * {@inheritdoc} - */ - protected function describeApplication(Application $application, array $options = array()) - { - $describedNamespace = isset($options['namespace']) ? $options['namespace'] : null; - $description = new ApplicationDescription($application, $describedNamespace); - - if (isset($options['raw_text']) && $options['raw_text']) { - $width = $this->getColumnWidth($description->getCommands()); - - foreach ($description->getCommands() as $command) { - $this->writeText(sprintf("%-${width}s %s", $command->getName(), $command->getDescription()), $options); - $this->writeText("\n"); - } - } else { - $width = $this->getColumnWidth($description->getCommands()); - - $this->writeText($application->getHelp(), $options); - $this->writeText("\n\n"); - - if ($describedNamespace) { - $this->writeText(sprintf("Available commands for the \"%s\" namespace:", $describedNamespace), $options); - } else { - $this->writeText('Available commands:', $options); - } - - // add commands by namespace - foreach ($description->getNamespaces() as $namespace) { - if (!$describedNamespace && ApplicationDescription::GLOBAL_NAMESPACE !== $namespace['id']) { - $this->writeText("\n"); - $this->writeText(''.$namespace['id'].'', $options); - } - - foreach ($namespace['commands'] as $name) { - $this->writeText("\n"); - $this->writeText(sprintf(" %-${width}s %s", $name, $description->getCommand($name)->getDescription()), $options); - } - } - - $this->writeText("\n"); - } - } - - /** - * {@inheritdoc} - */ - private function writeText($content, array $options = array()) - { - $this->write( - isset($options['raw_text']) && $options['raw_text'] ? strip_tags($content) : $content, - isset($options['raw_output']) ? !$options['raw_output'] : true - ); - } - - /** - * Formats input option/argument default value. - * - * @param mixed $default - * - * @return string - */ - private function formatDefaultValue($default) - { - if (version_compare(PHP_VERSION, '5.4', '<')) { - return str_replace('\/', '/', json_encode($default)); - } - - return json_encode($default, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); - } - - /** - * @param Command[] $commands - * - * @return int - */ - private function getColumnWidth(array $commands) - { - $width = 0; - foreach ($commands as $command) { - $width = strlen($command->getName()) > $width ? strlen($command->getName()) : $width; - } - - return $width + 2; - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Descriptor/XmlDescriptor.php b/vendor/symfony/console/Symfony/Component/Console/Descriptor/XmlDescriptor.php deleted file mode 100644 index ac1e25e3a..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Descriptor/XmlDescriptor.php +++ /dev/null @@ -1,264 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Descriptor; - -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputArgument; -use Symfony\Component\Console\Input\InputDefinition; -use Symfony\Component\Console\Input\InputOption; - -/** - * XML descriptor. - * - * @author Jean-François Simon - */ -class XmlDescriptor extends Descriptor -{ - /** - * @param InputDefinition $definition - * - * @return \DOMDocument - */ - public function getInputDefinitionDocument(InputDefinition $definition) - { - $dom = new \DOMDocument('1.0', 'UTF-8'); - $dom->appendChild($definitionXML = $dom->createElement('definition')); - - $definitionXML->appendChild($argumentsXML = $dom->createElement('arguments')); - foreach ($definition->getArguments() as $argument) { - $this->appendDocument($argumentsXML, $this->getInputArgumentDocument($argument)); - } - - $definitionXML->appendChild($optionsXML = $dom->createElement('options')); - foreach ($definition->getOptions() as $option) { - $this->appendDocument($optionsXML, $this->getInputOptionDocument($option)); - } - - return $dom; - } - - /** - * @param Command $command - * - * @return \DOMDocument - */ - public function getCommandDocument(Command $command) - { - $dom = new \DOMDocument('1.0', 'UTF-8'); - $dom->appendChild($commandXML = $dom->createElement('command')); - - $command->getSynopsis(); - $command->mergeApplicationDefinition(false); - - $commandXML->setAttribute('id', $command->getName()); - $commandXML->setAttribute('name', $command->getName()); - - $commandXML->appendChild($usageXML = $dom->createElement('usage')); - $usageXML->appendChild($dom->createTextNode(sprintf($command->getSynopsis(), ''))); - - $commandXML->appendChild($descriptionXML = $dom->createElement('description')); - $descriptionXML->appendChild($dom->createTextNode(str_replace("\n", "\n ", $command->getDescription()))); - - $commandXML->appendChild($helpXML = $dom->createElement('help')); - $helpXML->appendChild($dom->createTextNode(str_replace("\n", "\n ", $command->getProcessedHelp()))); - - $commandXML->appendChild($aliasesXML = $dom->createElement('aliases')); - foreach ($command->getAliases() as $alias) { - $aliasesXML->appendChild($aliasXML = $dom->createElement('alias')); - $aliasXML->appendChild($dom->createTextNode($alias)); - } - - $definitionXML = $this->getInputDefinitionDocument($command->getNativeDefinition()); - $this->appendDocument($commandXML, $definitionXML->getElementsByTagName('definition')->item(0)); - - return $dom; - } - - /** - * @param Application $application - * @param string|null $namespace - * - * @return \DOMDocument - */ - public function getApplicationDocument(Application $application, $namespace = null) - { - $dom = new \DOMDocument('1.0', 'UTF-8'); - $dom->appendChild($rootXml = $dom->createElement('symfony')); - - if ($application->getName() !== 'UNKNOWN') { - $rootXml->setAttribute('name', $application->getName()); - if ($application->getVersion() !== 'UNKNOWN') { - $rootXml->setAttribute('version', $application->getVersion()); - } - } - - $rootXml->appendChild($commandsXML = $dom->createElement('commands')); - - $description = new ApplicationDescription($application, $namespace); - - if ($namespace) { - $commandsXML->setAttribute('namespace', $namespace); - } - - foreach ($description->getCommands() as $command) { - $this->appendDocument($commandsXML, $this->getCommandDocument($command)); - } - - if (!$namespace) { - $rootXml->appendChild($namespacesXML = $dom->createElement('namespaces')); - - foreach ($description->getNamespaces() as $namespaceDescription) { - $namespacesXML->appendChild($namespaceArrayXML = $dom->createElement('namespace')); - $namespaceArrayXML->setAttribute('id', $namespaceDescription['id']); - - foreach ($namespaceDescription['commands'] as $name) { - $namespaceArrayXML->appendChild($commandXML = $dom->createElement('command')); - $commandXML->appendChild($dom->createTextNode($name)); - } - } - } - - return $dom; - } - - /** - * {@inheritdoc} - */ - protected function describeInputArgument(InputArgument $argument, array $options = array()) - { - $this->writeDocument($this->getInputArgumentDocument($argument)); - } - - /** - * {@inheritdoc} - */ - protected function describeInputOption(InputOption $option, array $options = array()) - { - $this->writeDocument($this->getInputOptionDocument($option)); - } - - /** - * {@inheritdoc} - */ - protected function describeInputDefinition(InputDefinition $definition, array $options = array()) - { - $this->writeDocument($this->getInputDefinitionDocument($definition)); - } - - /** - * {@inheritdoc} - */ - protected function describeCommand(Command $command, array $options = array()) - { - $this->writeDocument($this->getCommandDocument($command)); - } - - /** - * {@inheritdoc} - */ - protected function describeApplication(Application $application, array $options = array()) - { - $this->writeDocument($this->getApplicationDocument($application, isset($options['namespace']) ? $options['namespace'] : null)); - } - - /** - * Appends document children to parent node. - * - * @param \DOMNode $parentNode - * @param \DOMNode $importedParent - */ - private function appendDocument(\DOMNode $parentNode, \DOMNode $importedParent) - { - foreach ($importedParent->childNodes as $childNode) { - $parentNode->appendChild($parentNode->ownerDocument->importNode($childNode, true)); - } - } - - /** - * Writes DOM document. - * - * @param \DOMDocument $dom - * - * @return \DOMDocument|string - */ - private function writeDocument(\DOMDocument $dom) - { - $dom->formatOutput = true; - $this->write($dom->saveXML()); - } - - /** - * @param InputArgument $argument - * - * @return \DOMDocument - */ - private function getInputArgumentDocument(InputArgument $argument) - { - $dom = new \DOMDocument('1.0', 'UTF-8'); - - $dom->appendChild($objectXML = $dom->createElement('argument')); - $objectXML->setAttribute('name', $argument->getName()); - $objectXML->setAttribute('is_required', $argument->isRequired() ? 1 : 0); - $objectXML->setAttribute('is_array', $argument->isArray() ? 1 : 0); - $objectXML->appendChild($descriptionXML = $dom->createElement('description')); - $descriptionXML->appendChild($dom->createTextNode($argument->getDescription())); - - $objectXML->appendChild($defaultsXML = $dom->createElement('defaults')); - $defaults = is_array($argument->getDefault()) ? $argument->getDefault() : (is_bool($argument->getDefault()) ? array(var_export($argument->getDefault(), true)) : ($argument->getDefault() ? array($argument->getDefault()) : array())); - foreach ($defaults as $default) { - $defaultsXML->appendChild($defaultXML = $dom->createElement('default')); - $defaultXML->appendChild($dom->createTextNode($default)); - } - - return $dom; - } - - /** - * @param InputOption $option - * - * @return \DOMDocument - */ - private function getInputOptionDocument(InputOption $option) - { - $dom = new \DOMDocument('1.0', 'UTF-8'); - - $dom->appendChild($objectXML = $dom->createElement('option')); - $objectXML->setAttribute('name', '--'.$option->getName()); - $pos = strpos($option->getShortcut(), '|'); - if (false !== $pos) { - $objectXML->setAttribute('shortcut', '-'.substr($option->getShortcut(), 0, $pos)); - $objectXML->setAttribute('shortcuts', '-'.implode('|-', explode('|', $option->getShortcut()))); - } else { - $objectXML->setAttribute('shortcut', $option->getShortcut() ? '-'.$option->getShortcut() : ''); - } - $objectXML->setAttribute('accept_value', $option->acceptValue() ? 1 : 0); - $objectXML->setAttribute('is_value_required', $option->isValueRequired() ? 1 : 0); - $objectXML->setAttribute('is_multiple', $option->isArray() ? 1 : 0); - $objectXML->appendChild($descriptionXML = $dom->createElement('description')); - $descriptionXML->appendChild($dom->createTextNode($option->getDescription())); - - if ($option->acceptValue()) { - $defaults = is_array($option->getDefault()) ? $option->getDefault() : (is_bool($option->getDefault()) ? array(var_export($option->getDefault(), true)) : ($option->getDefault() ? array($option->getDefault()) : array())); - $objectXML->appendChild($defaultsXML = $dom->createElement('defaults')); - - if (!empty($defaults)) { - foreach ($defaults as $default) { - $defaultsXML->appendChild($defaultXML = $dom->createElement('default')); - $defaultXML->appendChild($dom->createTextNode($default)); - } - } - } - - return $dom; - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Event/ConsoleCommandEvent.php b/vendor/symfony/console/Symfony/Component/Console/Event/ConsoleCommandEvent.php deleted file mode 100644 index 47ac68b68..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Event/ConsoleCommandEvent.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Event; - -/** - * Allows to do things before the command is executed. - * - * @author Fabien Potencier - */ -class ConsoleCommandEvent extends ConsoleEvent -{ -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Event/ConsoleEvent.php b/vendor/symfony/console/Symfony/Component/Console/Event/ConsoleEvent.php deleted file mode 100644 index ab620c460..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Event/ConsoleEvent.php +++ /dev/null @@ -1,67 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Event; - -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\EventDispatcher\Event; - -/** - * Allows to inspect input and output of a command. - * - * @author Francesco Levorato - */ -class ConsoleEvent extends Event -{ - protected $command; - - private $input; - private $output; - - public function __construct(Command $command, InputInterface $input, OutputInterface $output) - { - $this->command = $command; - $this->input = $input; - $this->output = $output; - } - - /** - * Gets the command that is executed. - * - * @return Command A Command instance - */ - public function getCommand() - { - return $this->command; - } - - /** - * Gets the input instance. - * - * @return InputInterface An InputInterface instance - */ - public function getInput() - { - return $this->input; - } - - /** - * Gets the output instance. - * - * @return OutputInterface An OutputInterface instance - */ - public function getOutput() - { - return $this->output; - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Event/ConsoleExceptionEvent.php b/vendor/symfony/console/Symfony/Component/Console/Event/ConsoleExceptionEvent.php deleted file mode 100644 index 7075903cc..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Event/ConsoleExceptionEvent.php +++ /dev/null @@ -1,67 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Event; - -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * Allows to handle exception thrown in a command. - * - * @author Fabien Potencier - */ -class ConsoleExceptionEvent extends ConsoleEvent -{ - private $exception; - private $exitCode; - - public function __construct(Command $command, InputInterface $input, OutputInterface $output, \Exception $exception, $exitCode) - { - parent::__construct($command, $input, $output); - - $this->setException($exception); - $this->exitCode = (int) $exitCode; - } - - /** - * Returns the thrown exception. - * - * @return \Exception The thrown exception - */ - public function getException() - { - return $this->exception; - } - - /** - * Replaces the thrown exception. - * - * This exception will be thrown if no response is set in the event. - * - * @param \Exception $exception The thrown exception - */ - public function setException(\Exception $exception) - { - $this->exception = $exception; - } - - /** - * Gets the exit code. - * - * @return int The command exit code - */ - public function getExitCode() - { - return $this->exitCode; - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Event/ConsoleTerminateEvent.php b/vendor/symfony/console/Symfony/Component/Console/Event/ConsoleTerminateEvent.php deleted file mode 100644 index ea3318d06..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Event/ConsoleTerminateEvent.php +++ /dev/null @@ -1,58 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Event; - -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * Allows to manipulate the exit code of a command after its execution. - * - * @author Francesco Levorato - */ -class ConsoleTerminateEvent extends ConsoleEvent -{ - /** - * The exit code of the command. - * - * @var int - */ - private $exitCode; - - public function __construct(Command $command, InputInterface $input, OutputInterface $output, $exitCode) - { - parent::__construct($command, $input, $output); - - $this->setExitCode($exitCode); - } - - /** - * Sets the exit code. - * - * @param int $exitCode The command exit code - */ - public function setExitCode($exitCode) - { - $this->exitCode = (int) $exitCode; - } - - /** - * Gets the exit code. - * - * @return int The command exit code - */ - public function getExitCode() - { - return $this->exitCode; - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Formatter/OutputFormatter.php b/vendor/symfony/console/Symfony/Component/Console/Formatter/OutputFormatter.php deleted file mode 100644 index ca5f28731..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Formatter/OutputFormatter.php +++ /dev/null @@ -1,236 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Formatter; - -/** - * Formatter class for console output. - * - * @author Konstantin Kudryashov - * - * @api - */ -class OutputFormatter implements OutputFormatterInterface -{ - private $decorated; - private $styles = array(); - private $styleStack; - - /** - * Escapes "<" special char in given text. - * - * @param string $text Text to escape - * - * @return string Escaped text - */ - public static function escape($text) - { - return preg_replace('/([^\\\\]?) FormatterStyle" instances - * - * @api - */ - public function __construct($decorated = false, array $styles = array()) - { - $this->decorated = (bool) $decorated; - - $this->setStyle('error', new OutputFormatterStyle('white', 'red')); - $this->setStyle('info', new OutputFormatterStyle('green')); - $this->setStyle('comment', new OutputFormatterStyle('yellow')); - $this->setStyle('question', new OutputFormatterStyle('black', 'cyan')); - - foreach ($styles as $name => $style) { - $this->setStyle($name, $style); - } - - $this->styleStack = new OutputFormatterStyleStack(); - } - - /** - * Sets the decorated flag. - * - * @param bool $decorated Whether to decorate the messages or not - * - * @api - */ - public function setDecorated($decorated) - { - $this->decorated = (bool) $decorated; - } - - /** - * Gets the decorated flag. - * - * @return bool true if the output will decorate messages, false otherwise - * - * @api - */ - public function isDecorated() - { - return $this->decorated; - } - - /** - * Sets a new style. - * - * @param string $name The style name - * @param OutputFormatterStyleInterface $style The style instance - * - * @api - */ - public function setStyle($name, OutputFormatterStyleInterface $style) - { - $this->styles[strtolower($name)] = $style; - } - - /** - * Checks if output formatter has style with specified name. - * - * @param string $name - * - * @return bool - * - * @api - */ - public function hasStyle($name) - { - return isset($this->styles[strtolower($name)]); - } - - /** - * Gets style options from style with specified name. - * - * @param string $name - * - * @return OutputFormatterStyleInterface - * - * @throws \InvalidArgumentException When style isn't defined - * - * @api - */ - public function getStyle($name) - { - if (!$this->hasStyle($name)) { - throw new \InvalidArgumentException(sprintf('Undefined style: %s', $name)); - } - - return $this->styles[strtolower($name)]; - } - - /** - * Formats a message according to the given styles. - * - * @param string $message The message to style - * - * @return string The styled message - * - * @api - */ - public function format($message) - { - $offset = 0; - $output = ''; - $tagRegex = '[a-z][a-z0-9_=;-]*'; - preg_match_all("#<(($tagRegex) | /($tagRegex)?)>#isx", $message, $matches, PREG_OFFSET_CAPTURE); - foreach ($matches[0] as $i => $match) { - $pos = $match[1]; - $text = $match[0]; - - // add the text up to the next tag - $output .= $this->applyCurrentStyle(substr($message, $offset, $pos - $offset)); - $offset = $pos + strlen($text); - - // opening tag? - if ($open = '/' != $text[1]) { - $tag = $matches[1][$i][0]; - } else { - $tag = isset($matches[3][$i][0]) ? $matches[3][$i][0] : ''; - } - - if (!$open && !$tag) { - // - $this->styleStack->pop(); - } elseif ($pos && '\\' == $message[$pos - 1]) { - // escaped tag - $output .= $this->applyCurrentStyle($text); - } elseif (false === $style = $this->createStyleFromString(strtolower($tag))) { - $output .= $this->applyCurrentStyle($text); - } elseif ($open) { - $this->styleStack->push($style); - } else { - $this->styleStack->pop($style); - } - } - - $output .= $this->applyCurrentStyle(substr($message, $offset)); - - return str_replace('\\<', '<', $output); - } - - /** - * @return OutputFormatterStyleStack - */ - public function getStyleStack() - { - return $this->styleStack; - } - - /** - * Tries to create new style instance from string. - * - * @param string $string - * - * @return OutputFormatterStyle|bool false if string is not format string - */ - private function createStyleFromString($string) - { - if (isset($this->styles[$string])) { - return $this->styles[$string]; - } - - if (!preg_match_all('/([^=]+)=([^;]+)(;|$)/', strtolower($string), $matches, PREG_SET_ORDER)) { - return false; - } - - $style = new OutputFormatterStyle(); - foreach ($matches as $match) { - array_shift($match); - - if ('fg' == $match[0]) { - $style->setForeground($match[1]); - } elseif ('bg' == $match[0]) { - $style->setBackground($match[1]); - } else { - $style->setOption($match[1]); - } - } - - return $style; - } - - /** - * Applies current style from stack to text, if must be applied. - * - * @param string $text Input text - * - * @return string Styled text - */ - private function applyCurrentStyle($text) - { - return $this->isDecorated() && strlen($text) > 0 ? $this->styleStack->getCurrent()->apply($text) : $text; - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Formatter/OutputFormatterInterface.php b/vendor/symfony/console/Symfony/Component/Console/Formatter/OutputFormatterInterface.php deleted file mode 100644 index 151adcd57..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Formatter/OutputFormatterInterface.php +++ /dev/null @@ -1,83 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Formatter; - -/** - * Formatter interface for console output. - * - * @author Konstantin Kudryashov - * - * @api - */ -interface OutputFormatterInterface -{ - /** - * Sets the decorated flag. - * - * @param bool $decorated Whether to decorate the messages or not - * - * @api - */ - public function setDecorated($decorated); - - /** - * Gets the decorated flag. - * - * @return bool true if the output will decorate messages, false otherwise - * - * @api - */ - public function isDecorated(); - - /** - * Sets a new style. - * - * @param string $name The style name - * @param OutputFormatterStyleInterface $style The style instance - * - * @api - */ - public function setStyle($name, OutputFormatterStyleInterface $style); - - /** - * Checks if output formatter has style with specified name. - * - * @param string $name - * - * @return bool - * - * @api - */ - public function hasStyle($name); - - /** - * Gets style options from style with specified name. - * - * @param string $name - * - * @return OutputFormatterStyleInterface - * - * @api - */ - public function getStyle($name); - - /** - * Formats a message according to the given styles. - * - * @param string $message The message to style - * - * @return string The styled message - * - * @api - */ - public function format($message); -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Formatter/OutputFormatterStyle.php b/vendor/symfony/console/Symfony/Component/Console/Formatter/OutputFormatterStyle.php deleted file mode 100644 index 5019cdaba..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Formatter/OutputFormatterStyle.php +++ /dev/null @@ -1,228 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Formatter; - -/** - * Formatter style class for defining styles. - * - * @author Konstantin Kudryashov - * - * @api - */ -class OutputFormatterStyle implements OutputFormatterStyleInterface -{ - private static $availableForegroundColors = array( - 'black' => array('set' => 30, 'unset' => 39), - 'red' => array('set' => 31, 'unset' => 39), - 'green' => array('set' => 32, 'unset' => 39), - 'yellow' => array('set' => 33, 'unset' => 39), - 'blue' => array('set' => 34, 'unset' => 39), - 'magenta' => array('set' => 35, 'unset' => 39), - 'cyan' => array('set' => 36, 'unset' => 39), - 'white' => array('set' => 37, 'unset' => 39) - ); - private static $availableBackgroundColors = array( - 'black' => array('set' => 40, 'unset' => 49), - 'red' => array('set' => 41, 'unset' => 49), - 'green' => array('set' => 42, 'unset' => 49), - 'yellow' => array('set' => 43, 'unset' => 49), - 'blue' => array('set' => 44, 'unset' => 49), - 'magenta' => array('set' => 45, 'unset' => 49), - 'cyan' => array('set' => 46, 'unset' => 49), - 'white' => array('set' => 47, 'unset' => 49) - ); - private static $availableOptions = array( - 'bold' => array('set' => 1, 'unset' => 22), - 'underscore' => array('set' => 4, 'unset' => 24), - 'blink' => array('set' => 5, 'unset' => 25), - 'reverse' => array('set' => 7, 'unset' => 27), - 'conceal' => array('set' => 8, 'unset' => 28) - ); - - private $foreground; - private $background; - private $options = array(); - - /** - * Initializes output formatter style. - * - * @param string|null $foreground The style foreground color name - * @param string|null $background The style background color name - * @param array $options The style options - * - * @api - */ - public function __construct($foreground = null, $background = null, array $options = array()) - { - if (null !== $foreground) { - $this->setForeground($foreground); - } - if (null !== $background) { - $this->setBackground($background); - } - if (count($options)) { - $this->setOptions($options); - } - } - - /** - * Sets style foreground color. - * - * @param string|null $color The color name - * - * @throws \InvalidArgumentException When the color name isn't defined - * - * @api - */ - public function setForeground($color = null) - { - if (null === $color) { - $this->foreground = null; - - return; - } - - if (!isset(static::$availableForegroundColors[$color])) { - throw new \InvalidArgumentException(sprintf( - 'Invalid foreground color specified: "%s". Expected one of (%s)', - $color, - implode(', ', array_keys(static::$availableForegroundColors)) - )); - } - - $this->foreground = static::$availableForegroundColors[$color]; - } - - /** - * Sets style background color. - * - * @param string|null $color The color name - * - * @throws \InvalidArgumentException When the color name isn't defined - * - * @api - */ - public function setBackground($color = null) - { - if (null === $color) { - $this->background = null; - - return; - } - - if (!isset(static::$availableBackgroundColors[$color])) { - throw new \InvalidArgumentException(sprintf( - 'Invalid background color specified: "%s". Expected one of (%s)', - $color, - implode(', ', array_keys(static::$availableBackgroundColors)) - )); - } - - $this->background = static::$availableBackgroundColors[$color]; - } - - /** - * Sets some specific style option. - * - * @param string $option The option name - * - * @throws \InvalidArgumentException When the option name isn't defined - * - * @api - */ - public function setOption($option) - { - if (!isset(static::$availableOptions[$option])) { - throw new \InvalidArgumentException(sprintf( - 'Invalid option specified: "%s". Expected one of (%s)', - $option, - implode(', ', array_keys(static::$availableOptions)) - )); - } - - if (false === array_search(static::$availableOptions[$option], $this->options)) { - $this->options[] = static::$availableOptions[$option]; - } - } - - /** - * Unsets some specific style option. - * - * @param string $option The option name - * - * @throws \InvalidArgumentException When the option name isn't defined - * - */ - public function unsetOption($option) - { - if (!isset(static::$availableOptions[$option])) { - throw new \InvalidArgumentException(sprintf( - 'Invalid option specified: "%s". Expected one of (%s)', - $option, - implode(', ', array_keys(static::$availableOptions)) - )); - } - - $pos = array_search(static::$availableOptions[$option], $this->options); - if (false !== $pos) { - unset($this->options[$pos]); - } - } - - /** - * Sets multiple style options at once. - * - * @param array $options - */ - public function setOptions(array $options) - { - $this->options = array(); - - foreach ($options as $option) { - $this->setOption($option); - } - } - - /** - * Applies the style to a given text. - * - * @param string $text The text to style - * - * @return string - */ - public function apply($text) - { - $setCodes = array(); - $unsetCodes = array(); - - if (null !== $this->foreground) { - $setCodes[] = $this->foreground['set']; - $unsetCodes[] = $this->foreground['unset']; - } - if (null !== $this->background) { - $setCodes[] = $this->background['set']; - $unsetCodes[] = $this->background['unset']; - } - if (count($this->options)) { - foreach ($this->options as $option) { - $setCodes[] = $option['set']; - $unsetCodes[] = $option['unset']; - } - } - - if (0 === count($setCodes)) { - return $text; - } - - return sprintf("\033[%sm%s\033[%sm", implode(';', $setCodes), $text, implode(';', $unsetCodes)); - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Formatter/OutputFormatterStyleInterface.php b/vendor/symfony/console/Symfony/Component/Console/Formatter/OutputFormatterStyleInterface.php deleted file mode 100644 index e8642b3c7..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Formatter/OutputFormatterStyleInterface.php +++ /dev/null @@ -1,72 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Formatter; - -/** - * Formatter style interface for defining styles. - * - * @author Konstantin Kudryashov - * - * @api - */ -interface OutputFormatterStyleInterface -{ - /** - * Sets style foreground color. - * - * @param string $color The color name - * - * @api - */ - public function setForeground($color = null); - - /** - * Sets style background color. - * - * @param string $color The color name - * - * @api - */ - public function setBackground($color = null); - - /** - * Sets some specific style option. - * - * @param string $option The option name - * - * @api - */ - public function setOption($option); - - /** - * Unsets some specific style option. - * - * @param string $option The option name - */ - public function unsetOption($option); - - /** - * Sets multiple style options at once. - * - * @param array $options - */ - public function setOptions(array $options); - - /** - * Applies the style to a given text. - * - * @param string $text The text to style - * - * @return string - */ - public function apply($text); -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Formatter/OutputFormatterStyleStack.php b/vendor/symfony/console/Symfony/Component/Console/Formatter/OutputFormatterStyleStack.php deleted file mode 100644 index e63912ca7..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Formatter/OutputFormatterStyleStack.php +++ /dev/null @@ -1,121 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Formatter; - -/** - * @author Jean-François Simon - */ -class OutputFormatterStyleStack -{ - /** - * @var OutputFormatterStyleInterface[] - */ - private $styles; - - /** - * @var OutputFormatterStyleInterface - */ - private $emptyStyle; - - /** - * Constructor. - * - * @param OutputFormatterStyleInterface|null $emptyStyle - */ - public function __construct(OutputFormatterStyleInterface $emptyStyle = null) - { - $this->emptyStyle = $emptyStyle ?: new OutputFormatterStyle(); - $this->reset(); - } - - /** - * Resets stack (ie. empty internal arrays). - */ - public function reset() - { - $this->styles = array(); - } - - /** - * Pushes a style in the stack. - * - * @param OutputFormatterStyleInterface $style - */ - public function push(OutputFormatterStyleInterface $style) - { - $this->styles[] = $style; - } - - /** - * Pops a style from the stack. - * - * @param OutputFormatterStyleInterface|null $style - * - * @return OutputFormatterStyleInterface - * - * @throws \InvalidArgumentException When style tags incorrectly nested - */ - public function pop(OutputFormatterStyleInterface $style = null) - { - if (empty($this->styles)) { - return $this->emptyStyle; - } - - if (null === $style) { - return array_pop($this->styles); - } - - foreach (array_reverse($this->styles, true) as $index => $stackedStyle) { - if ($style->apply('') === $stackedStyle->apply('')) { - $this->styles = array_slice($this->styles, 0, $index); - - return $stackedStyle; - } - } - - throw new \InvalidArgumentException('Incorrectly nested style tag found.'); - } - - /** - * Computes current style with stacks top codes. - * - * @return OutputFormatterStyle - */ - public function getCurrent() - { - if (empty($this->styles)) { - return $this->emptyStyle; - } - - return $this->styles[count($this->styles)-1]; - } - - /** - * @param OutputFormatterStyleInterface $emptyStyle - * - * @return OutputFormatterStyleStack - */ - public function setEmptyStyle(OutputFormatterStyleInterface $emptyStyle) - { - $this->emptyStyle = $emptyStyle; - - return $this; - } - - /** - * @return OutputFormatterStyleInterface - */ - public function getEmptyStyle() - { - return $this->emptyStyle; - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Helper/DescriptorHelper.php b/vendor/symfony/console/Symfony/Component/Console/Helper/DescriptorHelper.php deleted file mode 100644 index d58e0bf14..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Helper/DescriptorHelper.php +++ /dev/null @@ -1,96 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Descriptor\DescriptorInterface; -use Symfony\Component\Console\Descriptor\JsonDescriptor; -use Symfony\Component\Console\Descriptor\MarkdownDescriptor; -use Symfony\Component\Console\Descriptor\TextDescriptor; -use Symfony\Component\Console\Descriptor\XmlDescriptor; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * This class adds helper method to describe objects in various formats. - * - * @author Jean-François Simon - */ -class DescriptorHelper extends Helper -{ - /** - * @var DescriptorInterface[] - */ - private $descriptors = array(); - - /** - * Constructor. - */ - public function __construct() - { - $this - ->register('txt', new TextDescriptor()) - ->register('xml', new XmlDescriptor()) - ->register('json', new JsonDescriptor()) - ->register('md', new MarkdownDescriptor()) - ; - } - - /** - * Describes an object if supported. - * - * Available options are: - * * format: string, the output format name - * * raw_text: boolean, sets output type as raw - * - * @param OutputInterface $output - * @param object $object - * @param array $options - * - * @throws \InvalidArgumentException when the given format is not supported - */ - public function describe(OutputInterface $output, $object, array $options = array()) - { - $options = array_merge(array( - 'raw_text' => false, - 'format' => 'txt', - ), $options); - - if (!isset($this->descriptors[$options['format']])) { - throw new \InvalidArgumentException(sprintf('Unsupported format "%s".', $options['format'])); - } - - $descriptor = $this->descriptors[$options['format']]; - $descriptor->describe($output, $object, $options); - } - - /** - * Registers a descriptor. - * - * @param string $format - * @param DescriptorInterface $descriptor - * - * @return DescriptorHelper - */ - public function register($format, DescriptorInterface $descriptor) - { - $this->descriptors[$format] = $descriptor; - - return $this; - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return 'descriptor'; - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Helper/DialogHelper.php b/vendor/symfony/console/Symfony/Component/Console/Helper/DialogHelper.php deleted file mode 100644 index 0362dd4d1..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Helper/DialogHelper.php +++ /dev/null @@ -1,476 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Formatter\OutputFormatterStyle; - -/** - * The Dialog class provides helpers to interact with the user. - * - * @author Fabien Potencier - * - * @deprecated Deprecated since version 2.5, to be removed in 3.0. - * Use the question helper instead. - */ -class DialogHelper extends InputAwareHelper -{ - private $inputStream; - private static $shell; - private static $stty; - - /** - * Asks the user to select a value. - * - * @param OutputInterface $output An Output instance - * @param string|array $question The question to ask - * @param array $choices List of choices to pick from - * @param bool|string $default The default answer if the user enters nothing - * @param bool|int $attempts Max number of times to ask before giving up (false by default, which means infinite) - * @param string $errorMessage Message which will be shown if invalid value from choice list would be picked - * @param bool $multiselect Select more than one value separated by comma - * - * @return int|string|array The selected value or values (the key of the choices array) - * - * @throws \InvalidArgumentException - */ - public function select(OutputInterface $output, $question, $choices, $default = null, $attempts = false, $errorMessage = 'Value "%s" is invalid', $multiselect = false) - { - $width = max(array_map('strlen', array_keys($choices))); - - $messages = (array) $question; - foreach ($choices as $key => $value) { - $messages[] = sprintf(" [%-${width}s] %s", $key, $value); - } - - $output->writeln($messages); - - $result = $this->askAndValidate($output, '> ', function ($picked) use ($choices, $errorMessage, $multiselect) { - // Collapse all spaces. - $selectedChoices = str_replace(" ", "", $picked); - - if ($multiselect) { - // Check for a separated comma values - if (!preg_match('/^[a-zA-Z0-9_-]+(?:,[a-zA-Z0-9_-]+)*$/', $selectedChoices, $matches)) { - throw new \InvalidArgumentException(sprintf($errorMessage, $picked)); - } - $selectedChoices = explode(",", $selectedChoices); - } else { - $selectedChoices = array($picked); - } - - $multiselectChoices = array(); - - foreach ($selectedChoices as $value) { - if (empty($choices[$value])) { - throw new \InvalidArgumentException(sprintf($errorMessage, $value)); - } - array_push($multiselectChoices, $value); - } - - if ($multiselect) { - return $multiselectChoices; - } - - return $picked; - }, $attempts, $default); - - return $result; - } - - /** - * Asks a question to the user. - * - * @param OutputInterface $output An Output instance - * @param string|array $question The question to ask - * @param string $default The default answer if none is given by the user - * @param array $autocomplete List of values to autocomplete - * - * @return string The user answer - * - * @throws \RuntimeException If there is no data to read in the input stream - */ - public function ask(OutputInterface $output, $question, $default = null, array $autocomplete = null) - { - if ($this->input && !$this->input->isInteractive()) { - return $default; - } - - $output->write($question); - - $inputStream = $this->inputStream ?: STDIN; - - if (null === $autocomplete || !$this->hasSttyAvailable()) { - $ret = fgets($inputStream, 4096); - if (false === $ret) { - throw new \RuntimeException('Aborted'); - } - $ret = trim($ret); - } else { - $ret = ''; - - $i = 0; - $ofs = -1; - $matches = $autocomplete; - $numMatches = count($matches); - - $sttyMode = shell_exec('stty -g'); - - // Disable icanon (so we can fread each keypress) and echo (we'll do echoing here instead) - shell_exec('stty -icanon -echo'); - - // Add highlighted text style - $output->getFormatter()->setStyle('hl', new OutputFormatterStyle('black', 'white')); - - // Read a keypress - while (!feof($inputStream)) { - $c = fread($inputStream, 1); - - // Backspace Character - if ("\177" === $c) { - if (0 === $numMatches && 0 !== $i) { - $i--; - // Move cursor backwards - $output->write("\033[1D"); - } - - if ($i === 0) { - $ofs = -1; - $matches = $autocomplete; - $numMatches = count($matches); - } else { - $numMatches = 0; - } - - // Pop the last character off the end of our string - $ret = substr($ret, 0, $i); - } elseif ("\033" === $c) { // Did we read an escape sequence? - $c .= fread($inputStream, 2); - - // A = Up Arrow. B = Down Arrow - if (isset($c[2]) && ('A' === $c[2] || 'B' === $c[2])) { - if ('A' === $c[2] && -1 === $ofs) { - $ofs = 0; - } - - if (0 === $numMatches) { - continue; - } - - $ofs += ('A' === $c[2]) ? -1 : 1; - $ofs = ($numMatches + $ofs) % $numMatches; - } - } elseif (ord($c) < 32) { - if ("\t" === $c || "\n" === $c) { - if ($numMatches > 0 && -1 !== $ofs) { - $ret = $matches[$ofs]; - // Echo out remaining chars for current match - $output->write(substr($ret, $i)); - $i = strlen($ret); - } - - if ("\n" === $c) { - $output->write($c); - break; - } - - $numMatches = 0; - } - - continue; - } else { - $output->write($c); - $ret .= $c; - $i++; - - $numMatches = 0; - $ofs = 0; - - foreach ($autocomplete as $value) { - // If typed characters match the beginning chunk of value (e.g. [AcmeDe]moBundle) - if (0 === strpos($value, $ret) && $i !== strlen($value)) { - $matches[$numMatches++] = $value; - } - } - } - - // Erase characters from cursor to end of line - $output->write("\033[K"); - - if ($numMatches > 0 && -1 !== $ofs) { - // Save cursor position - $output->write("\0337"); - // Write highlighted text - $output->write(''.substr($matches[$ofs], $i).''); - // Restore cursor position - $output->write("\0338"); - } - } - - // Reset stty so it behaves normally again - shell_exec(sprintf('stty %s', $sttyMode)); - } - - return strlen($ret) > 0 ? $ret : $default; - } - - /** - * Asks a confirmation to the user. - * - * The question will be asked until the user answers by nothing, yes, or no. - * - * @param OutputInterface $output An Output instance - * @param string|array $question The question to ask - * @param bool $default The default answer if the user enters nothing - * - * @return bool true if the user has confirmed, false otherwise - */ - public function askConfirmation(OutputInterface $output, $question, $default = true) - { - $answer = 'z'; - while ($answer && !in_array(strtolower($answer[0]), array('y', 'n'))) { - $answer = $this->ask($output, $question); - } - - if (false === $default) { - return $answer && 'y' == strtolower($answer[0]); - } - - return !$answer || 'y' == strtolower($answer[0]); - } - - /** - * Asks a question to the user, the response is hidden - * - * @param OutputInterface $output An Output instance - * @param string|array $question The question - * @param bool $fallback In case the response can not be hidden, whether to fallback on non-hidden question or not - * - * @return string The answer - * - * @throws \RuntimeException In case the fallback is deactivated and the response can not be hidden - */ - public function askHiddenResponse(OutputInterface $output, $question, $fallback = true) - { - if (defined('PHP_WINDOWS_VERSION_BUILD')) { - $exe = __DIR__.'/../Resources/bin/hiddeninput.exe'; - - // handle code running from a phar - if ('phar:' === substr(__FILE__, 0, 5)) { - $tmpExe = sys_get_temp_dir().'/hiddeninput.exe'; - copy($exe, $tmpExe); - $exe = $tmpExe; - } - - $output->write($question); - $value = rtrim(shell_exec($exe)); - $output->writeln(''); - - if (isset($tmpExe)) { - unlink($tmpExe); - } - - return $value; - } - - if ($this->hasSttyAvailable()) { - $output->write($question); - - $sttyMode = shell_exec('stty -g'); - - shell_exec('stty -echo'); - $value = fgets($this->inputStream ?: STDIN, 4096); - shell_exec(sprintf('stty %s', $sttyMode)); - - if (false === $value) { - throw new \RuntimeException('Aborted'); - } - - $value = trim($value); - $output->writeln(''); - - return $value; - } - - if (false !== $shell = $this->getShell()) { - $output->write($question); - $readCmd = $shell === 'csh' ? 'set mypassword = $<' : 'read -r mypassword'; - $command = sprintf("/usr/bin/env %s -c 'stty -echo; %s; stty echo; echo \$mypassword'", $shell, $readCmd); - $value = rtrim(shell_exec($command)); - $output->writeln(''); - - return $value; - } - - if ($fallback) { - return $this->ask($output, $question); - } - - throw new \RuntimeException('Unable to hide the response'); - } - - /** - * Asks for a value and validates the response. - * - * The validator receives the data to validate. It must return the - * validated data when the data is valid and throw an exception - * otherwise. - * - * @param OutputInterface $output An Output instance - * @param string|array $question The question to ask - * @param callable $validator A PHP callback - * @param int|false $attempts Max number of times to ask before giving up (false by default, which means infinite) - * @param string $default The default answer if none is given by the user - * @param array $autocomplete List of values to autocomplete - * - * @return mixed - * - * @throws \Exception When any of the validators return an error - */ - public function askAndValidate(OutputInterface $output, $question, $validator, $attempts = false, $default = null, array $autocomplete = null) - { - $that = $this; - - $interviewer = function () use ($output, $question, $default, $autocomplete, $that) { - return $that->ask($output, $question, $default, $autocomplete); - }; - - return $this->validateAttempts($interviewer, $output, $validator, $attempts); - } - - /** - * Asks for a value, hide and validates the response. - * - * The validator receives the data to validate. It must return the - * validated data when the data is valid and throw an exception - * otherwise. - * - * @param OutputInterface $output An Output instance - * @param string|array $question The question to ask - * @param callable $validator A PHP callback - * @param int|false $attempts Max number of times to ask before giving up (false by default, which means infinite) - * @param bool $fallback In case the response can not be hidden, whether to fallback on non-hidden question or not - * - * @return string The response - * - * @throws \Exception When any of the validators return an error - * @throws \RuntimeException In case the fallback is deactivated and the response can not be hidden - * - */ - public function askHiddenResponseAndValidate(OutputInterface $output, $question, $validator, $attempts = false, $fallback = true) - { - $that = $this; - - $interviewer = function () use ($output, $question, $fallback, $that) { - return $that->askHiddenResponse($output, $question, $fallback); - }; - - return $this->validateAttempts($interviewer, $output, $validator, $attempts); - } - - /** - * Sets the input stream to read from when interacting with the user. - * - * This is mainly useful for testing purpose. - * - * @param resource $stream The input stream - */ - public function setInputStream($stream) - { - $this->inputStream = $stream; - } - - /** - * Returns the helper's input stream - * - * @return string - */ - public function getInputStream() - { - return $this->inputStream; - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return 'dialog'; - } - - /** - * Return a valid Unix shell - * - * @return string|bool The valid shell name, false in case no valid shell is found - */ - private function getShell() - { - if (null !== self::$shell) { - return self::$shell; - } - - self::$shell = false; - - if (file_exists('/usr/bin/env')) { - // handle other OSs with bash/zsh/ksh/csh if available to hide the answer - $test = "/usr/bin/env %s -c 'echo OK' 2> /dev/null"; - foreach (array('bash', 'zsh', 'ksh', 'csh') as $sh) { - if ('OK' === rtrim(shell_exec(sprintf($test, $sh)))) { - self::$shell = $sh; - break; - } - } - } - - return self::$shell; - } - - private function hasSttyAvailable() - { - if (null !== self::$stty) { - return self::$stty; - } - - exec('stty 2>&1', $output, $exitcode); - - return self::$stty = $exitcode === 0; - } - - /** - * Validate an attempt - * - * @param callable $interviewer A callable that will ask for a question and return the result - * @param OutputInterface $output An Output instance - * @param callable $validator A PHP callback - * @param int|false $attempts Max number of times to ask before giving up ; false will ask infinitely - * - * @return string The validated response - * - * @throws \Exception In case the max number of attempts has been reached and no valid response has been given - */ - private function validateAttempts($interviewer, OutputInterface $output, $validator, $attempts) - { - $error = null; - while (false === $attempts || $attempts--) { - if (null !== $error) { - $output->writeln($this->getHelperSet()->get('formatter')->formatBlock($error->getMessage(), 'error')); - } - - try { - return call_user_func($validator, $interviewer()); - } catch (\Exception $error) { - } - } - - throw $error; - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Helper/FormatterHelper.php b/vendor/symfony/console/Symfony/Component/Console/Helper/FormatterHelper.php deleted file mode 100644 index b94294345..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Helper/FormatterHelper.php +++ /dev/null @@ -1,80 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Formatter\OutputFormatter; - -/** - * The Formatter class provides helpers to format messages. - * - * @author Fabien Potencier - */ -class FormatterHelper extends Helper -{ - /** - * Formats a message within a section. - * - * @param string $section The section name - * @param string $message The message - * @param string $style The style to apply to the section - * - * @return string The format section - */ - public function formatSection($section, $message, $style = 'info') - { - return sprintf('<%s>[%s] %s', $style, $section, $style, $message); - } - - /** - * Formats a message as a block of text. - * - * @param string|array $messages The message to write in the block - * @param string $style The style to apply to the whole block - * @param bool $large Whether to return a large block - * - * @return string The formatter message - */ - public function formatBlock($messages, $style, $large = false) - { - $messages = (array) $messages; - - $len = 0; - $lines = array(); - foreach ($messages as $message) { - $message = OutputFormatter::escape($message); - $lines[] = sprintf($large ? ' %s ' : ' %s ', $message); - $len = max($this->strlen($message) + ($large ? 4 : 2), $len); - } - - $messages = $large ? array(str_repeat(' ', $len)) : array(); - foreach ($lines as $line) { - $messages[] = $line.str_repeat(' ', $len - $this->strlen($line)); - } - if ($large) { - $messages[] = str_repeat(' ', $len); - } - - foreach ($messages as &$message) { - $message = sprintf('<%s>%s', $style, $message, $style); - } - - return implode("\n", $messages); - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return 'formatter'; - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Helper/Helper.php b/vendor/symfony/console/Symfony/Component/Console/Helper/Helper.php deleted file mode 100644 index cc3205522..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Helper/Helper.php +++ /dev/null @@ -1,121 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Formatter\OutputFormatterInterface; - -/** - * Helper is the base class for all helper classes. - * - * @author Fabien Potencier - */ -abstract class Helper implements HelperInterface -{ - protected $helperSet = null; - - /** - * Sets the helper set associated with this helper. - * - * @param HelperSet $helperSet A HelperSet instance - */ - public function setHelperSet(HelperSet $helperSet = null) - { - $this->helperSet = $helperSet; - } - - /** - * Gets the helper set associated with this helper. - * - * @return HelperSet A HelperSet instance - */ - public function getHelperSet() - { - return $this->helperSet; - } - - /** - * Returns the length of a string, using mb_strlen if it is available. - * - * @param string $string The string to check its length - * - * @return int The length of the string - */ - public static function strlen($string) - { - if (!function_exists('mb_strwidth')) { - return strlen($string); - } - - if (false === $encoding = mb_detect_encoding($string)) { - return strlen($string); - } - - return mb_strwidth($string, $encoding); - } - - public static function formatTime($secs) - { - static $timeFormats = array( - array(0, '< 1 sec'), - array(2, '1 sec'), - array(59, 'secs', 1), - array(60, '1 min'), - array(3600, 'mins', 60), - array(5400, '1 hr'), - array(86400, 'hrs', 3600), - array(129600, '1 day'), - array(604800, 'days', 86400), - ); - - foreach ($timeFormats as $format) { - if ($secs >= $format[0]) { - continue; - } - - if (2 == count($format)) { - return $format[1]; - } - - return ceil($secs / $format[2]).' '.$format[1]; - } - } - - public static function formatMemory($memory) - { - if ($memory >= 1024 * 1024 * 1024) { - return sprintf('%.1f GiB', $memory / 1024 / 1024 / 1024); - } - - if ($memory >= 1024 * 1024) { - return sprintf('%.1f MiB', $memory / 1024 / 1024); - } - - if ($memory >= 1024) { - return sprintf('%d KiB', $memory / 1024); - } - - return sprintf('%d B', $memory); - } - - public static function strlenWithoutDecoration(OutputFormatterInterface $formatter, $string) - { - $isDecorated = $formatter->isDecorated(); - $formatter->setDecorated(false); - // remove <...> formatting - $string = $formatter->format($string); - // remove already formatted characters - $string = preg_replace("/\033\[[^m]*m/", '', $string); - $formatter->setDecorated($isDecorated); - - return self::strlen($string); - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Helper/HelperInterface.php b/vendor/symfony/console/Symfony/Component/Console/Helper/HelperInterface.php deleted file mode 100644 index 6d394496f..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Helper/HelperInterface.php +++ /dev/null @@ -1,49 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -/** - * HelperInterface is the interface all helpers must implement. - * - * @author Fabien Potencier - * - * @api - */ -interface HelperInterface -{ - /** - * Sets the helper set associated with this helper. - * - * @param HelperSet $helperSet A HelperSet instance - * - * @api - */ - public function setHelperSet(HelperSet $helperSet = null); - - /** - * Gets the helper set associated with this helper. - * - * @return HelperSet A HelperSet instance - * - * @api - */ - public function getHelperSet(); - - /** - * Returns the canonical name of this helper. - * - * @return string The canonical name - * - * @api - */ - public function getName(); -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Helper/HelperSet.php b/vendor/symfony/console/Symfony/Component/Console/Helper/HelperSet.php deleted file mode 100644 index 76fa2e4cb..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Helper/HelperSet.php +++ /dev/null @@ -1,108 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Command\Command; - -/** - * HelperSet represents a set of helpers to be used with a command. - * - * @author Fabien Potencier - */ -class HelperSet implements \IteratorAggregate -{ - private $helpers = array(); - private $command; - - /** - * Constructor. - * - * @param Helper[] $helpers An array of helper. - */ - public function __construct(array $helpers = array()) - { - foreach ($helpers as $alias => $helper) { - $this->set($helper, is_int($alias) ? null : $alias); - } - } - - /** - * Sets a helper. - * - * @param HelperInterface $helper The helper instance - * @param string $alias An alias - */ - public function set(HelperInterface $helper, $alias = null) - { - $this->helpers[$helper->getName()] = $helper; - if (null !== $alias) { - $this->helpers[$alias] = $helper; - } - - $helper->setHelperSet($this); - } - - /** - * Returns true if the helper if defined. - * - * @param string $name The helper name - * - * @return bool true if the helper is defined, false otherwise - */ - public function has($name) - { - return isset($this->helpers[$name]); - } - - /** - * Gets a helper value. - * - * @param string $name The helper name - * - * @return HelperInterface The helper instance - * - * @throws \InvalidArgumentException if the helper is not defined - */ - public function get($name) - { - if (!$this->has($name)) { - throw new \InvalidArgumentException(sprintf('The helper "%s" is not defined.', $name)); - } - - return $this->helpers[$name]; - } - - /** - * Sets the command associated with this helper set. - * - * @param Command $command A Command instance - */ - public function setCommand(Command $command = null) - { - $this->command = $command; - } - - /** - * Gets the command associated with this helper set. - * - * @return Command A Command instance - */ - public function getCommand() - { - return $this->command; - } - - public function getIterator() - { - return new \ArrayIterator($this->helpers); - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Helper/InputAwareHelper.php b/vendor/symfony/console/Symfony/Component/Console/Helper/InputAwareHelper.php deleted file mode 100644 index 426176742..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Helper/InputAwareHelper.php +++ /dev/null @@ -1,33 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputAwareInterface; - -/** - * An implementation of InputAwareInterface for Helpers. - * - * @author Wouter J - */ -abstract class InputAwareHelper extends Helper implements InputAwareInterface -{ - protected $input; - - /** - * {@inheritdoc} - */ - public function setInput(InputInterface $input) - { - $this->input = $input; - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Helper/ProgressBar.php b/vendor/symfony/console/Symfony/Component/Console/Helper/ProgressBar.php deleted file mode 100644 index 99c0dfc59..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Helper/ProgressBar.php +++ /dev/null @@ -1,559 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Output\NullOutput; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * The ProgressBar provides helpers to display progress output. - * - * @author Fabien Potencier - * @author Chris Jones - */ -class ProgressBar -{ - // options - private $barWidth = 28; - private $barChar = '='; - private $emptyBarChar = '-'; - private $progressChar = '>'; - private $format = null; - private $redrawFreq = 1; - - /** - * @var OutputInterface - */ - private $output; - private $step; - private $max; - private $startTime; - private $stepWidth; - private $percent; - private $lastMessagesLength; - private $barCharOriginal; - private $formatLineCount; - private $messages; - - private static $formatters; - private static $formats; - - /** - * Constructor. - * - * @param OutputInterface $output An OutputInterface instance - * @param int $max Maximum steps (0 if unknown) - */ - public function __construct(OutputInterface $output, $max = 0) - { - // Disabling output when it does not support ANSI codes as it would result in a broken display anyway. - $this->output = $output->isDecorated() ? $output : new NullOutput(); - $this->max = (int) $max; - $this->stepWidth = $this->max > 0 ? Helper::strlen($this->max) : 4; - - if (!self::$formatters) { - self::$formatters = self::initPlaceholderFormatters(); - } - - if (!self::$formats) { - self::$formats = self::initFormats(); - } - - $this->setFormat($this->determineBestFormat()); - } - - /** - * Sets a placeholder formatter for a given name. - * - * This method also allow you to override an existing placeholder. - * - * @param string $name The placeholder name (including the delimiter char like %) - * @param callable $callable A PHP callable - */ - public static function setPlaceholderFormatterDefinition($name, $callable) - { - if (!self::$formatters) { - self::$formatters = self::initPlaceholderFormatters(); - } - - self::$formatters[$name] = $callable; - } - - /** - * Gets the placeholder formatter for a given name. - * - * @param string $name The placeholder name (including the delimiter char like %) - * - * @return callable|null A PHP callable - */ - public static function getPlaceholderFormatterDefinition($name) - { - if (!self::$formatters) { - self::$formatters = self::initPlaceholderFormatters(); - } - - return isset(self::$formatters[$name]) ? self::$formatters[$name] : null; - } - - /** - * Sets a format for a given name. - * - * This method also allow you to override an existing format. - * - * @param string $name The format name - * @param string $format A format string - */ - public static function setFormatDefinition($name, $format) - { - if (!self::$formats) { - self::$formats = self::initFormats(); - } - - self::$formats[$name] = $format; - } - - /** - * Gets the format for a given name. - * - * @param string $name The format name - * - * @return string|null A format string - */ - public static function getFormatDefinition($name) - { - if (!self::$formats) { - self::$formats = self::initFormats(); - } - - return isset(self::$formats[$name]) ? self::$formats[$name] : null; - } - - public function setMessage($message, $name = 'message') - { - $this->messages[$name] = $message; - } - - public function getMessage($name = 'message') - { - return $this->messages[$name]; - } - - /** - * Gets the progress bar start time. - * - * @return int The progress bar start time - */ - public function getStartTime() - { - return $this->startTime; - } - - /** - * Gets the progress bar maximal steps. - * - * @return int The progress bar max steps - */ - public function getMaxSteps() - { - return $this->max; - } - - /** - * Gets the progress bar step. - * - * @return int The progress bar step - */ - public function getStep() - { - return $this->step; - } - - /** - * Gets the progress bar step width. - * - * @return int The progress bar step width - */ - public function getStepWidth() - { - return $this->stepWidth; - } - - /** - * Gets the current progress bar percent. - * - * @return int The current progress bar percent - */ - public function getProgressPercent() - { - return $this->percent; - } - - /** - * Sets the progress bar width. - * - * @param int $size The progress bar size - */ - public function setBarWidth($size) - { - $this->barWidth = (int) $size; - } - - /** - * Gets the progress bar width. - * - * @return int The progress bar size - */ - public function getBarWidth() - { - return $this->barWidth; - } - - /** - * Sets the bar character. - * - * @param string $char A character - */ - public function setBarCharacter($char) - { - $this->barChar = $char; - } - - /** - * Gets the bar character. - * - * @return string A character - */ - public function getBarCharacter() - { - return $this->barChar; - } - - /** - * Sets the empty bar character. - * - * @param string $char A character - */ - public function setEmptyBarCharacter($char) - { - $this->emptyBarChar = $char; - } - - /** - * Gets the empty bar character. - * - * @return string A character - */ - public function getEmptyBarCharacter() - { - return $this->emptyBarChar; - } - - /** - * Sets the progress bar character. - * - * @param string $char A character - */ - public function setProgressCharacter($char) - { - $this->progressChar = $char; - } - - /** - * Gets the progress bar character. - * - * @return string A character - */ - public function getProgressCharacter() - { - return $this->progressChar; - } - - /** - * Sets the progress bar format. - * - * @param string $format The format - */ - public function setFormat($format) - { - // try to use the _nomax variant if available - if (!$this->max && isset(self::$formats[$format.'_nomax'])) { - $this->format = self::$formats[$format.'_nomax']; - } elseif (isset(self::$formats[$format])) { - $this->format = self::$formats[$format]; - } else { - $this->format = $format; - } - - $this->formatLineCount = substr_count($this->format, "\n"); - } - - /** - * Sets the redraw frequency. - * - * @param int $freq The frequency in steps - */ - public function setRedrawFrequency($freq) - { - $this->redrawFreq = (int) $freq; - } - - /** - * Starts the progress output. - */ - public function start() - { - $this->startTime = time(); - $this->step = 0; - $this->percent = 0; - $this->lastMessagesLength = 0; - $this->barCharOriginal = ''; - - if (!$this->max) { - $this->barCharOriginal = $this->barChar; - $this->barChar = $this->emptyBarChar; - } - - $this->display(); - } - - /** - * Advances the progress output X steps. - * - * @param int $step Number of steps to advance - * - * @throws \LogicException - */ - public function advance($step = 1) - { - $this->setCurrent($this->step + $step); - } - - /** - * Sets the current progress. - * - * @param int $step The current progress - * - * @throws \LogicException - */ - public function setCurrent($step) - { - if (null === $this->startTime) { - throw new \LogicException('You must start the progress bar before calling setCurrent().'); - } - - $step = (int) $step; - if ($step < $this->step) { - throw new \LogicException('You can\'t regress the progress bar.'); - } - - if ($this->max > 0 && $step > $this->max) { - throw new \LogicException('You can\'t advance the progress bar past the max value.'); - } - - $prevPeriod = intval($this->step / $this->redrawFreq); - $currPeriod = intval($step / $this->redrawFreq); - $this->step = $step; - $this->percent = $this->max > 0 ? (float) $this->step / $this->max : 0; - if ($prevPeriod !== $currPeriod || $this->max === $step) { - $this->display(); - } - } - - /** - * Finishes the progress output. - */ - public function finish() - { - if (null === $this->startTime) { - throw new \LogicException('You must start the progress bar before calling finish().'); - } - - if (!$this->max) { - $this->barChar = $this->barCharOriginal; - $this->max = $this->step; - $this->setCurrent($this->max); - $this->max = 0; - $this->barChar = $this->emptyBarChar; - } else { - $this->setCurrent($this->max); - } - - $this->startTime = null; - } - - /** - * Outputs the current progress string. - * - * @throws \LogicException - */ - public function display() - { - if (null === $this->startTime) { - throw new \LogicException('You must start the progress bar before calling display().'); - } - - // these 3 variables can be removed in favor of using $this in the closure when support for PHP 5.3 will be dropped. - $self = $this; - $output = $this->output; - $messages = $this->messages; - $this->overwrite(preg_replace_callback("{%([a-z\-_]+)(?:\:([^%]+))?%}i", function ($matches) use ($self, $output, $messages) { - if ($formatter = $self::getPlaceholderFormatterDefinition($matches[1])) { - $text = call_user_func($formatter, $self, $output); - } elseif (isset($messages[$matches[1]])) { - $text = $messages[$matches[1]]; - } else { - return $matches[0]; - } - - if (isset($matches[2])) { - $text = sprintf('%'.$matches[2], $text); - } - - return $text; - }, $this->format)); - } - - /** - * Removes the progress bar from the current line. - * - * This is useful if you wish to write some output - * while a progress bar is running. - * Call display() to show the progress bar again. - */ - public function clear() - { - $this->overwrite(str_repeat("\n", $this->formatLineCount)); - } - - /** - * Overwrites a previous message to the output. - * - * @param string $message The message - */ - private function overwrite($message) - { - $lines = explode("\n", $message); - - // append whitespace to match the line's length - if (null !== $this->lastMessagesLength) { - foreach ($lines as $i => $line) { - if ($this->lastMessagesLength > Helper::strlenWithoutDecoration($this->output->getFormatter(), $line)) { - $lines[$i] = str_pad($line, $this->lastMessagesLength, "\x20", STR_PAD_RIGHT); - } - } - } - - // move back to the beginning of the progress bar before redrawing it - $this->output->write("\x0D"); - if ($this->formatLineCount) { - $this->output->write(sprintf("\033[%dA", $this->formatLineCount)); - } - $this->output->write(implode("\n", $lines)); - - $this->lastMessagesLength = 0; - foreach ($lines as $line) { - $len = Helper::strlenWithoutDecoration($this->output->getFormatter(), $line); - if ($len > $this->lastMessagesLength) { - $this->lastMessagesLength = $len; - } - } - } - - private function determineBestFormat() - { - switch ($this->output->getVerbosity()) { - // OutputInterface::VERBOSITY_QUIET: display is disabled anyway - case OutputInterface::VERBOSITY_VERBOSE: - return $this->max > 0 ? 'verbose' : 'verbose_nomax'; - case OutputInterface::VERBOSITY_VERY_VERBOSE: - return $this->max > 0 ? 'very_verbose' : 'very_verbose_nomax'; - case OutputInterface::VERBOSITY_DEBUG: - return $this->max > 0 ? 'debug' : 'debug_nomax'; - default: - return $this->max > 0 ? 'normal' : 'normal_nomax'; - } - } - - private static function initPlaceholderFormatters() - { - return array( - 'bar' => function (ProgressBar $bar, OutputInterface $output) { - $completeBars = floor($bar->getMaxSteps() > 0 ? $bar->getProgressPercent() * $bar->getBarWidth() : $bar->getStep() % $bar->getBarWidth()); - $display = str_repeat($bar->getBarCharacter(), $completeBars); - if ($completeBars < $bar->getBarWidth()) { - $emptyBars = $bar->getBarWidth() - $completeBars - Helper::strlenWithoutDecoration($output->getFormatter(), $bar->getProgressCharacter()); - $display .= $bar->getProgressCharacter().str_repeat($bar->getEmptyBarCharacter(), $emptyBars); - } - - return $display; - }, - 'elapsed' => function (ProgressBar $bar) { - return Helper::formatTime(time() - $bar->getStartTime()); - }, - 'remaining' => function (ProgressBar $bar) { - if (!$bar->getMaxSteps()) { - throw new \LogicException('Unable to display the remaining time if the maximum number of steps is not set.'); - } - - if (!$bar->getStep()) { - $remaining = 0; - } else { - $remaining = round((time() - $bar->getStartTime()) / $bar->getStep() * ($bar->getMaxSteps() - $bar->getStep())); - } - - return Helper::formatTime($remaining); - }, - 'estimated' => function (ProgressBar $bar) { - if (!$bar->getMaxSteps()) { - throw new \LogicException('Unable to display the estimated time if the maximum number of steps is not set.'); - } - - if (!$bar->getStep()) { - $estimated = 0; - } else { - $estimated = round((time() - $bar->getStartTime()) / $bar->getStep() * $bar->getMaxSteps()); - } - - return Helper::formatTime($estimated); - }, - 'memory' => function (ProgressBar $bar) { - return Helper::formatMemory(memory_get_usage(true)); - }, - 'current' => function (ProgressBar $bar) { - return str_pad($bar->getStep(), $bar->getStepWidth(), ' ', STR_PAD_LEFT); - }, - 'max' => function (ProgressBar $bar) { - return $bar->getMaxSteps(); - }, - 'percent' => function (ProgressBar $bar) { - return floor($bar->getProgressPercent() * 100); - }, - ); - } - - private static function initFormats() - { - return array( - 'normal' => ' %current%/%max% [%bar%] %percent:3s%%', - 'normal_nomax' => ' %current% [%bar%]', - - 'verbose' => ' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%', - 'verbose_nomax' => ' %current% [%bar%] %elapsed:6s%', - - 'very_verbose' => ' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%/%estimated:-6s%', - 'very_verbose_nomax' => ' %current% [%bar%] %elapsed:6s%', - - 'debug' => ' %current%/%max% [%bar%] %percent:3s%% %elapsed:6s%/%estimated:-6s% %memory:6s%', - 'debug_nomax' => ' %current% [%bar%] %elapsed:6s% %memory:6s%', - ); - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Helper/ProgressHelper.php b/vendor/symfony/console/Symfony/Component/Console/Helper/ProgressHelper.php deleted file mode 100644 index d0acf0533..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Helper/ProgressHelper.php +++ /dev/null @@ -1,457 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Output\NullOutput; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * The Progress class provides helpers to display progress output. - * - * @author Chris Jones - * @author Fabien Potencier - * - * @deprecated Deprecated since 2.5, to be removed in 3.0; use ProgressBar instead. - */ -class ProgressHelper extends Helper -{ - const FORMAT_QUIET = ' %percent%%'; - const FORMAT_NORMAL = ' %current%/%max% [%bar%] %percent%%'; - const FORMAT_VERBOSE = ' %current%/%max% [%bar%] %percent%% Elapsed: %elapsed%'; - const FORMAT_QUIET_NOMAX = ' %current%'; - const FORMAT_NORMAL_NOMAX = ' %current% [%bar%]'; - const FORMAT_VERBOSE_NOMAX = ' %current% [%bar%] Elapsed: %elapsed%'; - - // options - private $barWidth = 28; - private $barChar = '='; - private $emptyBarChar = '-'; - private $progressChar = '>'; - private $format = null; - private $redrawFreq = 1; - - private $lastMessagesLength; - private $barCharOriginal; - - /** - * @var OutputInterface - */ - private $output; - - /** - * Current step - * - * @var int - */ - private $current; - - /** - * Maximum number of steps - * - * @var int - */ - private $max; - - /** - * Start time of the progress bar - * - * @var int - */ - private $startTime; - - /** - * List of formatting variables - * - * @var array - */ - private $defaultFormatVars = array( - 'current', - 'max', - 'bar', - 'percent', - 'elapsed', - ); - - /** - * Available formatting variables - * - * @var array - */ - private $formatVars; - - /** - * Stored format part widths (used for padding) - * - * @var array - */ - private $widths = array( - 'current' => 4, - 'max' => 4, - 'percent' => 3, - 'elapsed' => 6, - ); - - /** - * Various time formats - * - * @var array - */ - private $timeFormats = array( - array(0, '???'), - array(2, '1 sec'), - array(59, 'secs', 1), - array(60, '1 min'), - array(3600, 'mins', 60), - array(5400, '1 hr'), - array(86400, 'hrs', 3600), - array(129600, '1 day'), - array(604800, 'days', 86400), - ); - - /** - * Sets the progress bar width. - * - * @param int $size The progress bar size - */ - public function setBarWidth($size) - { - $this->barWidth = (int) $size; - } - - /** - * Sets the bar character. - * - * @param string $char A character - */ - public function setBarCharacter($char) - { - $this->barChar = $char; - } - - /** - * Sets the empty bar character. - * - * @param string $char A character - */ - public function setEmptyBarCharacter($char) - { - $this->emptyBarChar = $char; - } - - /** - * Sets the progress bar character. - * - * @param string $char A character - */ - public function setProgressCharacter($char) - { - $this->progressChar = $char; - } - - /** - * Sets the progress bar format. - * - * @param string $format The format - */ - public function setFormat($format) - { - $this->format = $format; - } - - /** - * Sets the redraw frequency. - * - * @param int $freq The frequency in steps - */ - public function setRedrawFrequency($freq) - { - $this->redrawFreq = (int) $freq; - } - - /** - * Starts the progress output. - * - * @param OutputInterface $output An Output instance - * @param int|null $max Maximum steps - */ - public function start(OutputInterface $output, $max = null) - { - $this->startTime = time(); - $this->current = 0; - $this->max = (int) $max; - - // Disabling output when it does not support ANSI codes as it would result in a broken display anyway. - $this->output = $output->isDecorated() ? $output : new NullOutput(); - $this->lastMessagesLength = 0; - $this->barCharOriginal = ''; - - if (null === $this->format) { - switch ($output->getVerbosity()) { - case OutputInterface::VERBOSITY_QUIET: - $this->format = self::FORMAT_QUIET_NOMAX; - if ($this->max > 0) { - $this->format = self::FORMAT_QUIET; - } - break; - case OutputInterface::VERBOSITY_VERBOSE: - case OutputInterface::VERBOSITY_VERY_VERBOSE: - case OutputInterface::VERBOSITY_DEBUG: - $this->format = self::FORMAT_VERBOSE_NOMAX; - if ($this->max > 0) { - $this->format = self::FORMAT_VERBOSE; - } - break; - default: - $this->format = self::FORMAT_NORMAL_NOMAX; - if ($this->max > 0) { - $this->format = self::FORMAT_NORMAL; - } - break; - } - } - - $this->initialize(); - } - - /** - * Advances the progress output X steps. - * - * @param int $step Number of steps to advance - * @param bool $redraw Whether to redraw or not - * - * @throws \LogicException - */ - public function advance($step = 1, $redraw = false) - { - $this->setCurrent($this->current + $step, $redraw); - } - - /** - * Sets the current progress. - * - * @param int $current The current progress - * @param bool $redraw Whether to redraw or not - * - * @throws \LogicException - */ - public function setCurrent($current, $redraw = false) - { - if (null === $this->startTime) { - throw new \LogicException('You must start the progress bar before calling setCurrent().'); - } - - $current = (int) $current; - - if ($current < $this->current) { - throw new \LogicException('You can\'t regress the progress bar'); - } - - if (0 === $this->current) { - $redraw = true; - } - - $prevPeriod = intval($this->current / $this->redrawFreq); - - $this->current = $current; - - $currPeriod = intval($this->current / $this->redrawFreq); - if ($redraw || $prevPeriod !== $currPeriod || $this->max === $this->current) { - $this->display(); - } - } - - /** - * Outputs the current progress string. - * - * @param bool $finish Forces the end result - * - * @throws \LogicException - */ - public function display($finish = false) - { - if (null === $this->startTime) { - throw new \LogicException('You must start the progress bar before calling display().'); - } - - $message = $this->format; - foreach ($this->generate($finish) as $name => $value) { - $message = str_replace("%{$name}%", $value, $message); - } - $this->overwrite($this->output, $message); - } - - /** - * Removes the progress bar from the current line. - * - * This is useful if you wish to write some output - * while a progress bar is running. - * Call display() to show the progress bar again. - */ - public function clear() - { - $this->overwrite($this->output, ''); - } - - /** - * Finishes the progress output. - */ - public function finish() - { - if (null === $this->startTime) { - throw new \LogicException('You must start the progress bar before calling finish().'); - } - - if (null !== $this->startTime) { - if (!$this->max) { - $this->barChar = $this->barCharOriginal; - $this->display(true); - } - $this->startTime = null; - $this->output->writeln(''); - $this->output = null; - } - } - - /** - * Initializes the progress helper. - */ - private function initialize() - { - $this->formatVars = array(); - foreach ($this->defaultFormatVars as $var) { - if (false !== strpos($this->format, "%{$var}%")) { - $this->formatVars[$var] = true; - } - } - - if ($this->max > 0) { - $this->widths['max'] = $this->strlen($this->max); - $this->widths['current'] = $this->widths['max']; - } else { - $this->barCharOriginal = $this->barChar; - $this->barChar = $this->emptyBarChar; - } - } - - /** - * Generates the array map of format variables to values. - * - * @param bool $finish Forces the end result - * - * @return array Array of format vars and values - */ - private function generate($finish = false) - { - $vars = array(); - $percent = 0; - if ($this->max > 0) { - $percent = (float) $this->current / $this->max; - } - - if (isset($this->formatVars['bar'])) { - $completeBars = 0; - - if ($this->max > 0) { - $completeBars = floor($percent * $this->barWidth); - } else { - if (!$finish) { - $completeBars = floor($this->current % $this->barWidth); - } else { - $completeBars = $this->barWidth; - } - } - - $emptyBars = $this->barWidth - $completeBars - $this->strlen($this->progressChar); - $bar = str_repeat($this->barChar, $completeBars); - if ($completeBars < $this->barWidth) { - $bar .= $this->progressChar; - $bar .= str_repeat($this->emptyBarChar, $emptyBars); - } - - $vars['bar'] = $bar; - } - - if (isset($this->formatVars['elapsed'])) { - $elapsed = time() - $this->startTime; - $vars['elapsed'] = str_pad($this->humaneTime($elapsed), $this->widths['elapsed'], ' ', STR_PAD_LEFT); - } - - if (isset($this->formatVars['current'])) { - $vars['current'] = str_pad($this->current, $this->widths['current'], ' ', STR_PAD_LEFT); - } - - if (isset($this->formatVars['max'])) { - $vars['max'] = $this->max; - } - - if (isset($this->formatVars['percent'])) { - $vars['percent'] = str_pad(floor($percent * 100), $this->widths['percent'], ' ', STR_PAD_LEFT); - } - - return $vars; - } - - /** - * Converts seconds into human-readable format. - * - * @param int $secs Number of seconds - * - * @return string Time in readable format - */ - private function humaneTime($secs) - { - $text = ''; - foreach ($this->timeFormats as $format) { - if ($secs < $format[0]) { - if (count($format) == 2) { - $text = $format[1]; - break; - } else { - $text = ceil($secs / $format[2]).' '.$format[1]; - break; - } - } - } - - return $text; - } - - /** - * Overwrites a previous message to the output. - * - * @param OutputInterface $output An Output instance - * @param string $message The message - */ - private function overwrite(OutputInterface $output, $message) - { - $length = $this->strlen($message); - - // append whitespace to match the last line's length - if (null !== $this->lastMessagesLength && $this->lastMessagesLength > $length) { - $message = str_pad($message, $this->lastMessagesLength, "\x20", STR_PAD_RIGHT); - } - - // carriage return - $output->write("\x0D"); - $output->write($message); - - $this->lastMessagesLength = $this->strlen($message); - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return 'progress'; - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Helper/QuestionHelper.php b/vendor/symfony/console/Symfony/Component/Console/Helper/QuestionHelper.php deleted file mode 100644 index 0500b415e..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Helper/QuestionHelper.php +++ /dev/null @@ -1,411 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Formatter\OutputFormatterStyle; -use Symfony\Component\Console\Question\Question; -use Symfony\Component\Console\Question\ChoiceQuestion; - -/** - * The QuestionHelper class provides helpers to interact with the user. - * - * @author Fabien Potencier - */ -class QuestionHelper extends Helper -{ - private $inputStream; - private static $shell; - private static $stty; - - /** - * Asks a question to the user. - * - * @param InputInterface $input An InputInterface instance - * @param OutputInterface $output An OutputInterface instance - * @param Question $question The question to ask - * - * @return string The user answer - * - * @throws \RuntimeException If there is no data to read in the input stream - */ - public function ask(InputInterface $input, OutputInterface $output, Question $question) - { - if (!$input->isInteractive()) { - return $question->getDefault(); - } - - if (!$question->getValidator()) { - return $this->doAsk($output, $question); - } - - $that = $this; - - $interviewer = function () use ($output, $question, $that) { - return $that->doAsk($output, $question); - }; - - return $this->validateAttempts($interviewer, $output, $question); - } - - /** - * Sets the input stream to read from when interacting with the user. - * - * This is mainly useful for testing purpose. - * - * @param resource $stream The input stream - * - * @throws \InvalidArgumentException In case the stream is not a resource - */ - public function setInputStream($stream) - { - if (!is_resource($stream)) { - throw new \InvalidArgumentException('Input stream must be a valid resource.'); - } - - $this->inputStream = $stream; - } - - /** - * Returns the helper's input stream - * - * @return resource - */ - public function getInputStream() - { - return $this->inputStream; - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return 'question'; - } - - /** - * Asks the question to the user. - * - * This method is public for PHP 5.3 compatibility, it should be private. - * - * @param OutputInterface $output - * @param Question $question - * - * @return bool|mixed|null|string - * - * @throws \Exception - * @throws \RuntimeException - */ - public function doAsk(OutputInterface $output, Question $question) - { - $inputStream = $this->inputStream ?: STDIN; - - $message = $question->getQuestion(); - if ($question instanceof ChoiceQuestion) { - $width = max(array_map('strlen', array_keys($question->getChoices()))); - - $messages = (array) $question->getQuestion(); - foreach ($question->getChoices() as $key => $value) { - $messages[] = sprintf(" [%-${width}s] %s", $key, $value); - } - - $output->writeln($messages); - - $message = $question->getPrompt(); - } - - $output->write($message); - - $autocomplete = $question->getAutocompleterValues(); - if (null === $autocomplete || !$this->hasSttyAvailable()) { - $ret = false; - if ($question->isHidden()) { - try { - $ret = trim($this->getHiddenResponse($output, $inputStream)); - } catch (\RuntimeException $e) { - if (!$question->isHiddenFallback()) { - throw $e; - } - } - } - - if (false === $ret) { - $ret = fgets($inputStream, 4096); - if (false === $ret) { - throw new \RuntimeException('Aborted'); - } - $ret = trim($ret); - } - } else { - $ret = trim($this->autocomplete($output, $question, $inputStream)); - } - - $ret = strlen($ret) > 0 ? $ret : $question->getDefault(); - - if ($normalizer = $question->getNormalizer()) { - return $normalizer($ret); - } - - return $ret; - } - - /** - * Autocompletes a question. - * - * @param OutputInterface $output - * @param Question $question - * - * @return string - */ - private function autocomplete(OutputInterface $output, Question $question, $inputStream) - { - $autocomplete = $question->getAutocompleterValues(); - $ret = ''; - - $i = 0; - $ofs = -1; - $matches = $autocomplete; - $numMatches = count($matches); - - $sttyMode = shell_exec('stty -g'); - - // Disable icanon (so we can fread each keypress) and echo (we'll do echoing here instead) - shell_exec('stty -icanon -echo'); - - // Add highlighted text style - $output->getFormatter()->setStyle('hl', new OutputFormatterStyle('black', 'white')); - - // Read a keypress - while (!feof($inputStream)) { - $c = fread($inputStream, 1); - - // Backspace Character - if ("\177" === $c) { - if (0 === $numMatches && 0 !== $i) { - $i--; - // Move cursor backwards - $output->write("\033[1D"); - } - - if ($i === 0) { - $ofs = -1; - $matches = $autocomplete; - $numMatches = count($matches); - } else { - $numMatches = 0; - } - - // Pop the last character off the end of our string - $ret = substr($ret, 0, $i); - } elseif ("\033" === $c) { // Did we read an escape sequence? - $c .= fread($inputStream, 2); - - // A = Up Arrow. B = Down Arrow - if (isset($c[2]) && ('A' === $c[2] || 'B' === $c[2])) { - if ('A' === $c[2] && -1 === $ofs) { - $ofs = 0; - } - - if (0 === $numMatches) { - continue; - } - - $ofs += ('A' === $c[2]) ? -1 : 1; - $ofs = ($numMatches + $ofs) % $numMatches; - } - } elseif (ord($c) < 32) { - if ("\t" === $c || "\n" === $c) { - if ($numMatches > 0 && -1 !== $ofs) { - $ret = $matches[$ofs]; - // Echo out remaining chars for current match - $output->write(substr($ret, $i)); - $i = strlen($ret); - } - - if ("\n" === $c) { - $output->write($c); - break; - } - - $numMatches = 0; - } - - continue; - } else { - $output->write($c); - $ret .= $c; - $i++; - - $numMatches = 0; - $ofs = 0; - - foreach ($autocomplete as $value) { - // If typed characters match the beginning chunk of value (e.g. [AcmeDe]moBundle) - if (0 === strpos($value, $ret) && $i !== strlen($value)) { - $matches[$numMatches++] = $value; - } - } - } - - // Erase characters from cursor to end of line - $output->write("\033[K"); - - if ($numMatches > 0 && -1 !== $ofs) { - // Save cursor position - $output->write("\0337"); - // Write highlighted text - $output->write(''.substr($matches[$ofs], $i).''); - // Restore cursor position - $output->write("\0338"); - } - } - - // Reset stty so it behaves normally again - shell_exec(sprintf('stty %s', $sttyMode)); - - return $ret; - } - - /** - * Gets a hidden response from user. - * - * @param OutputInterface $output An Output instance - * - * @return string The answer - * - * @throws \RuntimeException In case the fallback is deactivated and the response cannot be hidden - */ - private function getHiddenResponse(OutputInterface $output, $inputStream) - { - if (defined('PHP_WINDOWS_VERSION_BUILD')) { - $exe = __DIR__.'/../Resources/bin/hiddeninput.exe'; - - // handle code running from a phar - if ('phar:' === substr(__FILE__, 0, 5)) { - $tmpExe = sys_get_temp_dir().'/hiddeninput.exe'; - copy($exe, $tmpExe); - $exe = $tmpExe; - } - - $value = rtrim(shell_exec($exe)); - $output->writeln(''); - - if (isset($tmpExe)) { - unlink($tmpExe); - } - - return $value; - } - - if ($this->hasSttyAvailable()) { - $sttyMode = shell_exec('stty -g'); - - shell_exec('stty -echo'); - $value = fgets($inputStream, 4096); - shell_exec(sprintf('stty %s', $sttyMode)); - - if (false === $value) { - throw new \RuntimeException('Aborted'); - } - - $value = trim($value); - $output->writeln(''); - - return $value; - } - - if (false !== $shell = $this->getShell()) { - $readCmd = $shell === 'csh' ? 'set mypassword = $<' : 'read -r mypassword'; - $command = sprintf("/usr/bin/env %s -c 'stty -echo; %s; stty echo; echo \$mypassword'", $shell, $readCmd); - $value = rtrim(shell_exec($command)); - $output->writeln(''); - - return $value; - } - - throw new \RuntimeException('Unable to hide the response.'); - } - - /** - * Validates an attempt. - * - * @param callable $interviewer A callable that will ask for a question and return the result - * @param OutputInterface $output An Output instance - * @param Question $question A Question instance - * - * @return string The validated response - * - * @throws \Exception In case the max number of attempts has been reached and no valid response has been given - */ - private function validateAttempts($interviewer, OutputInterface $output, Question $question) - { - $error = null; - $attempts = $question->getMaxAttempts(); - while (null === $attempts || $attempts--) { - if (null !== $error) { - $output->writeln($this->getHelperSet()->get('formatter')->formatBlock($error->getMessage(), 'error')); - } - - try { - return call_user_func($question->getValidator(), $interviewer()); - } catch (\Exception $error) { - } - } - - throw $error; - } - - /** - * Returns a valid unix shell. - * - * @return string|bool The valid shell name, false in case no valid shell is found - */ - private function getShell() - { - if (null !== self::$shell) { - return self::$shell; - } - - self::$shell = false; - - if (file_exists('/usr/bin/env')) { - // handle other OSs with bash/zsh/ksh/csh if available to hide the answer - $test = "/usr/bin/env %s -c 'echo OK' 2> /dev/null"; - foreach (array('bash', 'zsh', 'ksh', 'csh') as $sh) { - if ('OK' === rtrim(shell_exec(sprintf($test, $sh)))) { - self::$shell = $sh; - break; - } - } - } - - return self::$shell; - } - - /** - * Returns whether Stty is available or not. - * - * @return bool - */ - private function hasSttyAvailable() - { - if (null !== self::$stty) { - return self::$stty; - } - - exec('stty 2>&1', $output, $exitcode); - - return self::$stty = $exitcode === 0; - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Helper/Table.php b/vendor/symfony/console/Symfony/Component/Console/Helper/Table.php deleted file mode 100644 index 5a3dbc168..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Helper/Table.php +++ /dev/null @@ -1,409 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Output\OutputInterface; - -/** - * Provides helpers to display a table. - * - * @author Fabien Potencier - * @author Саша Стаменковић - */ -class Table -{ - /** - * Table headers. - * - * @var array - */ - private $headers = array(); - - /** - * Table rows. - * - * @var array - */ - private $rows = array(); - - /** - * Column widths cache. - * - * @var array - */ - private $columnWidths = array(); - - /** - * Number of columns cache. - * - * @var array - */ - private $numberOfColumns; - - /** - * @var OutputInterface - */ - private $output; - - /** - * @var TableStyle - */ - private $style; - - private static $styles; - - public function __construct(OutputInterface $output) - { - $this->output = $output; - - if (!self::$styles) { - self::$styles = self::initStyles(); - } - - $this->setStyle('default'); - } - - /** - * Sets a style definition. - * - * @param string $name The style name - * @param TableStyle $style A TableStyle instance - */ - public static function setStyleDefinition($name, TableStyle $style) - { - if (!self::$styles) { - self::$styles = self::initStyles(); - } - - self::$styles[$name] = $style; - } - - /** - * Gets a style definition by name. - * - * @param string $name The style name - * - * @return TableStyle A TableStyle instance - */ - public static function getStyleDefinition($name) - { - if (!self::$styles) { - self::$styles = self::initStyles(); - } - - if (!self::$styles[$name]) { - throw new \InvalidArgumentException(sprintf('Style "%s" is not defined.', $name)); - } - - return self::$styles[$name]; - } - - /** - * Sets table style. - * - * @param TableStyle|string $name The style name or a TableStyle instance - * - * @return Table - */ - public function setStyle($name) - { - if ($name instanceof TableStyle) { - $this->style = $name; - } elseif (isset(self::$styles[$name])) { - $this->style = self::$styles[$name]; - } else { - throw new \InvalidArgumentException(sprintf('Style "%s" is not defined.', $name)); - } - - return $this; - } - - /** - * Gets the current table style. - * - * @return TableStyle - */ - public function getStyle() - { - return $this->style; - } - - public function setHeaders(array $headers) - { - $this->headers = array_values($headers); - - return $this; - } - - public function setRows(array $rows) - { - $this->rows = array(); - - return $this->addRows($rows); - } - - public function addRows(array $rows) - { - foreach ($rows as $row) { - $this->addRow($row); - } - - return $this; - } - - public function addRow($row) - { - if ($row instanceof TableSeparator) { - $this->rows[] = $row; - - return; - } - - if (!is_array($row)) { - throw new \InvalidArgumentException('A row must be an array or a TableSeparator instance.'); - } - - $this->rows[] = array_values($row); - - $keys = array_keys($this->rows); - $rowKey = array_pop($keys); - - foreach ($row as $key => $cellValue) { - if (!strstr($cellValue, "\n")) { - continue; - } - - $lines = explode("\n", $cellValue); - $this->rows[$rowKey][$key] = $lines[0]; - unset($lines[0]); - - foreach ($lines as $lineKey => $line) { - $nextRowKey = $rowKey + $lineKey + 1; - - if (isset($this->rows[$nextRowKey])) { - $this->rows[$nextRowKey][$key] = $line; - } else { - $this->rows[$nextRowKey] = array($key => $line); - } - } - } - - return $this; - } - - public function setRow($column, array $row) - { - $this->rows[$column] = $row; - - return $this; - } - - /** - * Renders table to output. - * - * Example: - * +---------------+-----------------------+------------------+ - * | ISBN | Title | Author | - * +---------------+-----------------------+------------------+ - * | 99921-58-10-7 | Divine Comedy | Dante Alighieri | - * | 9971-5-0210-0 | A Tale of Two Cities | Charles Dickens | - * | 960-425-059-0 | The Lord of the Rings | J. R. R. Tolkien | - * +---------------+-----------------------+------------------+ - */ - public function render() - { - $this->renderRowSeparator(); - $this->renderRow($this->headers, $this->style->getCellHeaderFormat()); - if (!empty($this->headers)) { - $this->renderRowSeparator(); - } - foreach ($this->rows as $row) { - if ($row instanceof TableSeparator) { - $this->renderRowSeparator(); - } else { - $this->renderRow($row, $this->style->getCellRowFormat()); - } - } - if (!empty($this->rows)) { - $this->renderRowSeparator(); - } - - $this->cleanup(); - } - - /** - * Renders horizontal header separator. - * - * Example: +-----+-----------+-------+ - */ - private function renderRowSeparator() - { - if (0 === $count = $this->getNumberOfColumns()) { - return; - } - - if (!$this->style->getHorizontalBorderChar() && !$this->style->getCrossingChar()) { - return; - } - - $markup = $this->style->getCrossingChar(); - for ($column = 0; $column < $count; $column++) { - $markup .= str_repeat($this->style->getHorizontalBorderChar(), $this->getColumnWidth($column)).$this->style->getCrossingChar(); - } - - $this->output->writeln(sprintf($this->style->getBorderFormat(), $markup)); - } - - /** - * Renders vertical column separator. - */ - private function renderColumnSeparator() - { - $this->output->write(sprintf($this->style->getBorderFormat(), $this->style->getVerticalBorderChar())); - } - - /** - * Renders table row. - * - * Example: | 9971-5-0210-0 | A Tale of Two Cities | Charles Dickens | - * - * @param array $row - * @param string $cellFormat - */ - private function renderRow(array $row, $cellFormat) - { - if (empty($row)) { - return; - } - - $this->renderColumnSeparator(); - for ($column = 0, $count = $this->getNumberOfColumns(); $column < $count; $column++) { - $this->renderCell($row, $column, $cellFormat); - $this->renderColumnSeparator(); - } - $this->output->writeln(''); - } - - /** - * Renders table cell with padding. - * - * @param array $row - * @param int $column - * @param string $cellFormat - */ - private function renderCell(array $row, $column, $cellFormat) - { - $cell = isset($row[$column]) ? $row[$column] : ''; - $width = $this->getColumnWidth($column); - - // str_pad won't work properly with multi-byte strings, we need to fix the padding - if (function_exists('mb_strlen') && false !== $encoding = mb_detect_encoding($cell)) { - $width += strlen($cell) - mb_strlen($cell, $encoding); - } - - $width += Helper::strlen($cell) - Helper::strlenWithoutDecoration($this->output->getFormatter(), $cell); - - $content = sprintf($this->style->getCellRowContentFormat(), $cell); - - $this->output->write(sprintf($cellFormat, str_pad($content, $width, $this->style->getPaddingChar(), $this->style->getPadType()))); - } - - /** - * Gets number of columns for this table. - * - * @return int - */ - private function getNumberOfColumns() - { - if (null !== $this->numberOfColumns) { - return $this->numberOfColumns; - } - - $columns = array(count($this->headers)); - foreach ($this->rows as $row) { - $columns[] = count($row); - } - - return $this->numberOfColumns = max($columns); - } - - /** - * Gets column width. - * - * @param int $column - * - * @return int - */ - private function getColumnWidth($column) - { - if (isset($this->columnWidths[$column])) { - return $this->columnWidths[$column]; - } - - $lengths = array($this->getCellWidth($this->headers, $column)); - foreach ($this->rows as $row) { - if ($row instanceof TableSeparator) { - continue; - } - - $lengths[] = $this->getCellWidth($row, $column); - } - - return $this->columnWidths[$column] = max($lengths) + strlen($this->style->getCellRowContentFormat()) - 2; - } - - /** - * Gets cell width. - * - * @param array $row - * @param int $column - * - * @return int - */ - private function getCellWidth(array $row, $column) - { - return isset($row[$column]) ? Helper::strlenWithoutDecoration($this->output->getFormatter(), $row[$column]) : 0; - } - - /** - * Called after rendering to cleanup cache data. - */ - private function cleanup() - { - $this->columnWidths = array(); - $this->numberOfColumns = null; - } - - private static function initStyles() - { - $borderless = new TableStyle(); - $borderless - ->setHorizontalBorderChar('=') - ->setVerticalBorderChar(' ') - ->setCrossingChar(' ') - ; - - $compact = new TableStyle(); - $compact - ->setHorizontalBorderChar('') - ->setVerticalBorderChar(' ') - ->setCrossingChar('') - ->setCellRowContentFormat('%s') - ; - - return array( - 'default' => new TableStyle(), - 'borderless' => $borderless, - 'compact' => $compact, - ); - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Helper/TableHelper.php b/vendor/symfony/console/Symfony/Component/Console/Helper/TableHelper.php deleted file mode 100644 index eeb670e88..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Helper/TableHelper.php +++ /dev/null @@ -1,264 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Output\NullOutput; - -/** - * Provides helpers to display table output. - * - * @author Саша Стаменковић - * @author Fabien Potencier - * - * @deprecated Deprecated since 2.5, to be removed in 3.0; use Table instead. - */ -class TableHelper extends Helper -{ - const LAYOUT_DEFAULT = 0; - const LAYOUT_BORDERLESS = 1; - const LAYOUT_COMPACT = 2; - - /** - * @var Table - */ - private $table; - - public function __construct() - { - $this->table = new Table(new NullOutput()); - } - - /** - * Sets table layout type. - * - * @param int $layout self::LAYOUT_* - * - * @return TableHelper - * - * @throws InvalidArgumentException when the table layout is not known - */ - public function setLayout($layout) - { - switch ($layout) { - case self::LAYOUT_BORDERLESS: - $this->table->setStyle('borderless'); - break; - - case self::LAYOUT_COMPACT: - $this->table->setStyle('compact'); - break; - - case self::LAYOUT_DEFAULT: - $this->table->setStyle('default'); - break; - - default: - throw new \InvalidArgumentException(sprintf('Invalid table layout "%s".', $layout)); - break; - }; - - return $this; - } - - public function setHeaders(array $headers) - { - $this->table->setHeaders($headers); - - return $this; - } - - public function setRows(array $rows) - { - $this->table->setRows($rows); - - return $this; - } - - public function addRows(array $rows) - { - $this->table->addRows($rows); - - return $this; - } - - public function addRow(array $row) - { - $this->table->addRow($row); - - return $this; - } - - public function setRow($column, array $row) - { - $this->table->setRow($column, $row); - - return $this; - } - - /** - * Sets padding character, used for cell padding. - * - * @param string $paddingChar - * - * @return TableHelper - */ - public function setPaddingChar($paddingChar) - { - $this->table->getStyle()->setPaddingChar($paddingChar); - - return $this; - } - - /** - * Sets horizontal border character. - * - * @param string $horizontalBorderChar - * - * @return TableHelper - */ - public function setHorizontalBorderChar($horizontalBorderChar) - { - $this->table->getStyle()->setHorizontalBorderChar($horizontalBorderChar); - - return $this; - } - - /** - * Sets vertical border character. - * - * @param string $verticalBorderChar - * - * @return TableHelper - */ - public function setVerticalBorderChar($verticalBorderChar) - { - $this->table->getStyle()->setVerticalBorderChar($verticalBorderChar); - - return $this; - } - - /** - * Sets crossing character. - * - * @param string $crossingChar - * - * @return TableHelper - */ - public function setCrossingChar($crossingChar) - { - $this->table->getStyle()->setCrossingChar($crossingChar); - - return $this; - } - - /** - * Sets header cell format. - * - * @param string $cellHeaderFormat - * - * @return TableHelper - */ - public function setCellHeaderFormat($cellHeaderFormat) - { - $this->table->getStyle()->setCellHeaderFormat($cellHeaderFormat); - - return $this; - } - - /** - * Sets row cell format. - * - * @param string $cellRowFormat - * - * @return TableHelper - */ - public function setCellRowFormat($cellRowFormat) - { - $this->table->getStyle()->setCellHeaderFormat($cellRowFormat); - - return $this; - } - - /** - * Sets row cell content format. - * - * @param string $cellRowContentFormat - * - * @return TableHelper - */ - public function setCellRowContentFormat($cellRowContentFormat) - { - $this->table->getStyle()->setCellRowContentFormat($cellRowContentFormat); - - return $this; - } - - /** - * Sets table border format. - * - * @param string $borderFormat - * - * @return TableHelper - */ - public function setBorderFormat($borderFormat) - { - $this->table->getStyle()->setBorderFormat($borderFormat); - - return $this; - } - - /** - * Sets cell padding type. - * - * @param int $padType STR_PAD_* - * - * @return TableHelper - */ - public function setPadType($padType) - { - $this->table->getStyle()->setPadType($padType); - - return $this; - } - - /** - * Renders table to output. - * - * Example: - * +---------------+-----------------------+------------------+ - * | ISBN | Title | Author | - * +---------------+-----------------------+------------------+ - * | 99921-58-10-7 | Divine Comedy | Dante Alighieri | - * | 9971-5-0210-0 | A Tale of Two Cities | Charles Dickens | - * | 960-425-059-0 | The Lord of the Rings | J. R. R. Tolkien | - * +---------------+-----------------------+------------------+ - * - * @param OutputInterface $output - */ - public function render(OutputInterface $output) - { - $p = new \ReflectionProperty($this->table, 'output'); - $p->setAccessible(true); - $p->setValue($this->table, $output); - - $this->table->render(); - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return 'table'; - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Helper/TableSeparator.php b/vendor/symfony/console/Symfony/Component/Console/Helper/TableSeparator.php deleted file mode 100644 index 1f6981b03..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Helper/TableSeparator.php +++ /dev/null @@ -1,21 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -/** - * Marks a row as being a separator. - * - * @author Fabien Potencier - */ -class TableSeparator -{ -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Helper/TableStyle.php b/vendor/symfony/console/Symfony/Component/Console/Helper/TableStyle.php deleted file mode 100644 index 338f1a060..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Helper/TableStyle.php +++ /dev/null @@ -1,251 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Helper; - -/** - * Defines the styles for a Table. - * - * @author Fabien Potencier - * @author Саша Стаменковић - */ -class TableStyle -{ - private $paddingChar = ' '; - private $horizontalBorderChar = '-'; - private $verticalBorderChar = '|'; - private $crossingChar = '+'; - private $cellHeaderFormat = '%s'; - private $cellRowFormat = '%s'; - private $cellRowContentFormat = ' %s '; - private $borderFormat = '%s'; - private $padType = STR_PAD_RIGHT; - - /** - * Sets padding character, used for cell padding. - * - * @param string $paddingChar - * - * @return TableStyle - */ - public function setPaddingChar($paddingChar) - { - if (!$paddingChar) { - throw new \LogicException('The padding char must not be empty'); - } - - $this->paddingChar = $paddingChar; - - return $this; - } - - /** - * Gets padding character, used for cell padding. - * - * @return string - */ - public function getPaddingChar() - { - return $this->paddingChar; - } - - /** - * Sets horizontal border character. - * - * @param string $horizontalBorderChar - * - * @return TableStyle - */ - public function setHorizontalBorderChar($horizontalBorderChar) - { - $this->horizontalBorderChar = $horizontalBorderChar; - - return $this; - } - - /** - * Gets horizontal border character. - * - * @return string - */ - public function getHorizontalBorderChar() - { - return $this->horizontalBorderChar; - } - - /** - * Sets vertical border character. - * - * @param string $verticalBorderChar - * - * @return TableStyle - */ - public function setVerticalBorderChar($verticalBorderChar) - { - $this->verticalBorderChar = $verticalBorderChar; - - return $this; - } - - /** - * Gets vertical border character. - * - * @return string - */ - public function getVerticalBorderChar() - { - return $this->verticalBorderChar; - } - - /** - * Sets crossing character. - * - * @param string $crossingChar - * - * @return TableStyle - */ - public function setCrossingChar($crossingChar) - { - $this->crossingChar = $crossingChar; - - return $this; - } - - /** - * Gets crossing character. - * - * @return string $crossingChar - */ - public function getCrossingChar() - { - return $this->crossingChar; - } - - /** - * Sets header cell format. - * - * @param string $cellHeaderFormat - * - * @return TableStyle - */ - public function setCellHeaderFormat($cellHeaderFormat) - { - $this->cellHeaderFormat = $cellHeaderFormat; - - return $this; - } - - /** - * Gets header cell format. - * - * @return string - */ - public function getCellHeaderFormat() - { - return $this->cellHeaderFormat; - } - - /** - * Sets row cell format. - * - * @param string $cellRowFormat - * - * @return TableStyle - */ - public function setCellRowFormat($cellRowFormat) - { - $this->cellRowFormat = $cellRowFormat; - - return $this; - } - - /** - * Gets row cell format. - * - * @return string - */ - public function getCellRowFormat() - { - return $this->cellRowFormat; - } - - /** - * Sets row cell content format. - * - * @param string $cellRowContentFormat - * - * @return TableStyle - */ - public function setCellRowContentFormat($cellRowContentFormat) - { - $this->cellRowContentFormat = $cellRowContentFormat; - - return $this; - } - - /** - * Gets row cell content format. - * - * @return string - */ - public function getCellRowContentFormat() - { - return $this->cellRowContentFormat; - } - - /** - * Sets table border format. - * - * @param string $borderFormat - * - * @return TableStyle - */ - public function setBorderFormat($borderFormat) - { - $this->borderFormat = $borderFormat; - - return $this; - } - - /** - * Gets table border format. - * - * @return string - */ - public function getBorderFormat() - { - return $this->borderFormat; - } - - /** - * Sets cell padding type. - * - * @param int $padType STR_PAD_* - * - * @return TableStyle - */ - public function setPadType($padType) - { - $this->padType = $padType; - - return $this; - } - - /** - * Gets cell padding type. - * - * @return int - */ - public function getPadType() - { - return $this->padType; - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Input/ArgvInput.php b/vendor/symfony/console/Symfony/Component/Console/Input/ArgvInput.php deleted file mode 100644 index 3a0f0a719..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Input/ArgvInput.php +++ /dev/null @@ -1,351 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -/** - * ArgvInput represents an input coming from the CLI arguments. - * - * Usage: - * - * $input = new ArgvInput(); - * - * By default, the `$_SERVER['argv']` array is used for the input values. - * - * This can be overridden by explicitly passing the input values in the constructor: - * - * $input = new ArgvInput($_SERVER['argv']); - * - * If you pass it yourself, don't forget that the first element of the array - * is the name of the running application. - * - * When passing an argument to the constructor, be sure that it respects - * the same rules as the argv one. It's almost always better to use the - * `StringInput` when you want to provide your own input. - * - * @author Fabien Potencier - * - * @see http://www.gnu.org/software/libc/manual/html_node/Argument-Syntax.html - * @see http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap12.html#tag_12_02 - * - * @api - */ -class ArgvInput extends Input -{ - private $tokens; - private $parsed; - - /** - * Constructor. - * - * @param array $argv An array of parameters from the CLI (in the argv format) - * @param InputDefinition $definition A InputDefinition instance - * - * @api - */ - public function __construct(array $argv = null, InputDefinition $definition = null) - { - if (null === $argv) { - $argv = $_SERVER['argv']; - } - - // strip the application name - array_shift($argv); - - $this->tokens = $argv; - - parent::__construct($definition); - } - - protected function setTokens(array $tokens) - { - $this->tokens = $tokens; - } - - /** - * Processes command line arguments. - */ - protected function parse() - { - $parseOptions = true; - $this->parsed = $this->tokens; - while (null !== $token = array_shift($this->parsed)) { - if ($parseOptions && '' == $token) { - $this->parseArgument($token); - } elseif ($parseOptions && '--' == $token) { - $parseOptions = false; - } elseif ($parseOptions && 0 === strpos($token, '--')) { - $this->parseLongOption($token); - } elseif ($parseOptions && '-' === $token[0] && '-' !== $token) { - $this->parseShortOption($token); - } else { - $this->parseArgument($token); - } - } - } - - /** - * Parses a short option. - * - * @param string $token The current token. - */ - private function parseShortOption($token) - { - $name = substr($token, 1); - - if (strlen($name) > 1) { - if ($this->definition->hasShortcut($name[0]) && $this->definition->getOptionForShortcut($name[0])->acceptValue()) { - // an option with a value (with no space) - $this->addShortOption($name[0], substr($name, 1)); - } else { - $this->parseShortOptionSet($name); - } - } else { - $this->addShortOption($name, null); - } - } - - /** - * Parses a short option set. - * - * @param string $name The current token - * - * @throws \RuntimeException When option given doesn't exist - */ - private function parseShortOptionSet($name) - { - $len = strlen($name); - for ($i = 0; $i < $len; $i++) { - if (!$this->definition->hasShortcut($name[$i])) { - throw new \RuntimeException(sprintf('The "-%s" option does not exist.', $name[$i])); - } - - $option = $this->definition->getOptionForShortcut($name[$i]); - if ($option->acceptValue()) { - $this->addLongOption($option->getName(), $i === $len - 1 ? null : substr($name, $i + 1)); - - break; - } else { - $this->addLongOption($option->getName(), null); - } - } - } - - /** - * Parses a long option. - * - * @param string $token The current token - */ - private function parseLongOption($token) - { - $name = substr($token, 2); - - if (false !== $pos = strpos($name, '=')) { - $this->addLongOption(substr($name, 0, $pos), substr($name, $pos + 1)); - } else { - $this->addLongOption($name, null); - } - } - - /** - * Parses an argument. - * - * @param string $token The current token - * - * @throws \RuntimeException When too many arguments are given - */ - private function parseArgument($token) - { - $c = count($this->arguments); - - // if input is expecting another argument, add it - if ($this->definition->hasArgument($c)) { - $arg = $this->definition->getArgument($c); - $this->arguments[$arg->getName()] = $arg->isArray()? array($token) : $token; - - // if last argument isArray(), append token to last argument - } elseif ($this->definition->hasArgument($c - 1) && $this->definition->getArgument($c - 1)->isArray()) { - $arg = $this->definition->getArgument($c - 1); - $this->arguments[$arg->getName()][] = $token; - - // unexpected argument - } else { - throw new \RuntimeException('Too many arguments.'); - } - } - - /** - * Adds a short option value. - * - * @param string $shortcut The short option key - * @param mixed $value The value for the option - * - * @throws \RuntimeException When option given doesn't exist - */ - private function addShortOption($shortcut, $value) - { - if (!$this->definition->hasShortcut($shortcut)) { - throw new \RuntimeException(sprintf('The "-%s" option does not exist.', $shortcut)); - } - - $this->addLongOption($this->definition->getOptionForShortcut($shortcut)->getName(), $value); - } - - /** - * Adds a long option value. - * - * @param string $name The long option key - * @param mixed $value The value for the option - * - * @throws \RuntimeException When option given doesn't exist - */ - private function addLongOption($name, $value) - { - if (!$this->definition->hasOption($name)) { - throw new \RuntimeException(sprintf('The "--%s" option does not exist.', $name)); - } - - $option = $this->definition->getOption($name); - - // Convert false values (from a previous call to substr()) to null - if (false === $value) { - $value = null; - } - - if (null !== $value && !$option->acceptValue()) { - throw new \RuntimeException(sprintf('The "--%s" option does not accept a value.', $name, $value)); - } - - if (null === $value && $option->acceptValue() && count($this->parsed)) { - // if option accepts an optional or mandatory argument - // let's see if there is one provided - $next = array_shift($this->parsed); - if (isset($next[0]) && '-' !== $next[0]) { - $value = $next; - } elseif (empty($next)) { - $value = ''; - } else { - array_unshift($this->parsed, $next); - } - } - - if (null === $value) { - if ($option->isValueRequired()) { - throw new \RuntimeException(sprintf('The "--%s" option requires a value.', $name)); - } - - if (!$option->isArray()) { - $value = $option->isValueOptional() ? $option->getDefault() : true; - } - } - - if ($option->isArray()) { - $this->options[$name][] = $value; - } else { - $this->options[$name] = $value; - } - } - - /** - * Returns the first argument from the raw parameters (not parsed). - * - * @return string The value of the first argument or null otherwise - */ - public function getFirstArgument() - { - foreach ($this->tokens as $token) { - if ($token && '-' === $token[0]) { - continue; - } - - return $token; - } - } - - /** - * Returns true if the raw parameters (not parsed) contain a value. - * - * This method is to be used to introspect the input parameters - * before they have been validated. It must be used carefully. - * - * @param string|array $values The value(s) to look for in the raw parameters (can be an array) - * - * @return bool true if the value is contained in the raw parameters - */ - public function hasParameterOption($values) - { - $values = (array) $values; - - foreach ($this->tokens as $token) { - foreach ($values as $value) { - if ($token === $value || 0 === strpos($token, $value.'=')) { - return true; - } - } - } - - return false; - } - - /** - * Returns the value of a raw option (not parsed). - * - * This method is to be used to introspect the input parameters - * before they have been validated. It must be used carefully. - * - * @param string|array $values The value(s) to look for in the raw parameters (can be an array) - * @param mixed $default The default value to return if no result is found - * - * @return mixed The option value - */ - public function getParameterOption($values, $default = false) - { - $values = (array) $values; - - $tokens = $this->tokens; - while ($token = array_shift($tokens)) { - foreach ($values as $value) { - if ($token === $value || 0 === strpos($token, $value.'=')) { - if (false !== $pos = strpos($token, '=')) { - return substr($token, $pos + 1); - } - - return array_shift($tokens); - } - } - } - - return $default; - } - - /** - * Returns a stringified representation of the args passed to the command - * - * @return string - */ - public function __toString() - { - $self = $this; - $tokens = array_map(function ($token) use ($self) { - if (preg_match('{^(-[^=]+=)(.+)}', $token, $match)) { - return $match[1] . $self->escapeToken($match[2]); - } - - if ($token && $token[0] !== '-') { - return $self->escapeToken($token); - } - - return $token; - }, $this->tokens); - - return implode(' ', $tokens); - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Input/ArrayInput.php b/vendor/symfony/console/Symfony/Component/Console/Input/ArrayInput.php deleted file mode 100644 index 27d91323f..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Input/ArrayInput.php +++ /dev/null @@ -1,209 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -/** - * ArrayInput represents an input provided as an array. - * - * Usage: - * - * $input = new ArrayInput(array('name' => 'foo', '--bar' => 'foobar')); - * - * @author Fabien Potencier - * - * @api - */ -class ArrayInput extends Input -{ - private $parameters; - - /** - * Constructor. - * - * @param array $parameters An array of parameters - * @param InputDefinition $definition A InputDefinition instance - * - * @api - */ - public function __construct(array $parameters, InputDefinition $definition = null) - { - $this->parameters = $parameters; - - parent::__construct($definition); - } - - /** - * Returns the first argument from the raw parameters (not parsed). - * - * @return string The value of the first argument or null otherwise - */ - public function getFirstArgument() - { - foreach ($this->parameters as $key => $value) { - if ($key && '-' === $key[0]) { - continue; - } - - return $value; - } - } - - /** - * Returns true if the raw parameters (not parsed) contain a value. - * - * This method is to be used to introspect the input parameters - * before they have been validated. It must be used carefully. - * - * @param string|array $values The values to look for in the raw parameters (can be an array) - * - * @return bool true if the value is contained in the raw parameters - */ - public function hasParameterOption($values) - { - $values = (array) $values; - - foreach ($this->parameters as $k => $v) { - if (!is_int($k)) { - $v = $k; - } - - if (in_array($v, $values)) { - return true; - } - } - - return false; - } - - /** - * Returns the value of a raw option (not parsed). - * - * This method is to be used to introspect the input parameters - * before they have been validated. It must be used carefully. - * - * @param string|array $values The value(s) to look for in the raw parameters (can be an array) - * @param mixed $default The default value to return if no result is found - * - * @return mixed The option value - */ - public function getParameterOption($values, $default = false) - { - $values = (array) $values; - - foreach ($this->parameters as $k => $v) { - if (is_int($k) && in_array($v, $values)) { - return true; - } elseif (in_array($k, $values)) { - return $v; - } - } - - return $default; - } - - /** - * Returns a stringified representation of the args passed to the command - * - * @return string - */ - public function __toString() - { - $params = array(); - foreach ($this->parameters as $param => $val) { - if ($param && '-' === $param[0]) { - $params[] = $param . ('' != $val ? '='.$this->escapeToken($val) : ''); - } else { - $params[] = $this->escapeToken($val); - } - } - - return implode(' ', $params); - } - - /** - * Processes command line arguments. - */ - protected function parse() - { - foreach ($this->parameters as $key => $value) { - if (0 === strpos($key, '--')) { - $this->addLongOption(substr($key, 2), $value); - } elseif ('-' === $key[0]) { - $this->addShortOption(substr($key, 1), $value); - } else { - $this->addArgument($key, $value); - } - } - } - - /** - * Adds a short option value. - * - * @param string $shortcut The short option key - * @param mixed $value The value for the option - * - * @throws \InvalidArgumentException When option given doesn't exist - */ - private function addShortOption($shortcut, $value) - { - if (!$this->definition->hasShortcut($shortcut)) { - throw new \InvalidArgumentException(sprintf('The "-%s" option does not exist.', $shortcut)); - } - - $this->addLongOption($this->definition->getOptionForShortcut($shortcut)->getName(), $value); - } - - /** - * Adds a long option value. - * - * @param string $name The long option key - * @param mixed $value The value for the option - * - * @throws \InvalidArgumentException When option given doesn't exist - * @throws \InvalidArgumentException When a required value is missing - */ - private function addLongOption($name, $value) - { - if (!$this->definition->hasOption($name)) { - throw new \InvalidArgumentException(sprintf('The "--%s" option does not exist.', $name)); - } - - $option = $this->definition->getOption($name); - - if (null === $value) { - if ($option->isValueRequired()) { - throw new \InvalidArgumentException(sprintf('The "--%s" option requires a value.', $name)); - } - - $value = $option->isValueOptional() ? $option->getDefault() : true; - } - - $this->options[$name] = $value; - } - - /** - * Adds an argument value. - * - * @param string $name The argument name - * @param mixed $value The value for the argument - * - * @throws \InvalidArgumentException When argument given doesn't exist - */ - private function addArgument($name, $value) - { - if (!$this->definition->hasArgument($name)) { - throw new \InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name)); - } - - $this->arguments[$name] = $value; - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Input/Input.php b/vendor/symfony/console/Symfony/Component/Console/Input/Input.php deleted file mode 100644 index 494dd4220..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Input/Input.php +++ /dev/null @@ -1,226 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -/** - * Input is the base class for all concrete Input classes. - * - * Three concrete classes are provided by default: - * - * * `ArgvInput`: The input comes from the CLI arguments (argv) - * * `StringInput`: The input is provided as a string - * * `ArrayInput`: The input is provided as an array - * - * @author Fabien Potencier - */ -abstract class Input implements InputInterface -{ - /** - * @var InputDefinition - */ - protected $definition; - protected $options = array(); - protected $arguments = array(); - protected $interactive = true; - - /** - * Constructor. - * - * @param InputDefinition $definition A InputDefinition instance - */ - public function __construct(InputDefinition $definition = null) - { - if (null === $definition) { - $this->definition = new InputDefinition(); - } else { - $this->bind($definition); - $this->validate(); - } - } - - /** - * Binds the current Input instance with the given arguments and options. - * - * @param InputDefinition $definition A InputDefinition instance - */ - public function bind(InputDefinition $definition) - { - $this->arguments = array(); - $this->options = array(); - $this->definition = $definition; - - $this->parse(); - } - - /** - * Processes command line arguments. - */ - abstract protected function parse(); - - /** - * Validates the input. - * - * @throws \RuntimeException When not enough arguments are given - */ - public function validate() - { - if (count($this->arguments) < $this->definition->getArgumentRequiredCount()) { - throw new \RuntimeException('Not enough arguments.'); - } - } - - /** - * Checks if the input is interactive. - * - * @return bool Returns true if the input is interactive - */ - public function isInteractive() - { - return $this->interactive; - } - - /** - * Sets the input interactivity. - * - * @param bool $interactive If the input should be interactive - */ - public function setInteractive($interactive) - { - $this->interactive = (bool) $interactive; - } - - /** - * Returns the argument values. - * - * @return array An array of argument values - */ - public function getArguments() - { - return array_merge($this->definition->getArgumentDefaults(), $this->arguments); - } - - /** - * Returns the argument value for a given argument name. - * - * @param string $name The argument name - * - * @return mixed The argument value - * - * @throws \InvalidArgumentException When argument given doesn't exist - */ - public function getArgument($name) - { - if (!$this->definition->hasArgument($name)) { - throw new \InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name)); - } - - return isset($this->arguments[$name]) ? $this->arguments[$name] : $this->definition->getArgument($name)->getDefault(); - } - - /** - * Sets an argument value by name. - * - * @param string $name The argument name - * @param string $value The argument value - * - * @throws \InvalidArgumentException When argument given doesn't exist - */ - public function setArgument($name, $value) - { - if (!$this->definition->hasArgument($name)) { - throw new \InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name)); - } - - $this->arguments[$name] = $value; - } - - /** - * Returns true if an InputArgument object exists by name or position. - * - * @param string|int $name The InputArgument name or position - * - * @return bool true if the InputArgument object exists, false otherwise - */ - public function hasArgument($name) - { - return $this->definition->hasArgument($name); - } - - /** - * Returns the options values. - * - * @return array An array of option values - */ - public function getOptions() - { - return array_merge($this->definition->getOptionDefaults(), $this->options); - } - - /** - * Returns the option value for a given option name. - * - * @param string $name The option name - * - * @return mixed The option value - * - * @throws \InvalidArgumentException When option given doesn't exist - */ - public function getOption($name) - { - if (!$this->definition->hasOption($name)) { - throw new \InvalidArgumentException(sprintf('The "%s" option does not exist.', $name)); - } - - return isset($this->options[$name]) ? $this->options[$name] : $this->definition->getOption($name)->getDefault(); - } - - /** - * Sets an option value by name. - * - * @param string $name The option name - * @param string|bool $value The option value - * - * @throws \InvalidArgumentException When option given doesn't exist - */ - public function setOption($name, $value) - { - if (!$this->definition->hasOption($name)) { - throw new \InvalidArgumentException(sprintf('The "%s" option does not exist.', $name)); - } - - $this->options[$name] = $value; - } - - /** - * Returns true if an InputOption object exists by name. - * - * @param string $name The InputOption name - * - * @return bool true if the InputOption object exists, false otherwise - */ - public function hasOption($name) - { - return $this->definition->hasOption($name); - } - - /** - * Escapes a token through escapeshellarg if it contains unsafe chars - * - * @param string $token - * - * @return string - */ - public function escapeToken($token) - { - return preg_match('{^[\w-]+$}', $token) ? $token : escapeshellarg($token); - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Input/InputArgument.php b/vendor/symfony/console/Symfony/Component/Console/Input/InputArgument.php deleted file mode 100644 index bf9c99e14..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Input/InputArgument.php +++ /dev/null @@ -1,132 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -/** - * Represents a command line argument. - * - * @author Fabien Potencier - * - * @api - */ -class InputArgument -{ - const REQUIRED = 1; - const OPTIONAL = 2; - const IS_ARRAY = 4; - - private $name; - private $mode; - private $default; - private $description; - - /** - * Constructor. - * - * @param string $name The argument name - * @param int $mode The argument mode: self::REQUIRED or self::OPTIONAL - * @param string $description A description text - * @param mixed $default The default value (for self::OPTIONAL mode only) - * - * @throws \InvalidArgumentException When argument mode is not valid - * - * @api - */ - public function __construct($name, $mode = null, $description = '', $default = null) - { - if (null === $mode) { - $mode = self::OPTIONAL; - } elseif (!is_int($mode) || $mode > 7 || $mode < 1) { - throw new \InvalidArgumentException(sprintf('Argument mode "%s" is not valid.', $mode)); - } - - $this->name = $name; - $this->mode = $mode; - $this->description = $description; - - $this->setDefault($default); - } - - /** - * Returns the argument name. - * - * @return string The argument name - */ - public function getName() - { - return $this->name; - } - - /** - * Returns true if the argument is required. - * - * @return bool true if parameter mode is self::REQUIRED, false otherwise - */ - public function isRequired() - { - return self::REQUIRED === (self::REQUIRED & $this->mode); - } - - /** - * Returns true if the argument can take multiple values. - * - * @return bool true if mode is self::IS_ARRAY, false otherwise - */ - public function isArray() - { - return self::IS_ARRAY === (self::IS_ARRAY & $this->mode); - } - - /** - * Sets the default value. - * - * @param mixed $default The default value - * - * @throws \LogicException When incorrect default value is given - */ - public function setDefault($default = null) - { - if (self::REQUIRED === $this->mode && null !== $default) { - throw new \LogicException('Cannot set a default value except for InputArgument::OPTIONAL mode.'); - } - - if ($this->isArray()) { - if (null === $default) { - $default = array(); - } elseif (!is_array($default)) { - throw new \LogicException('A default value for an array argument must be an array.'); - } - } - - $this->default = $default; - } - - /** - * Returns the default value. - * - * @return mixed The default value - */ - public function getDefault() - { - return $this->default; - } - - /** - * Returns the description text. - * - * @return string The description text - */ - public function getDescription() - { - return $this->description; - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Input/InputAwareInterface.php b/vendor/symfony/console/Symfony/Component/Console/Input/InputAwareInterface.php deleted file mode 100644 index d0f11e986..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Input/InputAwareInterface.php +++ /dev/null @@ -1,28 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -/** - * InputAwareInterface should be implemented by classes that depends on the - * Console Input. - * - * @author Wouter J - */ -interface InputAwareInterface -{ - /** - * Sets the Console Input. - * - * @param InputInterface - */ - public function setInput(InputInterface $input); -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Input/InputDefinition.php b/vendor/symfony/console/Symfony/Component/Console/Input/InputDefinition.php deleted file mode 100644 index 46579a27f..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Input/InputDefinition.php +++ /dev/null @@ -1,458 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -if (!defined('JSON_UNESCAPED_UNICODE')) { - define('JSON_UNESCAPED_SLASHES', 64); - define('JSON_UNESCAPED_UNICODE', 256); -} - -use Symfony\Component\Console\Descriptor\TextDescriptor; -use Symfony\Component\Console\Descriptor\XmlDescriptor; -use Symfony\Component\Console\Output\BufferedOutput; - -/** - * A InputDefinition represents a set of valid command line arguments and options. - * - * Usage: - * - * $definition = new InputDefinition(array( - * new InputArgument('name', InputArgument::REQUIRED), - * new InputOption('foo', 'f', InputOption::VALUE_REQUIRED), - * )); - * - * @author Fabien Potencier - * - * @api - */ -class InputDefinition -{ - private $arguments; - private $requiredCount; - private $hasAnArrayArgument = false; - private $hasOptional; - private $options; - private $shortcuts; - - /** - * Constructor. - * - * @param array $definition An array of InputArgument and InputOption instance - * - * @api - */ - public function __construct(array $definition = array()) - { - $this->setDefinition($definition); - } - - /** - * Sets the definition of the input. - * - * @param array $definition The definition array - * - * @api - */ - public function setDefinition(array $definition) - { - $arguments = array(); - $options = array(); - foreach ($definition as $item) { - if ($item instanceof InputOption) { - $options[] = $item; - } else { - $arguments[] = $item; - } - } - - $this->setArguments($arguments); - $this->setOptions($options); - } - - /** - * Sets the InputArgument objects. - * - * @param InputArgument[] $arguments An array of InputArgument objects - * - * @api - */ - public function setArguments($arguments = array()) - { - $this->arguments = array(); - $this->requiredCount = 0; - $this->hasOptional = false; - $this->hasAnArrayArgument = false; - $this->addArguments($arguments); - } - - /** - * Adds an array of InputArgument objects. - * - * @param InputArgument[] $arguments An array of InputArgument objects - * - * @api - */ - public function addArguments($arguments = array()) - { - if (null !== $arguments) { - foreach ($arguments as $argument) { - $this->addArgument($argument); - } - } - } - - /** - * Adds an InputArgument object. - * - * @param InputArgument $argument An InputArgument object - * - * @throws \LogicException When incorrect argument is given - * - * @api - */ - public function addArgument(InputArgument $argument) - { - if (isset($this->arguments[$argument->getName()])) { - throw new \LogicException(sprintf('An argument with name "%s" already exists.', $argument->getName())); - } - - if ($this->hasAnArrayArgument) { - throw new \LogicException('Cannot add an argument after an array argument.'); - } - - if ($argument->isRequired() && $this->hasOptional) { - throw new \LogicException('Cannot add a required argument after an optional one.'); - } - - if ($argument->isArray()) { - $this->hasAnArrayArgument = true; - } - - if ($argument->isRequired()) { - ++$this->requiredCount; - } else { - $this->hasOptional = true; - } - - $this->arguments[$argument->getName()] = $argument; - } - - /** - * Returns an InputArgument by name or by position. - * - * @param string|int $name The InputArgument name or position - * - * @return InputArgument An InputArgument object - * - * @throws \InvalidArgumentException When argument given doesn't exist - * - * @api - */ - public function getArgument($name) - { - if (!$this->hasArgument($name)) { - throw new \InvalidArgumentException(sprintf('The "%s" argument does not exist.', $name)); - } - - $arguments = is_int($name) ? array_values($this->arguments) : $this->arguments; - - return $arguments[$name]; - } - - /** - * Returns true if an InputArgument object exists by name or position. - * - * @param string|int $name The InputArgument name or position - * - * @return bool true if the InputArgument object exists, false otherwise - * - * @api - */ - public function hasArgument($name) - { - $arguments = is_int($name) ? array_values($this->arguments) : $this->arguments; - - return isset($arguments[$name]); - } - - /** - * Gets the array of InputArgument objects. - * - * @return InputArgument[] An array of InputArgument objects - * - * @api - */ - public function getArguments() - { - return $this->arguments; - } - - /** - * Returns the number of InputArguments. - * - * @return int The number of InputArguments - */ - public function getArgumentCount() - { - return $this->hasAnArrayArgument ? PHP_INT_MAX : count($this->arguments); - } - - /** - * Returns the number of required InputArguments. - * - * @return int The number of required InputArguments - */ - public function getArgumentRequiredCount() - { - return $this->requiredCount; - } - - /** - * Gets the default values. - * - * @return array An array of default values - */ - public function getArgumentDefaults() - { - $values = array(); - foreach ($this->arguments as $argument) { - $values[$argument->getName()] = $argument->getDefault(); - } - - return $values; - } - - /** - * Sets the InputOption objects. - * - * @param InputOption[] $options An array of InputOption objects - * - * @api - */ - public function setOptions($options = array()) - { - $this->options = array(); - $this->shortcuts = array(); - $this->addOptions($options); - } - - /** - * Adds an array of InputOption objects. - * - * @param InputOption[] $options An array of InputOption objects - * - * @api - */ - public function addOptions($options = array()) - { - foreach ($options as $option) { - $this->addOption($option); - } - } - - /** - * Adds an InputOption object. - * - * @param InputOption $option An InputOption object - * - * @throws \LogicException When option given already exist - * - * @api - */ - public function addOption(InputOption $option) - { - if (isset($this->options[$option->getName()]) && !$option->equals($this->options[$option->getName()])) { - throw new \LogicException(sprintf('An option named "%s" already exists.', $option->getName())); - } - - if ($option->getShortcut()) { - foreach (explode('|', $option->getShortcut()) as $shortcut) { - if (isset($this->shortcuts[$shortcut]) && !$option->equals($this->options[$this->shortcuts[$shortcut]])) { - throw new \LogicException(sprintf('An option with shortcut "%s" already exists.', $shortcut)); - } - } - } - - $this->options[$option->getName()] = $option; - if ($option->getShortcut()) { - foreach (explode('|', $option->getShortcut()) as $shortcut) { - $this->shortcuts[$shortcut] = $option->getName(); - } - } - } - - /** - * Returns an InputOption by name. - * - * @param string $name The InputOption name - * - * @return InputOption A InputOption object - * - * @throws \InvalidArgumentException When option given doesn't exist - * - * @api - */ - public function getOption($name) - { - if (!$this->hasOption($name)) { - throw new \InvalidArgumentException(sprintf('The "--%s" option does not exist.', $name)); - } - - return $this->options[$name]; - } - - /** - * Returns true if an InputOption object exists by name. - * - * @param string $name The InputOption name - * - * @return bool true if the InputOption object exists, false otherwise - * - * @api - */ - public function hasOption($name) - { - return isset($this->options[$name]); - } - - /** - * Gets the array of InputOption objects. - * - * @return InputOption[] An array of InputOption objects - * - * @api - */ - public function getOptions() - { - return $this->options; - } - - /** - * Returns true if an InputOption object exists by shortcut. - * - * @param string $name The InputOption shortcut - * - * @return bool true if the InputOption object exists, false otherwise - */ - public function hasShortcut($name) - { - return isset($this->shortcuts[$name]); - } - - /** - * Gets an InputOption by shortcut. - * - * @param string $shortcut the Shortcut name - * - * @return InputOption An InputOption object - */ - public function getOptionForShortcut($shortcut) - { - return $this->getOption($this->shortcutToName($shortcut)); - } - - /** - * Gets an array of default values. - * - * @return array An array of all default values - */ - public function getOptionDefaults() - { - $values = array(); - foreach ($this->options as $option) { - $values[$option->getName()] = $option->getDefault(); - } - - return $values; - } - - /** - * Returns the InputOption name given a shortcut. - * - * @param string $shortcut The shortcut - * - * @return string The InputOption name - * - * @throws \InvalidArgumentException When option given does not exist - */ - private function shortcutToName($shortcut) - { - if (!isset($this->shortcuts[$shortcut])) { - throw new \InvalidArgumentException(sprintf('The "-%s" option does not exist.', $shortcut)); - } - - return $this->shortcuts[$shortcut]; - } - - /** - * Gets the synopsis. - * - * @return string The synopsis - */ - public function getSynopsis() - { - $elements = array(); - foreach ($this->getOptions() as $option) { - $shortcut = $option->getShortcut() ? sprintf('-%s|', $option->getShortcut()) : ''; - $elements[] = sprintf('['.($option->isValueRequired() ? '%s--%s="..."' : ($option->isValueOptional() ? '%s--%s[="..."]' : '%s--%s')).']', $shortcut, $option->getName()); - } - - foreach ($this->getArguments() as $argument) { - $elements[] = sprintf($argument->isRequired() ? '%s' : '[%s]', $argument->getName().($argument->isArray() ? '1' : '')); - - if ($argument->isArray()) { - $elements[] = sprintf('... [%sN]', $argument->getName()); - } - } - - return implode(' ', $elements); - } - - /** - * Returns a textual representation of the InputDefinition. - * - * @return string A string representing the InputDefinition - * - * @deprecated Deprecated since version 2.3, to be removed in 3.0. - */ - public function asText() - { - $descriptor = new TextDescriptor(); - $output = new BufferedOutput(BufferedOutput::VERBOSITY_NORMAL, true); - $descriptor->describe($output, $this, array('raw_output' => true)); - - return $output->fetch(); - } - - /** - * Returns an XML representation of the InputDefinition. - * - * @param bool $asDom Whether to return a DOM or an XML string - * - * @return string|\DOMDocument An XML string representing the InputDefinition - * - * @deprecated Deprecated since version 2.3, to be removed in 3.0. - */ - public function asXml($asDom = false) - { - $descriptor = new XmlDescriptor(); - - if ($asDom) { - return $descriptor->getInputDefinitionDocument($this); - } - - $output = new BufferedOutput(); - $descriptor->describe($output, $this); - - return $output->fetch(); - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Input/InputInterface.php b/vendor/symfony/console/Symfony/Component/Console/Input/InputInterface.php deleted file mode 100644 index befa272c4..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Input/InputInterface.php +++ /dev/null @@ -1,152 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -/** - * InputInterface is the interface implemented by all input classes. - * - * @author Fabien Potencier - */ -interface InputInterface -{ - /** - * Returns the first argument from the raw parameters (not parsed). - * - * @return string The value of the first argument or null otherwise - */ - public function getFirstArgument(); - - /** - * Returns true if the raw parameters (not parsed) contain a value. - * - * This method is to be used to introspect the input parameters - * before they have been validated. It must be used carefully. - * - * @param string|array $values The values to look for in the raw parameters (can be an array) - * - * @return bool true if the value is contained in the raw parameters - */ - public function hasParameterOption($values); - - /** - * Returns the value of a raw option (not parsed). - * - * This method is to be used to introspect the input parameters - * before they have been validated. It must be used carefully. - * - * @param string|array $values The value(s) to look for in the raw parameters (can be an array) - * @param mixed $default The default value to return if no result is found - * - * @return mixed The option value - */ - public function getParameterOption($values, $default = false); - - /** - * Binds the current Input instance with the given arguments and options. - * - * @param InputDefinition $definition A InputDefinition instance - */ - public function bind(InputDefinition $definition); - - /** - * Validates if arguments given are correct. - * - * Throws an exception when not enough arguments are given. - * - * @throws \RuntimeException - */ - public function validate(); - - /** - * Returns all the given arguments merged with the default values. - * - * @return array - */ - public function getArguments(); - - /** - * Gets argument by name. - * - * @param string $name The name of the argument - * - * @return mixed - */ - public function getArgument($name); - - /** - * Sets an argument value by name. - * - * @param string $name The argument name - * @param string $value The argument value - * - * @throws \InvalidArgumentException When argument given doesn't exist - */ - public function setArgument($name, $value); - - /** - * Returns true if an InputArgument object exists by name or position. - * - * @param string|int $name The InputArgument name or position - * - * @return bool true if the InputArgument object exists, false otherwise - */ - public function hasArgument($name); - - /** - * Returns all the given options merged with the default values. - * - * @return array - */ - public function getOptions(); - - /** - * Gets an option by name. - * - * @param string $name The name of the option - * - * @return mixed - */ - public function getOption($name); - - /** - * Sets an option value by name. - * - * @param string $name The option name - * @param string|bool $value The option value - * - * @throws \InvalidArgumentException When option given doesn't exist - */ - public function setOption($name, $value); - - /** - * Returns true if an InputOption object exists by name. - * - * @param string $name The InputOption name - * - * @return bool true if the InputOption object exists, false otherwise - */ - public function hasOption($name); - - /** - * Is this input means interactive? - * - * @return bool - */ - public function isInteractive(); - - /** - * Sets the input interactivity. - * - * @param bool $interactive If the input should be interactive - */ - public function setInteractive($interactive); -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Input/InputOption.php b/vendor/symfony/console/Symfony/Component/Console/Input/InputOption.php deleted file mode 100644 index 18d05e906..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Input/InputOption.php +++ /dev/null @@ -1,212 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -/** - * Represents a command line option. - * - * @author Fabien Potencier - * - * @api - */ -class InputOption -{ - const VALUE_NONE = 1; - const VALUE_REQUIRED = 2; - const VALUE_OPTIONAL = 4; - const VALUE_IS_ARRAY = 8; - - private $name; - private $shortcut; - private $mode; - private $default; - private $description; - - /** - * Constructor. - * - * @param string $name The option name - * @param string|array $shortcut The shortcuts, can be null, a string of shortcuts delimited by | or an array of shortcuts - * @param int $mode The option mode: One of the VALUE_* constants - * @param string $description A description text - * @param mixed $default The default value (must be null for self::VALUE_REQUIRED or self::VALUE_NONE) - * - * @throws \InvalidArgumentException If option mode is invalid or incompatible - * - * @api - */ - public function __construct($name, $shortcut = null, $mode = null, $description = '', $default = null) - { - if (0 === strpos($name, '--')) { - $name = substr($name, 2); - } - - if (empty($name)) { - throw new \InvalidArgumentException('An option name cannot be empty.'); - } - - if (empty($shortcut)) { - $shortcut = null; - } - - if (null !== $shortcut) { - if (is_array($shortcut)) { - $shortcut = implode('|', $shortcut); - } - $shortcuts = preg_split('{(\|)-?}', ltrim($shortcut, '-')); - $shortcuts = array_filter($shortcuts); - $shortcut = implode('|', $shortcuts); - - if (empty($shortcut)) { - throw new \InvalidArgumentException('An option shortcut cannot be empty.'); - } - } - - if (null === $mode) { - $mode = self::VALUE_NONE; - } elseif (!is_int($mode) || $mode > 15 || $mode < 1) { - throw new \InvalidArgumentException(sprintf('Option mode "%s" is not valid.', $mode)); - } - - $this->name = $name; - $this->shortcut = $shortcut; - $this->mode = $mode; - $this->description = $description; - - if ($this->isArray() && !$this->acceptValue()) { - throw new \InvalidArgumentException('Impossible to have an option mode VALUE_IS_ARRAY if the option does not accept a value.'); - } - - $this->setDefault($default); - } - - /** - * Returns the option shortcut. - * - * @return string The shortcut - */ - public function getShortcut() - { - return $this->shortcut; - } - - /** - * Returns the option name. - * - * @return string The name - */ - public function getName() - { - return $this->name; - } - - /** - * Returns true if the option accepts a value. - * - * @return bool true if value mode is not self::VALUE_NONE, false otherwise - */ - public function acceptValue() - { - return $this->isValueRequired() || $this->isValueOptional(); - } - - /** - * Returns true if the option requires a value. - * - * @return bool true if value mode is self::VALUE_REQUIRED, false otherwise - */ - public function isValueRequired() - { - return self::VALUE_REQUIRED === (self::VALUE_REQUIRED & $this->mode); - } - - /** - * Returns true if the option takes an optional value. - * - * @return bool true if value mode is self::VALUE_OPTIONAL, false otherwise - */ - public function isValueOptional() - { - return self::VALUE_OPTIONAL === (self::VALUE_OPTIONAL & $this->mode); - } - - /** - * Returns true if the option can take multiple values. - * - * @return bool true if mode is self::VALUE_IS_ARRAY, false otherwise - */ - public function isArray() - { - return self::VALUE_IS_ARRAY === (self::VALUE_IS_ARRAY & $this->mode); - } - - /** - * Sets the default value. - * - * @param mixed $default The default value - * - * @throws \LogicException When incorrect default value is given - */ - public function setDefault($default = null) - { - if (self::VALUE_NONE === (self::VALUE_NONE & $this->mode) && null !== $default) { - throw new \LogicException('Cannot set a default value when using InputOption::VALUE_NONE mode.'); - } - - if ($this->isArray()) { - if (null === $default) { - $default = array(); - } elseif (!is_array($default)) { - throw new \LogicException('A default value for an array option must be an array.'); - } - } - - $this->default = $this->acceptValue() ? $default : false; - } - - /** - * Returns the default value. - * - * @return mixed The default value - */ - public function getDefault() - { - return $this->default; - } - - /** - * Returns the description text. - * - * @return string The description text - */ - public function getDescription() - { - return $this->description; - } - - /** - * Checks whether the given option equals this one - * - * @param InputOption $option option to compare - * @return bool - */ - public function equals(InputOption $option) - { - return $option->getName() === $this->getName() - && $option->getShortcut() === $this->getShortcut() - && $option->getDefault() === $this->getDefault() - && $option->isArray() === $this->isArray() - && $option->isValueRequired() === $this->isValueRequired() - && $option->isValueOptional() === $this->isValueOptional() - ; - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Input/StringInput.php b/vendor/symfony/console/Symfony/Component/Console/Input/StringInput.php deleted file mode 100644 index 6537e27a6..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Input/StringInput.php +++ /dev/null @@ -1,83 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Input; - -/** - * StringInput represents an input provided as a string. - * - * Usage: - * - * $input = new StringInput('foo --bar="foobar"'); - * - * @author Fabien Potencier - * - * @api - */ -class StringInput extends ArgvInput -{ - const REGEX_STRING = '([^\s]+?)(?:\s|(?setTokens($this->tokenize($input)); - - if (null !== $definition) { - $this->bind($definition); - } - } - - /** - * Tokenizes a string. - * - * @param string $input The input to tokenize - * - * @return array An array of tokens - * - * @throws \InvalidArgumentException When unable to parse input (should never happen) - */ - private function tokenize($input) - { - $tokens = array(); - $length = strlen($input); - $cursor = 0; - while ($cursor < $length) { - if (preg_match('/\s+/A', $input, $match, null, $cursor)) { - } elseif (preg_match('/([^="\'\s]+?)(=?)('.self::REGEX_QUOTED_STRING.'+)/A', $input, $match, null, $cursor)) { - $tokens[] = $match[1].$match[2].stripcslashes(str_replace(array('"\'', '\'"', '\'\'', '""'), '', substr($match[3], 1, strlen($match[3]) - 2))); - } elseif (preg_match('/'.self::REGEX_QUOTED_STRING.'/A', $input, $match, null, $cursor)) { - $tokens[] = stripcslashes(substr($match[0], 1, strlen($match[0]) - 2)); - } elseif (preg_match('/'.self::REGEX_STRING.'/A', $input, $match, null, $cursor)) { - $tokens[] = stripcslashes($match[1]); - } else { - // should never happen - throw new \InvalidArgumentException(sprintf('Unable to parse input near "... %s ..."', substr($input, $cursor, 10))); - } - - $cursor += strlen($match[0]); - } - - return $tokens; - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/LICENSE b/vendor/symfony/console/Symfony/Component/Console/LICENSE deleted file mode 100644 index 0b3292cf9..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2004-2014 Fabien Potencier - -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/vendor/symfony/console/Symfony/Component/Console/Logger/ConsoleLogger.php b/vendor/symfony/console/Symfony/Component/Console/Logger/ConsoleLogger.php deleted file mode 100644 index dbd2e8bd6..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Logger/ConsoleLogger.php +++ /dev/null @@ -1,116 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Logger; - -use Psr\Log\AbstractLogger; -use Psr\Log\InvalidArgumentException; -use Psr\Log\LogLevel; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Output\ConsoleOutputInterface; - -/** - * PSR-3 compliant console logger - * - * @author Kévin Dunglas - * @link http://www.php-fig.org/psr/psr-3/ - */ -class ConsoleLogger extends AbstractLogger -{ - const INFO = 'info'; - const ERROR = 'error'; - - /** - * @var OutputInterface - */ - private $output; - /** - * @var array - */ - private $verbosityLevelMap = array( - LogLevel::EMERGENCY => OutputInterface::VERBOSITY_NORMAL, - LogLevel::ALERT => OutputInterface::VERBOSITY_NORMAL, - LogLevel::CRITICAL => OutputInterface::VERBOSITY_NORMAL, - LogLevel::ERROR => OutputInterface::VERBOSITY_NORMAL, - LogLevel::WARNING => OutputInterface::VERBOSITY_NORMAL, - LogLevel::NOTICE => OutputInterface::VERBOSITY_VERBOSE, - LogLevel::INFO => OutputInterface::VERBOSITY_VERY_VERBOSE, - LogLevel::DEBUG => OutputInterface::VERBOSITY_DEBUG - ); - /** - * @var array - */ - private $formatLevelMap = array( - LogLevel::EMERGENCY => self::ERROR, - LogLevel::ALERT => self::ERROR, - LogLevel::CRITICAL => self::ERROR, - LogLevel::ERROR => self::ERROR, - LogLevel::WARNING => self::INFO, - LogLevel::NOTICE => self::INFO, - LogLevel::INFO => self::INFO, - LogLevel::DEBUG => self::INFO - ); - - /** - * @param OutputInterface $output - * @param array $verbosityLevelMap - * @param array $formatLevelMap - */ - public function __construct(OutputInterface $output, array $verbosityLevelMap = array(), array $formatLevelMap = array()) - { - $this->output = $output; - $this->verbosityLevelMap = $verbosityLevelMap + $this->verbosityLevelMap; - $this->formatLevelMap = $formatLevelMap + $this->formatLevelMap; - } - - /** - * {@inheritdoc} - */ - public function log($level, $message, array $context = array()) - { - if (!isset($this->verbosityLevelMap[$level])) { - throw new InvalidArgumentException(sprintf('The log level "%s" does not exist.', $level)); - } - - // Write to the error output if necessary and available - if ($this->formatLevelMap[$level] === self::ERROR && $this->output instanceof ConsoleOutputInterface) { - $output = $this->output->getErrorOutput(); - } else { - $output = $this->output; - } - - if ($output->getVerbosity() >= $this->verbosityLevelMap[$level]) { - $output->writeln(sprintf('<%1$s>[%2$s] %3$s', $this->formatLevelMap[$level], $level, $this->interpolate($message, $context))); - } - } - - /** - * Interpolates context values into the message placeholders - * - * @author PHP Framework Interoperability Group - * @param string $message - * @param array $context - * @return string - */ - private function interpolate($message, array $context) - { - // build a replacement array with braces around the context keys - $replace = array(); - foreach ($context as $key => $val) { - if (!is_array($val) && (!is_object($val) || method_exists($val, '__toString'))) { - $replace[sprintf('{%s}', $key)] = $val; - } - } - - // interpolate replacement values into the message and return - return strtr($message, $replace); - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Output/BufferedOutput.php b/vendor/symfony/console/Symfony/Component/Console/Output/BufferedOutput.php deleted file mode 100644 index 5682fc240..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Output/BufferedOutput.php +++ /dev/null @@ -1,48 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Output; - -/** - * @author Jean-François Simon - */ -class BufferedOutput extends Output -{ - /** - * @var string - */ - private $buffer = ''; - - /** - * Empties buffer and returns its content. - * - * @return string - */ - public function fetch() - { - $content = $this->buffer; - $this->buffer = ''; - - return $content; - } - - /** - * {@inheritdoc} - */ - protected function doWrite($message, $newline) - { - $this->buffer .= $message; - - if ($newline) { - $this->buffer .= "\n"; - } - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Output/ConsoleOutput.php b/vendor/symfony/console/Symfony/Component/Console/Output/ConsoleOutput.php deleted file mode 100644 index 3560f1c6f..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Output/ConsoleOutput.php +++ /dev/null @@ -1,113 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Output; - -use Symfony\Component\Console\Formatter\OutputFormatterInterface; - -/** - * ConsoleOutput is the default class for all CLI output. It uses STDOUT. - * - * This class is a convenient wrapper around `StreamOutput`. - * - * $output = new ConsoleOutput(); - * - * This is equivalent to: - * - * $output = new StreamOutput(fopen('php://stdout', 'w')); - * - * @author Fabien Potencier - * - * @api - */ -class ConsoleOutput extends StreamOutput implements ConsoleOutputInterface -{ - private $stderr; - - /** - * Constructor. - * - * @param int $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface) - * @param bool|null $decorated Whether to decorate messages (null for auto-guessing) - * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter) - * - * @api - */ - public function __construct($verbosity = self::VERBOSITY_NORMAL, $decorated = null, OutputFormatterInterface $formatter = null) - { - $outputStream = 'php://stdout'; - if (!$this->hasStdoutSupport()) { - $outputStream = 'php://output'; - } - - parent::__construct(fopen($outputStream, 'w'), $verbosity, $decorated, $formatter); - - $this->stderr = new StreamOutput(fopen('php://stderr', 'w'), $verbosity, $decorated, $this->getFormatter()); - } - - /** - * {@inheritdoc} - */ - public function setDecorated($decorated) - { - parent::setDecorated($decorated); - $this->stderr->setDecorated($decorated); - } - - /** - * {@inheritdoc} - */ - public function setFormatter(OutputFormatterInterface $formatter) - { - parent::setFormatter($formatter); - $this->stderr->setFormatter($formatter); - } - - /** - * {@inheritdoc} - */ - public function setVerbosity($level) - { - parent::setVerbosity($level); - $this->stderr->setVerbosity($level); - } - - /** - * {@inheritdoc} - */ - public function getErrorOutput() - { - return $this->stderr; - } - - /** - * {@inheritdoc} - */ - public function setErrorOutput(OutputInterface $error) - { - $this->stderr = $error; - } - - /** - * Returns true if current environment supports writing console output to - * STDOUT. - * - * IBM iSeries (OS400) exhibits character-encoding issues when writing to - * STDOUT and doesn't properly convert ASCII to EBCDIC, resulting in garbage - * output. - * - * @return bool - */ - protected function hasStdoutSupport() - { - return ('OS400' != php_uname('s')); - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Output/ConsoleOutputInterface.php b/vendor/symfony/console/Symfony/Component/Console/Output/ConsoleOutputInterface.php deleted file mode 100644 index 5eb4fc7ac..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Output/ConsoleOutputInterface.php +++ /dev/null @@ -1,35 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Output; - -/** - * ConsoleOutputInterface is the interface implemented by ConsoleOutput class. - * This adds information about stderr output stream. - * - * @author Dariusz Górecki - */ -interface ConsoleOutputInterface extends OutputInterface -{ - /** - * Gets the OutputInterface for errors. - * - * @return OutputInterface - */ - public function getErrorOutput(); - - /** - * Sets the OutputInterface used for errors. - * - * @param OutputInterface $error - */ - public function setErrorOutput(OutputInterface $error); -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Output/NullOutput.php b/vendor/symfony/console/Symfony/Component/Console/Output/NullOutput.php deleted file mode 100644 index afcb63195..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Output/NullOutput.php +++ /dev/null @@ -1,113 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Output; - -use Symfony\Component\Console\Formatter\OutputFormatter; -use Symfony\Component\Console\Formatter\OutputFormatterInterface; - -/** - * NullOutput suppresses all output. - * - * $output = new NullOutput(); - * - * @author Fabien Potencier - * @author Tobias Schultze - * - * @api - */ -class NullOutput implements OutputInterface -{ - /** - * {@inheritdoc} - */ - public function setFormatter(OutputFormatterInterface $formatter) - { - // do nothing - } - - /** - * {@inheritdoc} - */ - public function getFormatter() - { - // to comply with the interface we must return a OutputFormatterInterface - return new OutputFormatter(); - } - - /** - * {@inheritdoc} - */ - public function setDecorated($decorated) - { - // do nothing - } - - /** - * {@inheritdoc} - */ - public function isDecorated() - { - return false; - } - - /** - * {@inheritdoc} - */ - public function setVerbosity($level) - { - // do nothing - } - - /** - * {@inheritdoc} - */ - public function getVerbosity() - { - return self::VERBOSITY_QUIET; - } - - public function isQuiet() - { - return true; - } - - public function isVerbose() - { - return false; - } - - public function isVeryVerbose() - { - return false; - } - - public function isDebug() - { - return false; - } - - /** - * {@inheritdoc} - */ - public function writeln($messages, $type = self::OUTPUT_NORMAL) - { - // do nothing - } - - /** - * {@inheritdoc} - */ - public function write($messages, $newline = false, $type = self::OUTPUT_NORMAL) - { - // do nothing - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Output/Output.php b/vendor/symfony/console/Symfony/Component/Console/Output/Output.php deleted file mode 100644 index 22c81cdc3..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Output/Output.php +++ /dev/null @@ -1,165 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Output; - -use Symfony\Component\Console\Formatter\OutputFormatterInterface; -use Symfony\Component\Console\Formatter\OutputFormatter; - -/** - * Base class for output classes. - * - * There are five levels of verbosity: - * - * * normal: no option passed (normal output) - * * verbose: -v (more output) - * * very verbose: -vv (highly extended output) - * * debug: -vvv (all debug output) - * * quiet: -q (no output) - * - * @author Fabien Potencier - * - * @api - */ -abstract class Output implements OutputInterface -{ - private $verbosity; - private $formatter; - - /** - * Constructor. - * - * @param int $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface) - * @param bool $decorated Whether to decorate messages - * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter) - * - * @api - */ - public function __construct($verbosity = self::VERBOSITY_NORMAL, $decorated = false, OutputFormatterInterface $formatter = null) - { - $this->verbosity = null === $verbosity ? self::VERBOSITY_NORMAL : $verbosity; - $this->formatter = $formatter ?: new OutputFormatter(); - $this->formatter->setDecorated($decorated); - } - - /** - * {@inheritdoc} - */ - public function setFormatter(OutputFormatterInterface $formatter) - { - $this->formatter = $formatter; - } - - /** - * {@inheritdoc} - */ - public function getFormatter() - { - return $this->formatter; - } - - /** - * {@inheritdoc} - */ - public function setDecorated($decorated) - { - $this->formatter->setDecorated($decorated); - } - - /** - * {@inheritdoc} - */ - public function isDecorated() - { - return $this->formatter->isDecorated(); - } - - /** - * {@inheritdoc} - */ - public function setVerbosity($level) - { - $this->verbosity = (int) $level; - } - - /** - * {@inheritdoc} - */ - public function getVerbosity() - { - return $this->verbosity; - } - - public function isQuiet() - { - return self::VERBOSITY_QUIET === $this->verbosity; - } - - public function isVerbose() - { - return self::VERBOSITY_VERBOSE <= $this->verbosity; - } - - public function isVeryVerbose() - { - return self::VERBOSITY_VERY_VERBOSE <= $this->verbosity; - } - - public function isDebug() - { - return self::VERBOSITY_DEBUG <= $this->verbosity; - } - - /** - * {@inheritdoc} - */ - public function writeln($messages, $type = self::OUTPUT_NORMAL) - { - $this->write($messages, true, $type); - } - - /** - * {@inheritdoc} - */ - public function write($messages, $newline = false, $type = self::OUTPUT_NORMAL) - { - if (self::VERBOSITY_QUIET === $this->verbosity) { - return; - } - - $messages = (array) $messages; - - foreach ($messages as $message) { - switch ($type) { - case OutputInterface::OUTPUT_NORMAL: - $message = $this->formatter->format($message); - break; - case OutputInterface::OUTPUT_RAW: - break; - case OutputInterface::OUTPUT_PLAIN: - $message = strip_tags($this->formatter->format($message)); - break; - default: - throw new \InvalidArgumentException(sprintf('Unknown output type given (%s)', $type)); - } - - $this->doWrite($message, $newline); - } - } - - /** - * Writes a message to the output. - * - * @param string $message A message to write to the output - * @param bool $newline Whether to add a newline or not - */ - abstract protected function doWrite($message, $newline); -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Output/OutputInterface.php b/vendor/symfony/console/Symfony/Component/Console/Output/OutputInterface.php deleted file mode 100644 index ad128c68c..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Output/OutputInterface.php +++ /dev/null @@ -1,113 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Output; - -use Symfony\Component\Console\Formatter\OutputFormatterInterface; - -/** - * OutputInterface is the interface implemented by all Output classes. - * - * @author Fabien Potencier - * - * @api - */ -interface OutputInterface -{ - const VERBOSITY_QUIET = 0; - const VERBOSITY_NORMAL = 1; - const VERBOSITY_VERBOSE = 2; - const VERBOSITY_VERY_VERBOSE = 3; - const VERBOSITY_DEBUG = 4; - - const OUTPUT_NORMAL = 0; - const OUTPUT_RAW = 1; - const OUTPUT_PLAIN = 2; - - /** - * Writes a message to the output. - * - * @param string|array $messages The message as an array of lines or a single string - * @param bool $newline Whether to add a newline - * @param int $type The type of output (one of the OUTPUT constants) - * - * @throws \InvalidArgumentException When unknown output type is given - * - * @api - */ - public function write($messages, $newline = false, $type = self::OUTPUT_NORMAL); - - /** - * Writes a message to the output and adds a newline at the end. - * - * @param string|array $messages The message as an array of lines of a single string - * @param int $type The type of output (one of the OUTPUT constants) - * - * @throws \InvalidArgumentException When unknown output type is given - * - * @api - */ - public function writeln($messages, $type = self::OUTPUT_NORMAL); - - /** - * Sets the verbosity of the output. - * - * @param int $level The level of verbosity (one of the VERBOSITY constants) - * - * @api - */ - public function setVerbosity($level); - - /** - * Gets the current verbosity of the output. - * - * @return int The current level of verbosity (one of the VERBOSITY constants) - * - * @api - */ - public function getVerbosity(); - - /** - * Sets the decorated flag. - * - * @param bool $decorated Whether to decorate the messages - * - * @api - */ - public function setDecorated($decorated); - - /** - * Gets the decorated flag. - * - * @return bool true if the output will decorate messages, false otherwise - * - * @api - */ - public function isDecorated(); - - /** - * Sets output formatter. - * - * @param OutputFormatterInterface $formatter - * - * @api - */ - public function setFormatter(OutputFormatterInterface $formatter); - - /** - * Returns current output formatter instance. - * - * @return OutputFormatterInterface - * - * @api - */ - public function getFormatter(); -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Output/StreamOutput.php b/vendor/symfony/console/Symfony/Component/Console/Output/StreamOutput.php deleted file mode 100644 index 23d49d2d0..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Output/StreamOutput.php +++ /dev/null @@ -1,103 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Output; - -use Symfony\Component\Console\Formatter\OutputFormatterInterface; - -/** - * StreamOutput writes the output to a given stream. - * - * Usage: - * - * $output = new StreamOutput(fopen('php://stdout', 'w')); - * - * As `StreamOutput` can use any stream, you can also use a file: - * - * $output = new StreamOutput(fopen('/path/to/output.log', 'a', false)); - * - * @author Fabien Potencier - * - * @api - */ -class StreamOutput extends Output -{ - private $stream; - - /** - * Constructor. - * - * @param mixed $stream A stream resource - * @param int $verbosity The verbosity level (one of the VERBOSITY constants in OutputInterface) - * @param bool|null $decorated Whether to decorate messages (null for auto-guessing) - * @param OutputFormatterInterface|null $formatter Output formatter instance (null to use default OutputFormatter) - * - * @throws \InvalidArgumentException When first argument is not a real stream - * - * @api - */ - public function __construct($stream, $verbosity = self::VERBOSITY_NORMAL, $decorated = null, OutputFormatterInterface $formatter = null) - { - if (!is_resource($stream) || 'stream' !== get_resource_type($stream)) { - throw new \InvalidArgumentException('The StreamOutput class needs a stream as its first argument.'); - } - - $this->stream = $stream; - - if (null === $decorated) { - $decorated = $this->hasColorSupport(); - } - - parent::__construct($verbosity, $decorated, $formatter); - } - - /** - * Gets the stream attached to this StreamOutput instance. - * - * @return resource A stream resource - */ - public function getStream() - { - return $this->stream; - } - - /** - * {@inheritdoc} - */ - protected function doWrite($message, $newline) - { - if (false === @fwrite($this->stream, $message.($newline ? PHP_EOL : ''))) { - // should never happen - throw new \RuntimeException('Unable to write output.'); - } - - fflush($this->stream); - } - - /** - * Returns true if the stream supports colorization. - * - * Colorization is disabled if not supported by the stream: - * - * - Windows without Ansicon and ConEmu - * - non tty consoles - * - * @return bool true if the stream supports colorization, false otherwise - */ - protected function hasColorSupport() - { - if (DIRECTORY_SEPARATOR == '\\') { - return false !== getenv('ANSICON') || 'ON' === getenv('ConEmuANSI'); - } - - return function_exists('posix_isatty') && @posix_isatty($this->stream); - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Question/ChoiceQuestion.php b/vendor/symfony/console/Symfony/Component/Console/Question/ChoiceQuestion.php deleted file mode 100644 index 59808e125..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Question/ChoiceQuestion.php +++ /dev/null @@ -1,138 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Question; - -/** - * Represents a choice question. - * - * @author Fabien Potencier - */ -class ChoiceQuestion extends Question -{ - private $choices; - private $multiselect = false; - private $prompt = ' > '; - private $errorMessage = 'Value "%s" is invalid'; - - public function __construct($question, array $choices, $default = null) - { - parent::__construct($question, $default); - - $this->choices = $choices; - $this->setValidator($this->getDefaultValidator()); - $this->setAutocompleterValues(array_keys($choices)); - } - - /** - * Returns available choices. - * - * @return array - */ - public function getChoices() - { - return $this->choices; - } - - /** - * Sets multiselect option. - * - * When multiselect is set to true, multiple choices can be answered. - * - * @param bool $multiselect - * - * @return ChoiceQuestion The current instance - */ - public function setMultiselect($multiselect) - { - $this->multiselect = $multiselect; - $this->setValidator($this->getDefaultValidator()); - - return $this; - } - - /** - * Gets the prompt for choices. - * - * @return string - */ - public function getPrompt() - { - return $this->prompt; - } - - /** - * Sets the prompt for choices. - * - * @param string $prompt - * - * @return ChoiceQuestion The current instance - */ - public function setPrompt($prompt) - { - $this->prompt = $prompt; - - return $this; - } - - /** - * Sets the error message for invalid values. - * - * The error message has a string placeholder (%s) for the invalid value. - * - * @param string $errorMessage - * - * @return ChoiceQuestion The current instance - */ - public function setErrorMessage($errorMessage) - { - $this->errorMessage = $errorMessage; - $this->setValidator($this->getDefaultValidator()); - - return $this; - } - - private function getDefaultValidator() - { - $choices = $this->choices; - $errorMessage = $this->errorMessage; - $multiselect = $this->multiselect; - - return function ($selected) use ($choices, $errorMessage, $multiselect) { - // Collapse all spaces. - $selectedChoices = str_replace(' ', '', $selected); - - if ($multiselect) { - // Check for a separated comma values - if (!preg_match('/^[a-zA-Z0-9_-]+(?:,[a-zA-Z0-9_-]+)*$/', $selectedChoices, $matches)) { - throw new \InvalidArgumentException(sprintf($errorMessage, $selected)); - } - $selectedChoices = explode(',', $selectedChoices); - } else { - $selectedChoices = array($selected); - } - - $multiselectChoices = array(); - foreach ($selectedChoices as $value) { - if (empty($choices[$value])) { - throw new \InvalidArgumentException(sprintf($errorMessage, $value)); - } - array_push($multiselectChoices, $choices[$value]); - } - - if ($multiselect) { - return $multiselectChoices; - } - - return $choices[$selected]; - }; - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Question/ConfirmationQuestion.php b/vendor/symfony/console/Symfony/Component/Console/Question/ConfirmationQuestion.php deleted file mode 100644 index 0438640fa..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Question/ConfirmationQuestion.php +++ /dev/null @@ -1,44 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Question; - -/** - * Represents a yes/no question. - * - * @author Fabien Potencier - */ -class ConfirmationQuestion extends Question -{ - public function __construct($question, $default = true) - { - parent::__construct($question, (bool) $default); - - $this->setNormalizer($this->getDefaultNormalizer()); - } - - private function getDefaultNormalizer() - { - $default = $this->getDefault(); - - return function ($answer) use ($default) { - if (is_bool($answer)) { - return $answer; - } - - if (false === $default) { - return $answer && 'y' === strtolower($answer[0]); - } - - return !$answer || 'y' === strtolower($answer[0]); - }; - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Question/Question.php b/vendor/symfony/console/Symfony/Component/Console/Question/Question.php deleted file mode 100644 index 3003f19c5..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Question/Question.php +++ /dev/null @@ -1,238 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Question; - -/** - * Represents a Question. - * - * @author Fabien Potencier - */ -class Question -{ - private $question; - private $attempts; - private $hidden = false; - private $hiddenFallback = true; - private $autocompleterValues; - private $validator; - private $default; - private $normalizer; - - /** - * Constructor. - * - * @param string $question The question to ask to the user - * @param mixed $default The default answer to return if the user enters nothing - */ - public function __construct($question, $default = null) - { - $this->question = $question; - $this->default = $default; - } - - /** - * Returns the question. - * - * @return string - */ - public function getQuestion() - { - return $this->question; - } - - /** - * Returns the default answer. - * - * @return mixed - */ - public function getDefault() - { - return $this->default; - } - - /** - * Returns whether the user response must be hidden. - * - * @return bool - */ - public function isHidden() - { - return $this->hidden; - } - - /** - * Sets whether the user response must be hidden or not. - * - * @param bool $hidden - * - * @return Question The current instance - * - * @throws \LogicException In case the autocompleter is also used - */ - public function setHidden($hidden) - { - if ($this->autocompleterValues) { - throw new \LogicException('A hidden question cannot use the autocompleter.'); - } - - $this->hidden = (bool) $hidden; - - return $this; - } - - /** - * In case the response can not be hidden, whether to fallback on non-hidden question or not. - * - * @return bool - */ - public function isHiddenFallback() - { - return $this->hiddenFallback; - } - - /** - * Sets whether to fallback on non-hidden question if the response can not be hidden. - * - * @param bool $fallback - * - * @return Question The current instance - */ - public function setHiddenFallback($fallback) - { - $this->hiddenFallback = (bool) $fallback; - - return $this; - } - - /** - * Gets values for the autocompleter. - * - * @return null|array|Traversable - */ - public function getAutocompleterValues() - { - return $this->autocompleterValues; - } - - /** - * Sets values for the autocompleter. - * - * @param null|array|Traversable $values - * - * @return Question The current instance - * - * @throws \InvalidArgumentException - * @throws \LogicException - */ - public function setAutocompleterValues($values) - { - if (null !== $values && !is_array($values)) { - if (!$values instanceof \Traversable || $values instanceof \Countable) { - throw new \InvalidArgumentException('Autocompleter values can be either an array, `null` or an object implementing both `Countable` and `Traversable` interfaces.'); - } - } - - if ($this->hidden) { - throw new \LogicException('A hidden question cannot use the autocompleter.'); - } - - $this->autocompleterValues = $values; - - return $this; - } - - /** - * Sets a validator for the question. - * - * @param null|callable $validator - * - * @return Question The current instance - */ - public function setValidator($validator) - { - $this->validator = $validator; - - return $this; - } - - /** - * Gets the validator for the question - * - * @return null|callable - */ - public function getValidator() - { - return $this->validator; - } - - /** - * Sets the maximum number of attempts. - * - * Null means an unlimited number of attempts. - * - * @param null|int $attempts - * - * @return Question The current instance - * - * @throws \InvalidArgumentException In case the number of attempts is invalid. - */ - public function setMaxAttempts($attempts) - { - if (null !== $attempts && $attempts < 1) { - throw new \InvalidArgumentException('Maximum number of attempts must be a positive value.'); - } - - $this->attempts = $attempts; - - return $this; - } - - /** - * Gets the maximum number of attempts. - * - * Null means an unlimited number of attempts. - * - * @return null|int - */ - public function getMaxAttempts() - { - return $this->attempts; - } - - /** - * Sets a normalizer for the response. - * - * The normalizer can ba a callable (a string), a closure or a class implementing __invoke. - * - * @param string|Closure $normalizer - * - * @return Question The current instance - */ - public function setNormalizer($normalizer) - { - $this->normalizer = $normalizer; - - return $this; - } - - /** - * Gets the normalizer for the response. - * - * The normalizer can ba a callable (a string), a closure or a class implementing __invoke. - * - * @return string|Closure - */ - public function getNormalizer() - { - return $this->normalizer; - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/README.md b/vendor/symfony/console/Symfony/Component/Console/README.md deleted file mode 100644 index bfc704427..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/README.md +++ /dev/null @@ -1,63 +0,0 @@ -Console Component -================= - -Console eases the creation of beautiful and testable command line interfaces. - -The Application object manages the CLI application: - - use Symfony\Component\Console\Application; - - $console = new Application(); - $console->run(); - -The ``run()`` method parses the arguments and options passed on the command -line and executes the right command. - -Registering a new command can easily be done via the ``register()`` method, -which returns a ``Command`` instance: - - use Symfony\Component\Console\Input\InputInterface; - use Symfony\Component\Console\Input\InputArgument; - use Symfony\Component\Console\Input\InputOption; - use Symfony\Component\Console\Output\OutputInterface; - - $console - ->register('ls') - ->setDefinition(array( - new InputArgument('dir', InputArgument::REQUIRED, 'Directory name'), - )) - ->setDescription('Displays the files in the given directory') - ->setCode(function (InputInterface $input, OutputInterface $output) { - $dir = $input->getArgument('dir'); - - $output->writeln(sprintf('Dir listing for %s', $dir)); - }) - ; - -You can also register new commands via classes. - -The component provides a lot of features like output coloring, input and -output abstractions (so that you can easily unit-test your commands), -validation, automatic help messages, ... - -Tests ------ - -You can run the unit tests with the following command: - - $ cd path/to/Symfony/Component/Console/ - $ composer.phar install - $ phpunit - -Third Party ------------ - -`Resources/bin/hiddeninput.exe` is a third party binary provided within this -component. Find sources and license at https://github.com/Seldaek/hidden-input. - -Resources ---------- - -[The Console Component](http://symfony.com/doc/current/components/console.html) - -[How to create a Console Command](http://symfony.com/doc/current/cookbook/console/console_command.html) diff --git a/vendor/symfony/console/Symfony/Component/Console/Resources/bin/hiddeninput.exe b/vendor/symfony/console/Symfony/Component/Console/Resources/bin/hiddeninput.exe deleted file mode 100644 index c8cf65e8d819e6e525121cf6b21f1c2429746038..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9216 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 J0sQ~1{4brj`U(I5 diff --git a/vendor/symfony/console/Symfony/Component/Console/Shell.php b/vendor/symfony/console/Symfony/Component/Console/Shell.php deleted file mode 100644 index 75a11743a..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Shell.php +++ /dev/null @@ -1,228 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console; - -use Symfony\Component\Console\Input\StringInput; -use Symfony\Component\Console\Output\ConsoleOutput; -use Symfony\Component\Process\ProcessBuilder; -use Symfony\Component\Process\PhpExecutableFinder; - -/** - * A Shell wraps an Application to add shell capabilities to it. - * - * Support for history and completion only works with a PHP compiled - * with readline support (either --with-readline or --with-libedit) - * - * @author Fabien Potencier - * @author Martin Hasoň - */ -class Shell -{ - private $application; - private $history; - private $output; - private $hasReadline; - private $processIsolation = false; - - /** - * Constructor. - * - * If there is no readline support for the current PHP executable - * a \RuntimeException exception is thrown. - * - * @param Application $application An application instance - */ - public function __construct(Application $application) - { - $this->hasReadline = function_exists('readline'); - $this->application = $application; - $this->history = getenv('HOME').'/.history_'.$application->getName(); - $this->output = new ConsoleOutput(); - } - - /** - * Runs the shell. - */ - public function run() - { - $this->application->setAutoExit(false); - $this->application->setCatchExceptions(true); - - if ($this->hasReadline) { - readline_read_history($this->history); - readline_completion_function(array($this, 'autocompleter')); - } - - $this->output->writeln($this->getHeader()); - $php = null; - if ($this->processIsolation) { - $finder = new PhpExecutableFinder(); - $php = $finder->find(); - $this->output->writeln(<<Running with process isolation, you should consider this: - * each command is executed as separate process, - * commands don't support interactivity, all params must be passed explicitly, - * commands output is not colorized. - -EOF - ); - } - - while (true) { - $command = $this->readline(); - - if (false === $command) { - $this->output->writeln("\n"); - - break; - } - - if ($this->hasReadline) { - readline_add_history($command); - readline_write_history($this->history); - } - - if ($this->processIsolation) { - $pb = new ProcessBuilder(); - - $process = $pb - ->add($php) - ->add($_SERVER['argv'][0]) - ->add($command) - ->inheritEnvironmentVariables(true) - ->getProcess() - ; - - $output = $this->output; - $process->run(function ($type, $data) use ($output) { - $output->writeln($data); - }); - - $ret = $process->getExitCode(); - } else { - $ret = $this->application->run(new StringInput($command), $this->output); - } - - if (0 !== $ret) { - $this->output->writeln(sprintf('The command terminated with an error status (%s)', $ret)); - } - } - } - - /** - * Returns the shell header. - * - * @return string The header string - */ - protected function getHeader() - { - return <<{$this->application->getName()} shell ({$this->application->getVersion()}). - -At the prompt, type help for some help, -or list to get a list of available commands. - -To exit the shell, type ^D. - -EOF; - } - - /** - * Renders a prompt. - * - * @return string The prompt - */ - protected function getPrompt() - { - // using the formatter here is required when using readline - return $this->output->getFormatter()->format($this->application->getName().' > '); - } - - protected function getOutput() - { - return $this->output; - } - - protected function getApplication() - { - return $this->application; - } - - /** - * Tries to return autocompletion for the current entered text. - * - * @param string $text The last segment of the entered text - * - * @return bool|array A list of guessed strings or true - */ - private function autocompleter($text) - { - $info = readline_info(); - $text = substr($info['line_buffer'], 0, $info['end']); - - if ($info['point'] !== $info['end']) { - return true; - } - - // task name? - if (false === strpos($text, ' ') || !$text) { - return array_keys($this->application->all()); - } - - // options and arguments? - try { - $command = $this->application->find(substr($text, 0, strpos($text, ' '))); - } catch (\Exception $e) { - return true; - } - - $list = array('--help'); - foreach ($command->getDefinition()->getOptions() as $option) { - $list[] = '--'.$option->getName(); - } - - return $list; - } - - /** - * Reads a single line from standard input. - * - * @return string The single line from standard input - */ - private function readline() - { - if ($this->hasReadline) { - $line = readline($this->getPrompt()); - } else { - $this->output->write($this->getPrompt()); - $line = fgets(STDIN, 1024); - $line = (!$line && strlen($line) == 0) ? false : rtrim($line); - } - - return $line; - } - - public function getProcessIsolation() - { - return $this->processIsolation; - } - - public function setProcessIsolation($processIsolation) - { - $this->processIsolation = (bool) $processIsolation; - - if ($this->processIsolation && !class_exists('Symfony\\Component\\Process\\Process')) { - throw new \RuntimeException('Unable to isolate processes as the Symfony Process Component is not installed.'); - } - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Tester/ApplicationTester.php b/vendor/symfony/console/Symfony/Component/Console/Tester/ApplicationTester.php deleted file mode 100644 index 1630a9740..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Tester/ApplicationTester.php +++ /dev/null @@ -1,128 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Tester; - -use Symfony\Component\Console\Application; -use Symfony\Component\Console\Input\ArrayInput; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\Console\Output\StreamOutput; - -/** - * Eases the testing of console applications. - * - * When testing an application, don't forget to disable the auto exit flag: - * - * $application = new Application(); - * $application->setAutoExit(false); - * - * @author Fabien Potencier - */ -class ApplicationTester -{ - private $application; - private $input; - private $output; - private $statusCode; - - /** - * Constructor. - * - * @param Application $application An Application instance to test. - */ - public function __construct(Application $application) - { - $this->application = $application; - } - - /** - * Executes the application. - * - * Available options: - * - * * interactive: Sets the input interactive flag - * * decorated: Sets the output decorated flag - * * verbosity: Sets the output verbosity flag - * - * @param array $input An array of arguments and options - * @param array $options An array of options - * - * @return int The command exit code - */ - public function run(array $input, $options = array()) - { - $this->input = new ArrayInput($input); - if (isset($options['interactive'])) { - $this->input->setInteractive($options['interactive']); - } - - $this->output = new StreamOutput(fopen('php://memory', 'w', false)); - if (isset($options['decorated'])) { - $this->output->setDecorated($options['decorated']); - } - if (isset($options['verbosity'])) { - $this->output->setVerbosity($options['verbosity']); - } - - return $this->statusCode = $this->application->run($this->input, $this->output); - } - - /** - * Gets the display returned by the last execution of the application. - * - * @param bool $normalize Whether to normalize end of lines to \n or not - * - * @return string The display - */ - public function getDisplay($normalize = false) - { - rewind($this->output->getStream()); - - $display = stream_get_contents($this->output->getStream()); - - if ($normalize) { - $display = str_replace(PHP_EOL, "\n", $display); - } - - return $display; - } - - /** - * Gets the input instance used by the last execution of the application. - * - * @return InputInterface The current input instance - */ - public function getInput() - { - return $this->input; - } - - /** - * Gets the output instance used by the last execution of the application. - * - * @return OutputInterface The current output instance - */ - public function getOutput() - { - return $this->output; - } - - /** - * Gets the status code returned by the last execution of the application. - * - * @return int The status code - */ - public function getStatusCode() - { - return $this->statusCode; - } -} diff --git a/vendor/symfony/console/Symfony/Component/Console/Tester/CommandTester.php b/vendor/symfony/console/Symfony/Component/Console/Tester/CommandTester.php deleted file mode 100644 index fe94d1ebb..000000000 --- a/vendor/symfony/console/Symfony/Component/Console/Tester/CommandTester.php +++ /dev/null @@ -1,132 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Console\Tester; - -use Symfony\Component\Console\Command\Command; -use Symfony\Component\Console\Input\ArrayInput; -use Symfony\Component\Console\Output\StreamOutput; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Output\OutputInterface; - -/** - * Eases the testing of console commands. - * - * @author Fabien Potencier - */ -class CommandTester -{ - private $command; - private $input; - private $output; - private $statusCode; - - /** - * Constructor. - * - * @param Command $command A Command instance to test. - */ - public function __construct(Command $command) - { - $this->command = $command; - } - - /** - * Executes the command. - * - * Available options: - * - * * interactive: Sets the input interactive flag - * * decorated: Sets the output decorated flag - * * verbosity: Sets the output verbosity flag - * - * @param array $input An array of arguments and options - * @param array $options An array of options - * - * @return int The command exit code - */ - public function execute(array $input, array $options = array()) - { - // set the command name automatically if the application requires - // this argument and no command name was passed - if (!isset($input['command']) - && (null !== $application = $this->command->getApplication()) - && $application->getDefinition()->hasArgument('command') - ) { - $input['command'] = $this->command->getName(); - } - - $this->input = new ArrayInput($input); - if (isset($options['interactive'])) { - $this->input->setInteractive($options['interactive']); - } - - $this->output = new StreamOutput(fopen('php://memory', 'w', false)); - if (isset($options['decorated'])) { - $this->output->setDecorated($options['decorated']); - } - if (isset($options['verbosity'])) { - $this->output->setVerbosity($options['verbosity']); - } - - return $this->statusCode = $this->command->run($this->input, $this->output); - } - - /** - * Gets the display returned by the last execution of the command. - * - * @param bool $normalize Whether to normalize end of lines to \n or not - * - * @return string The display - */ - public function getDisplay($normalize = false) - { - rewind($this->output->getStream()); - - $display = stream_get_contents($this->output->getStream()); - - if ($normalize) { - $display = str_replace(PHP_EOL, "\n", $display); - } - - return $display; - } - - /** - * Gets the input instance used by the last execution of the command. - * - * @return InputInterface The current input instance - */ - public function getInput() - { - return $this->input; - } - - /** - * Gets the output instance used by the last execution of the command. - * - * @return OutputInterface The current output instance - */ - public function getOutput() - { - return $this->output; - } - - /** - * Gets the status code returned by the last execution of the application. - * - * @return int The status code - */ - public function getStatusCode() - { - return $this->statusCode; - } -} diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/CHANGELOG.md b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/CHANGELOG.md deleted file mode 100644 index bb42ee19c..000000000 --- a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/CHANGELOG.md +++ /dev/null @@ -1,23 +0,0 @@ -CHANGELOG -========= - -2.5.0 ------ - - * added Debug\TraceableEventDispatcher (originally in HttpKernel) - * changed Debug\TraceableEventDispatcherInterface to extend EventDispatcherInterface - * added RegisterListenersPass (originally in HttpKernel) - -2.1.0 ------ - - * added TraceableEventDispatcherInterface - * added ContainerAwareEventDispatcher - * added a reference to the EventDispatcher on the Event - * added a reference to the Event name on the event - * added fluid interface to the dispatch() method which now returns the Event - object - * added GenericEvent event class - * added the possibility for subscribers to subscribe several times for the - same event - * added ImmutableEventDispatcher diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/ContainerAwareEventDispatcher.php b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/ContainerAwareEventDispatcher.php deleted file mode 100644 index e97d427ea..000000000 --- a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/ContainerAwareEventDispatcher.php +++ /dev/null @@ -1,202 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\EventDispatcher; - -use Symfony\Component\DependencyInjection\ContainerInterface; - -/** - * Lazily loads listeners and subscribers from the dependency injection - * container - * - * @author Fabien Potencier - * @author Bernhard Schussek - * @author Jordan Alliot - */ -class ContainerAwareEventDispatcher extends EventDispatcher -{ - /** - * The container from where services are loaded - * @var ContainerInterface - */ - private $container; - - /** - * The service IDs of the event listeners and subscribers - * @var array - */ - private $listenerIds = array(); - - /** - * The services registered as listeners - * @var array - */ - private $listeners = array(); - - /** - * Constructor. - * - * @param ContainerInterface $container A ContainerInterface instance - */ - public function __construct(ContainerInterface $container) - { - $this->container = $container; - } - - /** - * Adds a service as event listener - * - * @param string $eventName Event for which the listener is added - * @param array $callback The service ID of the listener service & the method - * name that has to be called - * @param int $priority The higher this value, the earlier an event listener - * will be triggered in the chain. - * Defaults to 0. - * - * @throws \InvalidArgumentException - */ - public function addListenerService($eventName, $callback, $priority = 0) - { - if (!is_array($callback) || 2 !== count($callback)) { - throw new \InvalidArgumentException('Expected an array("service", "method") argument'); - } - - $this->listenerIds[$eventName][] = array($callback[0], $callback[1], $priority); - } - - public function removeListener($eventName, $listener) - { - $this->lazyLoad($eventName); - - if (isset($this->listeners[$eventName])) { - foreach ($this->listeners[$eventName] as $key => $l) { - foreach ($this->listenerIds[$eventName] as $i => $args) { - list($serviceId, $method, $priority) = $args; - if ($key === $serviceId.'.'.$method) { - if ($listener === array($l, $method)) { - unset($this->listeners[$eventName][$key]); - if (empty($this->listeners[$eventName])) { - unset($this->listeners[$eventName]); - } - unset($this->listenerIds[$eventName][$i]); - if (empty($this->listenerIds[$eventName])) { - unset($this->listenerIds[$eventName]); - } - } - } - } - } - } - - parent::removeListener($eventName, $listener); - } - - /** - * @see EventDispatcherInterface::hasListeners - */ - public function hasListeners($eventName = null) - { - if (null === $eventName) { - return (bool) count($this->listenerIds) || (bool) count($this->listeners); - } - - if (isset($this->listenerIds[$eventName])) { - return true; - } - - return parent::hasListeners($eventName); - } - - /** - * @see EventDispatcherInterface::getListeners - */ - public function getListeners($eventName = null) - { - if (null === $eventName) { - foreach (array_keys($this->listenerIds) as $serviceEventName) { - $this->lazyLoad($serviceEventName); - } - } else { - $this->lazyLoad($eventName); - } - - return parent::getListeners($eventName); - } - - /** - * Adds a service as event subscriber - * - * @param string $serviceId The service ID of the subscriber service - * @param string $class The service's class name (which must implement EventSubscriberInterface) - */ - public function addSubscriberService($serviceId, $class) - { - foreach ($class::getSubscribedEvents() as $eventName => $params) { - if (is_string($params)) { - $this->listenerIds[$eventName][] = array($serviceId, $params, 0); - } elseif (is_string($params[0])) { - $this->listenerIds[$eventName][] = array($serviceId, $params[0], isset($params[1]) ? $params[1] : 0); - } else { - foreach ($params as $listener) { - $this->listenerIds[$eventName][] = array($serviceId, $listener[0], isset($listener[1]) ? $listener[1] : 0); - } - } - } - } - - /** - * {@inheritdoc} - * - * Lazily loads listeners for this event from the dependency injection - * container. - * - * @throws \InvalidArgumentException if the service is not defined - */ - public function dispatch($eventName, Event $event = null) - { - $this->lazyLoad($eventName); - - return parent::dispatch($eventName, $event); - } - - public function getContainer() - { - return $this->container; - } - - /** - * Lazily loads listeners for this event from the dependency injection - * container. - * - * @param string $eventName The name of the event to dispatch. The name of - * the event is the name of the method that is - * invoked on listeners. - */ - protected function lazyLoad($eventName) - { - if (isset($this->listenerIds[$eventName])) { - foreach ($this->listenerIds[$eventName] as $args) { - list($serviceId, $method, $priority) = $args; - $listener = $this->container->get($serviceId); - - $key = $serviceId.'.'.$method; - if (!isset($this->listeners[$eventName][$key])) { - $this->addListener($eventName, array($listener, $method), $priority); - } elseif ($listener !== $this->listeners[$eventName][$key]) { - parent::removeListener($eventName, array($this->listeners[$eventName][$key], $method)); - $this->addListener($eventName, array($listener, $method), $priority); - } - - $this->listeners[$eventName][$key] = $listener; - } - } - } -} diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcher.php b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcher.php deleted file mode 100644 index 410226bb3..000000000 --- a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcher.php +++ /dev/null @@ -1,317 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\EventDispatcher\Debug; - -use Symfony\Component\EventDispatcher\EventDispatcherInterface; -use Symfony\Component\EventDispatcher\EventSubscriberInterface; -use Symfony\Component\EventDispatcher\Event; -use Symfony\Component\Stopwatch\Stopwatch; -use Psr\Log\LoggerInterface; - -/** - * Collects some data about event listeners. - * - * This event dispatcher delegates the dispatching to another one. - * - * @author Fabien Potencier - */ -class TraceableEventDispatcher implements TraceableEventDispatcherInterface -{ - protected $logger; - protected $stopwatch; - - private $called; - private $dispatcher; - - /** - * Constructor. - * - * @param EventDispatcherInterface $dispatcher An EventDispatcherInterface instance - * @param Stopwatch $stopwatch A Stopwatch instance - * @param LoggerInterface $logger A LoggerInterface instance - */ - public function __construct(EventDispatcherInterface $dispatcher, Stopwatch $stopwatch, LoggerInterface $logger = null) - { - $this->dispatcher = $dispatcher; - $this->stopwatch = $stopwatch; - $this->logger = $logger; - $this->called = array(); - } - - /** - * {@inheritdoc} - */ - public function addListener($eventName, $listener, $priority = 0) - { - $this->dispatcher->addListener($eventName, $listener, $priority); - } - - /** - * {@inheritdoc} - */ - public function addSubscriber(EventSubscriberInterface $subscriber) - { - $this->dispatcher->addSubscriber($subscriber); - } - - /** - * {@inheritdoc} - */ - public function removeListener($eventName, $listener) - { - return $this->dispatcher->removeListener($eventName, $listener); - } - - /** - * {@inheritdoc} - */ - public function removeSubscriber(EventSubscriberInterface $subscriber) - { - return $this->dispatcher->removeSubscriber($subscriber); - } - - /** - * {@inheritdoc} - */ - public function getListeners($eventName = null) - { - return $this->dispatcher->getListeners($eventName); - } - - /** - * {@inheritdoc} - */ - public function hasListeners($eventName = null) - { - return $this->dispatcher->hasListeners($eventName); - } - - /** - * {@inheritdoc} - */ - public function dispatch($eventName, Event $event = null) - { - if (null === $event) { - $event = new Event(); - } - - $this->preProcess($eventName); - $this->preDispatch($eventName, $event); - - $e = $this->stopwatch->start($eventName, 'section'); - - $this->dispatcher->dispatch($eventName, $event); - - if ($e->isStarted()) { - $e->stop(); - } - - $this->postDispatch($eventName, $event); - $this->postProcess($eventName); - - return $event; - } - - /** - * {@inheritdoc} - */ - public function getCalledListeners() - { - $called = array(); - foreach ($this->called as $eventName => $listeners) { - foreach ($listeners as $listener) { - $info = $this->getListenerInfo($listener->getWrappedListener(), $eventName); - $called[$eventName.'.'.$info['pretty']] = $info; - } - } - - return $called; - } - - /** - * {@inheritdoc} - */ - public function getNotCalledListeners() - { - try { - $allListeners = $this->getListeners(); - } catch (\Exception $e) { - if (null !== $this->logger) { - $this->logger->info(sprintf('An exception was thrown while getting the uncalled listeners (%s)', $e->getMessage()), array('exception' => $e)); - } - - // unable to retrieve the uncalled listeners - return array(); - } - - $notCalled = array(); - foreach ($allListeners as $eventName => $listeners) { - foreach ($listeners as $listener) { - $called = false; - if (isset($this->called[$eventName])) { - foreach ($this->called[$eventName] as $l) { - if ($l->getWrappedListener() === $listener) { - $called = true; - - break; - } - } - } - - if (!$called) { - $info = $this->getListenerInfo($listener, $eventName); - $notCalled[$eventName.'.'.$info['pretty']] = $info; - } - } - } - - return $notCalled; - } - - /** - * Proxies all method calls to the original event dispatcher. - * - * @param string $method The method name - * @param array $arguments The method arguments - * - * @return mixed - */ - public function __call($method, $arguments) - { - return call_user_func_array(array($this->dispatcher, $method), $arguments); - } - - /** - * Called before dispatching the event. - * - * @param string $eventName The event name - * @param Event $event The event - */ - protected function preDispatch($eventName, Event $event) - { - } - - /** - * Called after dispatching the event. - * - * @param string $eventName The event name - * @param Event $event The event - */ - protected function postDispatch($eventName, Event $event) - { - } - - private function preProcess($eventName) - { - foreach ($this->dispatcher->getListeners($eventName) as $listener) { - $this->dispatcher->removeListener($eventName, $listener); - $info = $this->getListenerInfo($listener, $eventName); - $name = isset($info['class']) ? $info['class'] : $info['type']; - $this->dispatcher->addListener($eventName, new WrappedListener($listener, $name, $this->stopwatch)); - } - } - - private function postProcess($eventName) - { - $skipped = false; - foreach ($this->dispatcher->getListeners($eventName) as $listener) { - // Unwrap listener - $this->dispatcher->removeListener($eventName, $listener); - $this->dispatcher->addListener($eventName, $listener->getWrappedListener()); - - $info = $this->getListenerInfo($listener->getWrappedListener(), $eventName); - if ($listener->wasCalled()) { - if (null !== $this->logger) { - $this->logger->debug(sprintf('Notified event "%s" to listener "%s".', $eventName, $info['pretty'])); - } - - if (!isset($this->called[$eventName])) { - $this->called[$eventName] = new \SplObjectStorage(); - } - - $this->called[$eventName]->attach($listener); - } - - if (null !== $this->logger && $skipped) { - $this->logger->debug(sprintf('Listener "%s" was not called for event "%s".', $info['pretty'], $eventName)); - } - - if ($listener->stoppedPropagation()) { - if (null !== $this->logger) { - $this->logger->debug(sprintf('Listener "%s" stopped propagation of the event "%s".', $info['pretty'], $eventName)); - } - - $skipped = true; - } - } - } - - /** - * Returns information about the listener - * - * @param object $listener The listener - * @param string $eventName The event name - * - * @return array Information about the listener - */ - private function getListenerInfo($listener, $eventName) - { - $info = array( - 'event' => $eventName, - ); - if ($listener instanceof \Closure) { - $info += array( - 'type' => 'Closure', - 'pretty' => 'closure' - ); - } elseif (is_string($listener)) { - try { - $r = new \ReflectionFunction($listener); - $file = $r->getFileName(); - $line = $r->getStartLine(); - } catch (\ReflectionException $e) { - $file = null; - $line = null; - } - $info += array( - 'type' => 'Function', - 'function' => $listener, - 'file' => $file, - 'line' => $line, - 'pretty' => $listener, - ); - } elseif (is_array($listener) || (is_object($listener) && is_callable($listener))) { - if (!is_array($listener)) { - $listener = array($listener, '__invoke'); - } - $class = is_object($listener[0]) ? get_class($listener[0]) : $listener[0]; - try { - $r = new \ReflectionMethod($class, $listener[1]); - $file = $r->getFileName(); - $line = $r->getStartLine(); - } catch (\ReflectionException $e) { - $file = null; - $line = null; - } - $info += array( - 'type' => 'Method', - 'class' => $class, - 'method' => $listener[1], - 'file' => $file, - 'line' => $line, - 'pretty' => $class.'::'.$listener[1], - ); - } - - return $info; - } -} diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcherInterface.php b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcherInterface.php deleted file mode 100644 index 5483e8150..000000000 --- a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcherInterface.php +++ /dev/null @@ -1,34 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\EventDispatcher\Debug; - -use Symfony\Component\EventDispatcher\EventDispatcherInterface; - -/** - * @author Fabien Potencier - */ -interface TraceableEventDispatcherInterface extends EventDispatcherInterface -{ - /** - * Gets the called listeners. - * - * @return array An array of called listeners - */ - public function getCalledListeners(); - - /** - * Gets the not called listeners. - * - * @return array An array of not called listeners - */ - public function getNotCalledListeners(); -} diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Debug/WrappedListener.php b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Debug/WrappedListener.php deleted file mode 100644 index c501662b0..000000000 --- a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Debug/WrappedListener.php +++ /dev/null @@ -1,69 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\EventDispatcher\Debug; - -use Symfony\Component\Stopwatch\Stopwatch; -use Symfony\Component\EventDispatcher\Event; -use Symfony\Component\EventDispatcher\EventDispatcherInterface; - -/** - * @author Fabien Potencier - */ -class WrappedListener -{ - private $listener; - private $name; - private $called; - private $stoppedPropagation; - private $stopwatch; - - public function __construct($listener, $name, Stopwatch $stopwatch) - { - $this->listener = $listener; - $this->name = $name; - $this->stopwatch = $stopwatch; - $this->called = false; - $this->stoppedPropagation = false; - } - - public function getWrappedListener() - { - return $this->listener; - } - - public function wasCalled() - { - return $this->called; - } - - public function stoppedPropagation() - { - return $this->stoppedPropagation; - } - - public function __invoke(Event $event, $eventName, EventDispatcherInterface $dispatcher) - { - $this->called = true; - - $e = $this->stopwatch->start($this->name, 'event_listener'); - - call_user_func($this->listener, $event, $eventName, $dispatcher); - - if ($e->isStarted()) { - $e->stop(); - } - - if ($event->isPropagationStopped()) { - $this->stoppedPropagation = true; - } - } -} diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/DependencyInjection/RegisterListenersPass.php b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/DependencyInjection/RegisterListenersPass.php deleted file mode 100644 index afe3ecd18..000000000 --- a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/DependencyInjection/RegisterListenersPass.php +++ /dev/null @@ -1,106 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\EventDispatcher\DependencyInjection; - -use Symfony\Component\DependencyInjection\ContainerBuilder; -use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; - -/** - * Compiler pass to register tagged services for an event dispatcher. - */ -class RegisterListenersPass implements CompilerPassInterface -{ - /** - * @var string - */ - protected $dispatcherService; - - /** - * @var string - */ - protected $listenerTag; - - /** - * @var string - */ - protected $subscriberTag; - - /** - * Constructor. - * - * @param string $dispatcherService Service name of the event dispatcher in processed container - * @param string $listenerTag Tag name used for listener - * @param string $subscriberTag Tag name used for subscribers - */ - public function __construct($dispatcherService = 'event_dispatcher', $listenerTag = 'kernel.event_listener', $subscriberTag = 'kernel.event_subscriber') - { - $this->dispatcherService = $dispatcherService; - $this->listenerTag = $listenerTag; - $this->subscriberTag = $subscriberTag; - } - - public function process(ContainerBuilder $container) - { - if (!$container->hasDefinition($this->dispatcherService) && !$container->hasAlias($this->dispatcherService)) { - return; - } - - $definition = $container->findDefinition($this->dispatcherService); - - foreach ($container->findTaggedServiceIds($this->listenerTag) as $id => $events) { - $def = $container->getDefinition($id); - if (!$def->isPublic()) { - throw new \InvalidArgumentException(sprintf('The service "%s" must be public as event listeners are lazy-loaded.', $id)); - } - - if ($def->isAbstract()) { - throw new \InvalidArgumentException(sprintf('The service "%s" must not be abstract as event listeners are lazy-loaded.', $id)); - } - - foreach ($events as $event) { - $priority = isset($event['priority']) ? $event['priority'] : 0; - - if (!isset($event['event'])) { - throw new \InvalidArgumentException(sprintf('Service "%s" must define the "event" attribute on "%s" tags.', $id, $this->listenerTag)); - } - - if (!isset($event['method'])) { - $event['method'] = 'on'.preg_replace_callback(array( - '/(?<=\b)[a-z]/i', - '/[^a-z0-9]/i', - ), function ($matches) { return strtoupper($matches[0]); }, $event['event']); - $event['method'] = preg_replace('/[^a-z0-9]/i', '', $event['method']); - } - - $definition->addMethodCall('addListenerService', array($event['event'], array($id, $event['method']), $priority)); - } - } - - foreach ($container->findTaggedServiceIds($this->subscriberTag) as $id => $attributes) { - $def = $container->getDefinition($id); - if (!$def->isPublic()) { - throw new \InvalidArgumentException(sprintf('The service "%s" must be public as event subscribers are lazy-loaded.', $id)); - } - - // We must assume that the class value has been correctly filled, even if the service is created by a factory - $class = $def->getClass(); - - $refClass = new \ReflectionClass($class); - $interface = 'Symfony\Component\EventDispatcher\EventSubscriberInterface'; - if (!$refClass->implementsInterface($interface)) { - throw new \InvalidArgumentException(sprintf('Service "%s" must implement interface "%s".', $id, $interface)); - } - - $definition->addMethodCall('addSubscriberService', array($id, $class)); - } - } -} diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Event.php b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Event.php deleted file mode 100644 index bf792a257..000000000 --- a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Event.php +++ /dev/null @@ -1,129 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\EventDispatcher; - -/** - * Event is the base class for classes containing event data. - * - * This class contains no event data. It is used by events that do not pass - * state information to an event handler when an event is raised. - * - * You can call the method stopPropagation() to abort the execution of - * further listeners in your event listener. - * - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Bernhard Schussek - * - * @api - */ -class Event -{ - /** - * @var bool Whether no further event listeners should be triggered - */ - private $propagationStopped = false; - - /** - * @var EventDispatcher Dispatcher that dispatched this event - */ - private $dispatcher; - - /** - * @var string This event's name - */ - private $name; - - /** - * Returns whether further event listeners should be triggered. - * - * @see Event::stopPropagation - * @return bool Whether propagation was already stopped for this event. - * - * @api - */ - public function isPropagationStopped() - { - return $this->propagationStopped; - } - - /** - * Stops the propagation of the event to further event listeners. - * - * If multiple event listeners are connected to the same event, no - * further event listener will be triggered once any trigger calls - * stopPropagation(). - * - * @api - */ - public function stopPropagation() - { - $this->propagationStopped = true; - } - - /** - * Stores the EventDispatcher that dispatches this Event - * - * @param EventDispatcherInterface $dispatcher - * - * @deprecated Deprecated in 2.4, to be removed in 3.0. The event dispatcher is passed to the listener call. - * - * @api - */ - public function setDispatcher(EventDispatcherInterface $dispatcher) - { - $this->dispatcher = $dispatcher; - } - - /** - * Returns the EventDispatcher that dispatches this Event - * - * @return EventDispatcherInterface - * - * @deprecated Deprecated in 2.4, to be removed in 3.0. The event dispatcher is passed to the listener call. - * - * @api - */ - public function getDispatcher() - { - return $this->dispatcher; - } - - /** - * Gets the event's name. - * - * @return string - * - * @deprecated Deprecated in 2.4, to be removed in 3.0. The event name is passed to the listener call. - * - * @api - */ - public function getName() - { - return $this->name; - } - - /** - * Sets the event's name property. - * - * @param string $name The event name. - * - * @deprecated Deprecated in 2.4, to be removed in 3.0. The event name is passed to the listener call. - * - * @api - */ - public function setName($name) - { - $this->name = $name; - } -} diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcher.php b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcher.php deleted file mode 100644 index 222a93714..000000000 --- a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcher.php +++ /dev/null @@ -1,185 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\EventDispatcher; - -/** - * The EventDispatcherInterface is the central point of Symfony's event listener system. - * - * Listeners are registered on the manager and events are dispatched through the - * manager. - * - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Bernhard Schussek - * @author Fabien Potencier - * @author Jordi Boggiano - * @author Jordan Alliot - * - * @api - */ -class EventDispatcher implements EventDispatcherInterface -{ - private $listeners = array(); - private $sorted = array(); - - /** - * @see EventDispatcherInterface::dispatch - * - * @api - */ - public function dispatch($eventName, Event $event = null) - { - if (null === $event) { - $event = new Event(); - } - - $event->setDispatcher($this); - $event->setName($eventName); - - if (!isset($this->listeners[$eventName])) { - return $event; - } - - $this->doDispatch($this->getListeners($eventName), $eventName, $event); - - return $event; - } - - /** - * @see EventDispatcherInterface::getListeners - */ - public function getListeners($eventName = null) - { - if (null !== $eventName) { - if (!isset($this->sorted[$eventName])) { - $this->sortListeners($eventName); - } - - return $this->sorted[$eventName]; - } - - foreach (array_keys($this->listeners) as $eventName) { - if (!isset($this->sorted[$eventName])) { - $this->sortListeners($eventName); - } - } - - return array_filter($this->sorted); - } - - /** - * @see EventDispatcherInterface::hasListeners - */ - public function hasListeners($eventName = null) - { - return (bool) count($this->getListeners($eventName)); - } - - /** - * @see EventDispatcherInterface::addListener - * - * @api - */ - public function addListener($eventName, $listener, $priority = 0) - { - $this->listeners[$eventName][$priority][] = $listener; - unset($this->sorted[$eventName]); - } - - /** - * @see EventDispatcherInterface::removeListener - */ - public function removeListener($eventName, $listener) - { - if (!isset($this->listeners[$eventName])) { - return; - } - - foreach ($this->listeners[$eventName] as $priority => $listeners) { - if (false !== ($key = array_search($listener, $listeners, true))) { - unset($this->listeners[$eventName][$priority][$key], $this->sorted[$eventName]); - } - } - } - - /** - * @see EventDispatcherInterface::addSubscriber - * - * @api - */ - public function addSubscriber(EventSubscriberInterface $subscriber) - { - foreach ($subscriber->getSubscribedEvents() as $eventName => $params) { - if (is_string($params)) { - $this->addListener($eventName, array($subscriber, $params)); - } elseif (is_string($params[0])) { - $this->addListener($eventName, array($subscriber, $params[0]), isset($params[1]) ? $params[1] : 0); - } else { - foreach ($params as $listener) { - $this->addListener($eventName, array($subscriber, $listener[0]), isset($listener[1]) ? $listener[1] : 0); - } - } - } - } - - /** - * @see EventDispatcherInterface::removeSubscriber - */ - public function removeSubscriber(EventSubscriberInterface $subscriber) - { - foreach ($subscriber->getSubscribedEvents() as $eventName => $params) { - if (is_array($params) && is_array($params[0])) { - foreach ($params as $listener) { - $this->removeListener($eventName, array($subscriber, $listener[0])); - } - } else { - $this->removeListener($eventName, array($subscriber, is_string($params) ? $params : $params[0])); - } - } - } - - /** - * Triggers the listeners of an event. - * - * This method can be overridden to add functionality that is executed - * for each listener. - * - * @param callable[] $listeners The event listeners. - * @param string $eventName The name of the event to dispatch. - * @param Event $event The event object to pass to the event handlers/listeners. - */ - protected function doDispatch($listeners, $eventName, Event $event) - { - foreach ($listeners as $listener) { - call_user_func($listener, $event, $eventName, $this); - if ($event->isPropagationStopped()) { - break; - } - } - } - - /** - * Sorts the internal list of listeners for the given event by priority. - * - * @param string $eventName The name of the event. - */ - private function sortListeners($eventName) - { - $this->sorted[$eventName] = array(); - - if (isset($this->listeners[$eventName])) { - krsort($this->listeners[$eventName]); - $this->sorted[$eventName] = call_user_func_array('array_merge', $this->listeners[$eventName]); - } - } -} diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcherInterface.php b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcherInterface.php deleted file mode 100644 index 3fdbfd882..000000000 --- a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcherInterface.php +++ /dev/null @@ -1,96 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\EventDispatcher; - -/** - * The EventDispatcherInterface is the central point of Symfony's event listener system. - * Listeners are registered on the manager and events are dispatched through the - * manager. - * - * @author Bernhard Schussek - * - * @api - */ -interface EventDispatcherInterface -{ - /** - * Dispatches an event to all registered listeners. - * - * @param string $eventName The name of the event to dispatch. The name of - * the event is the name of the method that is - * invoked on listeners. - * @param Event $event The event to pass to the event handlers/listeners. - * If not supplied, an empty Event instance is created. - * - * @return Event - * - * @api - */ - public function dispatch($eventName, Event $event = null); - - /** - * Adds an event listener that listens on the specified events. - * - * @param string $eventName The event to listen on - * @param callable $listener The listener - * @param int $priority The higher this value, the earlier an event - * listener will be triggered in the chain (defaults to 0) - * - * @api - */ - public function addListener($eventName, $listener, $priority = 0); - - /** - * Adds an event subscriber. - * - * The subscriber is asked for all the events he is - * interested in and added as a listener for these events. - * - * @param EventSubscriberInterface $subscriber The subscriber. - * - * @api - */ - public function addSubscriber(EventSubscriberInterface $subscriber); - - /** - * Removes an event listener from the specified events. - * - * @param string|array $eventName The event(s) to remove a listener from - * @param callable $listener The listener to remove - */ - public function removeListener($eventName, $listener); - - /** - * Removes an event subscriber. - * - * @param EventSubscriberInterface $subscriber The subscriber - */ - public function removeSubscriber(EventSubscriberInterface $subscriber); - - /** - * Gets the listeners of a specific event or all listeners. - * - * @param string $eventName The name of the event - * - * @return array The event listeners for the specified event, or all event listeners by event name - */ - public function getListeners($eventName = null); - - /** - * Checks whether an event has any registered listeners. - * - * @param string $eventName The name of the event - * - * @return bool true if the specified event has any listeners, false otherwise - */ - public function hasListeners($eventName = null); -} diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventSubscriberInterface.php b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventSubscriberInterface.php deleted file mode 100644 index 080f892fd..000000000 --- a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventSubscriberInterface.php +++ /dev/null @@ -1,50 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\EventDispatcher; - -/** - * An EventSubscriber knows himself what events he is interested in. - * If an EventSubscriber is added to an EventDispatcherInterface, the manager invokes - * {@link getSubscribedEvents} and registers the subscriber as a listener for all - * returned events. - * - * @author Guilherme Blanco - * @author Jonathan Wage - * @author Roman Borschel - * @author Bernhard Schussek - * - * @api - */ -interface EventSubscriberInterface -{ - /** - * Returns an array of event names this subscriber wants to listen to. - * - * The array keys are event names and the value can be: - * - * * The method name to call (priority defaults to 0) - * * An array composed of the method name to call and the priority - * * An array of arrays composed of the method names to call and respective - * priorities, or 0 if unset - * - * For instance: - * - * * array('eventName' => 'methodName') - * * array('eventName' => array('methodName', $priority)) - * * array('eventName' => array(array('methodName1', $priority), array('methodName2')) - * - * @return array The event names to listen to - * - * @api - */ - public static function getSubscribedEvents(); -} diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/GenericEvent.php b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/GenericEvent.php deleted file mode 100644 index 1e8c44a67..000000000 --- a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/GenericEvent.php +++ /dev/null @@ -1,186 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\EventDispatcher; - -/** - * Event encapsulation class. - * - * Encapsulates events thus decoupling the observer from the subject they encapsulate. - * - * @author Drak - */ -class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate -{ - /** - * Event subject. - * - * @var mixed usually object or callable - */ - protected $subject; - - /** - * Array of arguments. - * - * @var array - */ - protected $arguments; - - /** - * Encapsulate an event with $subject and $args. - * - * @param mixed $subject The subject of the event, usually an object. - * @param array $arguments Arguments to store in the event. - */ - public function __construct($subject = null, array $arguments = array()) - { - $this->subject = $subject; - $this->arguments = $arguments; - } - - /** - * Getter for subject property. - * - * @return mixed $subject The observer subject. - */ - public function getSubject() - { - return $this->subject; - } - - /** - * Get argument by key. - * - * @param string $key Key. - * - * @throws \InvalidArgumentException If key is not found. - * - * @return mixed Contents of array key. - */ - public function getArgument($key) - { - if ($this->hasArgument($key)) { - return $this->arguments[$key]; - } - - throw new \InvalidArgumentException(sprintf('%s not found in %s', $key, $this->getName())); - } - - /** - * Add argument to event. - * - * @param string $key Argument name. - * @param mixed $value Value. - * - * @return GenericEvent - */ - public function setArgument($key, $value) - { - $this->arguments[$key] = $value; - - return $this; - } - - /** - * Getter for all arguments. - * - * @return array - */ - public function getArguments() - { - return $this->arguments; - } - - /** - * Set args property. - * - * @param array $args Arguments. - * - * @return GenericEvent - */ - public function setArguments(array $args = array()) - { - $this->arguments = $args; - - return $this; - } - - /** - * Has argument. - * - * @param string $key Key of arguments array. - * - * @return bool - */ - public function hasArgument($key) - { - return array_key_exists($key, $this->arguments); - } - - /** - * ArrayAccess for argument getter. - * - * @param string $key Array key. - * - * @throws \InvalidArgumentException If key does not exist in $this->args. - * - * @return mixed - */ - public function offsetGet($key) - { - return $this->getArgument($key); - } - - /** - * ArrayAccess for argument setter. - * - * @param string $key Array key to set. - * @param mixed $value Value. - */ - public function offsetSet($key, $value) - { - $this->setArgument($key, $value); - } - - /** - * ArrayAccess for unset argument. - * - * @param string $key Array key. - */ - public function offsetUnset($key) - { - if ($this->hasArgument($key)) { - unset($this->arguments[$key]); - } - } - - /** - * ArrayAccess has argument. - * - * @param string $key Array key. - * - * @return bool - */ - public function offsetExists($key) - { - return $this->hasArgument($key); - } - - /** - * IteratorAggregate for iterating over the object like an array - * - * @return \ArrayIterator - */ - public function getIterator() - { - return new \ArrayIterator($this->arguments); - } -} diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/ImmutableEventDispatcher.php b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/ImmutableEventDispatcher.php deleted file mode 100644 index b70b81a8b..000000000 --- a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/ImmutableEventDispatcher.php +++ /dev/null @@ -1,92 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\EventDispatcher; - -/** - * A read-only proxy for an event dispatcher. - * - * @author Bernhard Schussek - */ -class ImmutableEventDispatcher implements EventDispatcherInterface -{ - /** - * The proxied dispatcher. - * @var EventDispatcherInterface - */ - private $dispatcher; - - /** - * Creates an unmodifiable proxy for an event dispatcher. - * - * @param EventDispatcherInterface $dispatcher The proxied event dispatcher. - */ - public function __construct(EventDispatcherInterface $dispatcher) - { - $this->dispatcher = $dispatcher; - } - - /** - * {@inheritdoc} - */ - public function dispatch($eventName, Event $event = null) - { - return $this->dispatcher->dispatch($eventName, $event); - } - - /** - * {@inheritdoc} - */ - public function addListener($eventName, $listener, $priority = 0) - { - throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.'); - } - - /** - * {@inheritdoc} - */ - public function addSubscriber(EventSubscriberInterface $subscriber) - { - throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.'); - } - - /** - * {@inheritdoc} - */ - public function removeListener($eventName, $listener) - { - throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.'); - } - - /** - * {@inheritdoc} - */ - public function removeSubscriber(EventSubscriberInterface $subscriber) - { - throw new \BadMethodCallException('Unmodifiable event dispatchers must not be modified.'); - } - - /** - * {@inheritdoc} - */ - public function getListeners($eventName = null) - { - return $this->dispatcher->getListeners($eventName); - } - - /** - * {@inheritdoc} - */ - public function hasListeners($eventName = null) - { - return $this->dispatcher->hasListeners($eventName); - } -} diff --git a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/LICENSE b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/LICENSE deleted file mode 100644 index 0b3292cf9..000000000 --- a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2004-2014 Fabien Potencier - -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/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/README.md b/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/README.md deleted file mode 100644 index 22bf74fdc..000000000 --- a/vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/README.md +++ /dev/null @@ -1,25 +0,0 @@ -EventDispatcher Component -========================= - -The Symfony2 EventDispatcher component implements the Mediator pattern in a -simple and effective way to make your projects truly extensible. - - use Symfony\Component\EventDispatcher\EventDispatcher; - use Symfony\Component\EventDispatcher\Event; - - $dispatcher = new EventDispatcher(); - - $dispatcher->addListener('event_name', function (Event $event) { - // ... - }); - - $dispatcher->dispatch('event_name'); - -Resources ---------- - -You can run the unit tests with the following command: - - $ cd path/to/Symfony/Component/EventDispatcher/ - $ composer.phar install - $ phpunit diff --git a/vendor/symfony/yaml/Symfony/Component/Yaml/CHANGELOG.md b/vendor/symfony/yaml/Symfony/Component/Yaml/CHANGELOG.md deleted file mode 100644 index 096cf654d..000000000 --- a/vendor/symfony/yaml/Symfony/Component/Yaml/CHANGELOG.md +++ /dev/null @@ -1,8 +0,0 @@ -CHANGELOG -========= - -2.1.0 ------ - - * Yaml::parse() does not evaluate loaded files as PHP files by default - anymore (call Yaml::enablePhpParsing() to get back the old behavior) diff --git a/vendor/symfony/yaml/Symfony/Component/Yaml/Dumper.php b/vendor/symfony/yaml/Symfony/Component/Yaml/Dumper.php deleted file mode 100644 index 26103c88e..000000000 --- a/vendor/symfony/yaml/Symfony/Component/Yaml/Dumper.php +++ /dev/null @@ -1,73 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Yaml; - -/** - * Dumper dumps PHP variables to YAML strings. - * - * @author Fabien Potencier - */ -class Dumper -{ - /** - * The amount of spaces to use for indentation of nested nodes. - * - * @var int - */ - protected $indentation = 4; - - /** - * Sets the indentation. - * - * @param int $num The amount of spaces to use for indentation of nested nodes. - */ - public function setIndentation($num) - { - $this->indentation = (int) $num; - } - - /** - * Dumps a PHP value to YAML. - * - * @param mixed $input The PHP value - * @param int $inline The level where you switch to inline YAML - * @param int $indent The level of indentation (used internally) - * @param bool $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise - * @param bool $objectSupport true if object support is enabled, false otherwise - * - * @return string The YAML representation of the PHP value - */ - public function dump($input, $inline = 0, $indent = 0, $exceptionOnInvalidType = false, $objectSupport = false) - { - $output = ''; - $prefix = $indent ? str_repeat(' ', $indent) : ''; - - if ($inline <= 0 || !is_array($input) || empty($input)) { - $output .= $prefix.Inline::dump($input, $exceptionOnInvalidType, $objectSupport); - } else { - $isAHash = array_keys($input) !== range(0, count($input) - 1); - - foreach ($input as $key => $value) { - $willBeInlined = $inline - 1 <= 0 || !is_array($value) || empty($value); - - $output .= sprintf('%s%s%s%s', - $prefix, - $isAHash ? Inline::dump($key, $exceptionOnInvalidType, $objectSupport).':' : '-', - $willBeInlined ? ' ' : "\n", - $this->dump($value, $inline - 1, $willBeInlined ? 0 : $indent + $this->indentation, $exceptionOnInvalidType, $objectSupport) - ).($willBeInlined ? "\n" : ''); - } - } - - return $output; - } -} diff --git a/vendor/symfony/yaml/Symfony/Component/Yaml/Escaper.php b/vendor/symfony/yaml/Symfony/Component/Yaml/Escaper.php deleted file mode 100644 index 4a6b62161..000000000 --- a/vendor/symfony/yaml/Symfony/Component/Yaml/Escaper.php +++ /dev/null @@ -1,89 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Yaml; - -/** - * Escaper encapsulates escaping rules for single and double-quoted - * YAML strings. - * - * @author Matthew Lewinski - */ -class Escaper -{ - // Characters that would cause a dumped string to require double quoting. - const REGEX_CHARACTER_TO_ESCAPE = "[\\x00-\\x1f]|\xc2\x85|\xc2\xa0|\xe2\x80\xa8|\xe2\x80\xa9"; - - // Mapping arrays for escaping a double quoted string. The backslash is - // first to ensure proper escaping because str_replace operates iteratively - // on the input arrays. This ordering of the characters avoids the use of strtr, - // which performs more slowly. - private static $escapees = array('\\\\', '\\"', '"', - "\x00", "\x01", "\x02", "\x03", "\x04", "\x05", "\x06", "\x07", - "\x08", "\x09", "\x0a", "\x0b", "\x0c", "\x0d", "\x0e", "\x0f", - "\x10", "\x11", "\x12", "\x13", "\x14", "\x15", "\x16", "\x17", - "\x18", "\x19", "\x1a", "\x1b", "\x1c", "\x1d", "\x1e", "\x1f", - "\xc2\x85", "\xc2\xa0", "\xe2\x80\xa8", "\xe2\x80\xa9"); - private static $escaped = array('\\"', '\\\\', '\\"', - "\\0", "\\x01", "\\x02", "\\x03", "\\x04", "\\x05", "\\x06", "\\a", - "\\b", "\\t", "\\n", "\\v", "\\f", "\\r", "\\x0e", "\\x0f", - "\\x10", "\\x11", "\\x12", "\\x13", "\\x14", "\\x15", "\\x16", "\\x17", - "\\x18", "\\x19", "\\x1a", "\\e", "\\x1c", "\\x1d", "\\x1e", "\\x1f", - "\\N", "\\_", "\\L", "\\P"); - - /** - * Determines if a PHP value would require double quoting in YAML. - * - * @param string $value A PHP value - * - * @return bool True if the value would require double quotes. - */ - public static function requiresDoubleQuoting($value) - { - return preg_match('/'.self::REGEX_CHARACTER_TO_ESCAPE.'/u', $value); - } - - /** - * Escapes and surrounds a PHP value with double quotes. - * - * @param string $value A PHP value - * - * @return string The quoted, escaped string - */ - public static function escapeWithDoubleQuotes($value) - { - return sprintf('"%s"', str_replace(self::$escapees, self::$escaped, $value)); - } - - /** - * Determines if a PHP value would require single quoting in YAML. - * - * @param string $value A PHP value - * - * @return bool True if the value would require single quotes. - */ - public static function requiresSingleQuoting($value) - { - return preg_match('/[ \s \' " \: \{ \} \[ \] , & \* \# \?] | \A[ \- ? | < > = ! % @ ` ]/x', $value); - } - - /** - * Escapes and surrounds a PHP value with single quotes. - * - * @param string $value A PHP value - * - * @return string The quoted, escaped string - */ - public static function escapeWithSingleQuotes($value) - { - return sprintf("'%s'", str_replace('\'', '\'\'', $value)); - } -} diff --git a/vendor/symfony/yaml/Symfony/Component/Yaml/Exception/DumpException.php b/vendor/symfony/yaml/Symfony/Component/Yaml/Exception/DumpException.php deleted file mode 100644 index 9b3e6de07..000000000 --- a/vendor/symfony/yaml/Symfony/Component/Yaml/Exception/DumpException.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Yaml\Exception; - -/** - * Exception class thrown when an error occurs during dumping. - * - * @author Fabien Potencier - * - * @api - */ -class DumpException extends RuntimeException -{ -} diff --git a/vendor/symfony/yaml/Symfony/Component/Yaml/Exception/ExceptionInterface.php b/vendor/symfony/yaml/Symfony/Component/Yaml/Exception/ExceptionInterface.php deleted file mode 100644 index 92e5c2ea4..000000000 --- a/vendor/symfony/yaml/Symfony/Component/Yaml/Exception/ExceptionInterface.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Yaml\Exception; - -/** - * Exception interface for all exceptions thrown by the component. - * - * @author Fabien Potencier - * - * @api - */ -interface ExceptionInterface -{ -} diff --git a/vendor/symfony/yaml/Symfony/Component/Yaml/Exception/ParseException.php b/vendor/symfony/yaml/Symfony/Component/Yaml/Exception/ParseException.php deleted file mode 100644 index ff01d6b9a..000000000 --- a/vendor/symfony/yaml/Symfony/Component/Yaml/Exception/ParseException.php +++ /dev/null @@ -1,148 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Yaml\Exception; - -if (!defined('JSON_UNESCAPED_UNICODE')) { - define('JSON_UNESCAPED_SLASHES', 64); - define('JSON_UNESCAPED_UNICODE', 256); -} - -/** - * Exception class thrown when an error occurs during parsing. - * - * @author Fabien Potencier - * - * @api - */ -class ParseException extends RuntimeException -{ - private $parsedFile; - private $parsedLine; - private $snippet; - private $rawMessage; - - /** - * Constructor. - * - * @param string $message The error message - * @param int $parsedLine The line where the error occurred - * @param int $snippet The snippet of code near the problem - * @param string $parsedFile The file name where the error occurred - * @param \Exception $previous The previous exception - */ - public function __construct($message, $parsedLine = -1, $snippet = null, $parsedFile = null, \Exception $previous = null) - { - $this->parsedFile = $parsedFile; - $this->parsedLine = $parsedLine; - $this->snippet = $snippet; - $this->rawMessage = $message; - - $this->updateRepr(); - - parent::__construct($this->message, 0, $previous); - } - - /** - * Gets the snippet of code near the error. - * - * @return string The snippet of code - */ - public function getSnippet() - { - return $this->snippet; - } - - /** - * Sets the snippet of code near the error. - * - * @param string $snippet The code snippet - */ - public function setSnippet($snippet) - { - $this->snippet = $snippet; - - $this->updateRepr(); - } - - /** - * Gets the filename where the error occurred. - * - * This method returns null if a string is parsed. - * - * @return string The filename - */ - public function getParsedFile() - { - return $this->parsedFile; - } - - /** - * Sets the filename where the error occurred. - * - * @param string $parsedFile The filename - */ - public function setParsedFile($parsedFile) - { - $this->parsedFile = $parsedFile; - - $this->updateRepr(); - } - - /** - * Gets the line where the error occurred. - * - * @return int The file line - */ - public function getParsedLine() - { - return $this->parsedLine; - } - - /** - * Sets the line where the error occurred. - * - * @param int $parsedLine The file line - */ - public function setParsedLine($parsedLine) - { - $this->parsedLine = $parsedLine; - - $this->updateRepr(); - } - - private function updateRepr() - { - $this->message = $this->rawMessage; - - $dot = false; - if ('.' === substr($this->message, -1)) { - $this->message = substr($this->message, 0, -1); - $dot = true; - } - - if (null !== $this->parsedFile) { - $this->message .= sprintf(' in %s', json_encode($this->parsedFile, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)); - } - - if ($this->parsedLine >= 0) { - $this->message .= sprintf(' at line %d', $this->parsedLine); - } - - if ($this->snippet) { - $this->message .= sprintf(' (near "%s")', $this->snippet); - } - - if ($dot) { - $this->message .= '.'; - } - } -} diff --git a/vendor/symfony/yaml/Symfony/Component/Yaml/Exception/RuntimeException.php b/vendor/symfony/yaml/Symfony/Component/Yaml/Exception/RuntimeException.php deleted file mode 100644 index 3573bf15a..000000000 --- a/vendor/symfony/yaml/Symfony/Component/Yaml/Exception/RuntimeException.php +++ /dev/null @@ -1,23 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Yaml\Exception; - -/** - * Exception class thrown when an error occurs during parsing. - * - * @author Romain Neutron - * - * @api - */ -class RuntimeException extends \RuntimeException implements ExceptionInterface -{ -} diff --git a/vendor/symfony/yaml/Symfony/Component/Yaml/Inline.php b/vendor/symfony/yaml/Symfony/Component/Yaml/Inline.php deleted file mode 100644 index 461d60562..000000000 --- a/vendor/symfony/yaml/Symfony/Component/Yaml/Inline.php +++ /dev/null @@ -1,489 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Yaml; - -use Symfony\Component\Yaml\Exception\ParseException; -use Symfony\Component\Yaml\Exception\DumpException; - -/** - * Inline implements a YAML parser/dumper for the YAML inline syntax. - * - * @author Fabien Potencier - */ -class Inline -{ - const REGEX_QUOTED_STRING = '(?:"([^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|\'([^\']*(?:\'\'[^\']*)*)\')'; - - private static $exceptionOnInvalidType = false; - private static $objectSupport = false; - - /** - * Converts a YAML string to a PHP array. - * - * @param string $value A YAML string - * @param bool $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise - * @param bool $objectSupport true if object support is enabled, false otherwise - * - * @return array A PHP array representing the YAML string - * - * @throws ParseException - */ - public static function parse($value, $exceptionOnInvalidType = false, $objectSupport = false) - { - self::$exceptionOnInvalidType = $exceptionOnInvalidType; - self::$objectSupport = $objectSupport; - - $value = trim($value); - - if (0 == strlen($value)) { - return ''; - } - - if (function_exists('mb_internal_encoding') && ((int) ini_get('mbstring.func_overload')) & 2) { - $mbEncoding = mb_internal_encoding(); - mb_internal_encoding('ASCII'); - } - - $i = 0; - switch ($value[0]) { - case '[': - $result = self::parseSequence($value, $i); - ++$i; - break; - case '{': - $result = self::parseMapping($value, $i); - ++$i; - break; - default: - $result = self::parseScalar($value, null, array('"', "'"), $i); - } - - // some comments are allowed at the end - if (preg_replace('/\s+#.*$/A', '', substr($value, $i))) { - throw new ParseException(sprintf('Unexpected characters near "%s".', substr($value, $i))); - } - - if (isset($mbEncoding)) { - mb_internal_encoding($mbEncoding); - } - - return $result; - } - - /** - * Dumps a given PHP variable to a YAML string. - * - * @param mixed $value The PHP variable to convert - * @param bool $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise - * @param bool $objectSupport true if object support is enabled, false otherwise - * - * @return string The YAML string representing the PHP array - * - * @throws DumpException When trying to dump PHP resource - */ - public static function dump($value, $exceptionOnInvalidType = false, $objectSupport = false) - { - switch (true) { - case is_resource($value): - if ($exceptionOnInvalidType) { - throw new DumpException(sprintf('Unable to dump PHP resources in a YAML file ("%s").', get_resource_type($value))); - } - - return 'null'; - case is_object($value): - if ($objectSupport) { - return '!!php/object:'.serialize($value); - } - - if ($exceptionOnInvalidType) { - throw new DumpException('Object support when dumping a YAML file has been disabled.'); - } - - return 'null'; - case is_array($value): - return self::dumpArray($value, $exceptionOnInvalidType, $objectSupport); - case null === $value: - return 'null'; - case true === $value: - return 'true'; - case false === $value: - return 'false'; - case ctype_digit($value): - return is_string($value) ? "'$value'" : (int) $value; - case is_numeric($value): - $locale = setlocale(LC_NUMERIC, 0); - if (false !== $locale) { - setlocale(LC_NUMERIC, 'C'); - } - $repr = is_string($value) ? "'$value'" : (is_infinite($value) ? str_ireplace('INF', '.Inf', strval($value)) : strval($value)); - - if (false !== $locale) { - setlocale(LC_NUMERIC, $locale); - } - - return $repr; - case Escaper::requiresDoubleQuoting($value): - return Escaper::escapeWithDoubleQuotes($value); - case Escaper::requiresSingleQuoting($value): - return Escaper::escapeWithSingleQuotes($value); - case '' == $value: - return "''"; - case preg_match(self::getTimestampRegex(), $value): - case in_array(strtolower($value), array('null', '~', 'true', 'false')): - return "'$value'"; - default: - return $value; - } - } - - /** - * Dumps a PHP array to a YAML string. - * - * @param array $value The PHP array to dump - * @param bool $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise - * @param bool $objectSupport true if object support is enabled, false otherwise - * - * @return string The YAML string representing the PHP array - */ - private static function dumpArray($value, $exceptionOnInvalidType, $objectSupport) - { - // array - $keys = array_keys($value); - if ((1 == count($keys) && '0' == $keys[0]) - || (count($keys) > 1 && array_reduce($keys, function ($v, $w) { return (int) $v + $w; }, 0) == count($keys) * (count($keys) - 1) / 2) - ) { - $output = array(); - foreach ($value as $val) { - $output[] = self::dump($val, $exceptionOnInvalidType, $objectSupport); - } - - return sprintf('[%s]', implode(', ', $output)); - } - - // mapping - $output = array(); - foreach ($value as $key => $val) { - $output[] = sprintf('%s: %s', self::dump($key, $exceptionOnInvalidType, $objectSupport), self::dump($val, $exceptionOnInvalidType, $objectSupport)); - } - - return sprintf('{ %s }', implode(', ', $output)); - } - - /** - * Parses a scalar to a YAML string. - * - * @param scalar $scalar - * @param string $delimiters - * @param array $stringDelimiters - * @param int &$i - * @param bool $evaluate - * - * @return string A YAML string - * - * @throws ParseException When malformed inline YAML string is parsed - */ - public static function parseScalar($scalar, $delimiters = null, $stringDelimiters = array('"', "'"), &$i = 0, $evaluate = true) - { - if (in_array($scalar[$i], $stringDelimiters)) { - // quoted scalar - $output = self::parseQuotedScalar($scalar, $i); - - if (null !== $delimiters) { - $tmp = ltrim(substr($scalar, $i), ' '); - if (!in_array($tmp[0], $delimiters)) { - throw new ParseException(sprintf('Unexpected characters (%s).', substr($scalar, $i))); - } - } - } else { - // "normal" string - if (!$delimiters) { - $output = substr($scalar, $i); - $i += strlen($output); - - // remove comments - if (false !== $strpos = strpos($output, ' #')) { - $output = rtrim(substr($output, 0, $strpos)); - } - } elseif (preg_match('/^(.+?)('.implode('|', $delimiters).')/', substr($scalar, $i), $match)) { - $output = $match[1]; - $i += strlen($output); - } else { - throw new ParseException(sprintf('Malformed inline YAML string (%s).', $scalar)); - } - - if ($evaluate) { - $output = self::evaluateScalar($output); - } - } - - return $output; - } - - /** - * Parses a quoted scalar to YAML. - * - * @param string $scalar - * @param int &$i - * - * @return string A YAML string - * - * @throws ParseException When malformed inline YAML string is parsed - */ - private static function parseQuotedScalar($scalar, &$i) - { - if (!preg_match('/'.self::REGEX_QUOTED_STRING.'/Au', substr($scalar, $i), $match)) { - throw new ParseException(sprintf('Malformed inline YAML string (%s).', substr($scalar, $i))); - } - - $output = substr($match[0], 1, strlen($match[0]) - 2); - - $unescaper = new Unescaper(); - if ('"' == $scalar[$i]) { - $output = $unescaper->unescapeDoubleQuotedString($output); - } else { - $output = $unescaper->unescapeSingleQuotedString($output); - } - - $i += strlen($match[0]); - - return $output; - } - - /** - * Parses a sequence to a YAML string. - * - * @param string $sequence - * @param int &$i - * - * @return string A YAML string - * - * @throws ParseException When malformed inline YAML string is parsed - */ - private static function parseSequence($sequence, &$i = 0) - { - $output = array(); - $len = strlen($sequence); - $i += 1; - - // [foo, bar, ...] - while ($i < $len) { - switch ($sequence[$i]) { - case '[': - // nested sequence - $output[] = self::parseSequence($sequence, $i); - break; - case '{': - // nested mapping - $output[] = self::parseMapping($sequence, $i); - break; - case ']': - return $output; - case ',': - case ' ': - break; - default: - $isQuoted = in_array($sequence[$i], array('"', "'")); - $value = self::parseScalar($sequence, array(',', ']'), array('"', "'"), $i); - - if (!$isQuoted && false !== strpos($value, ': ')) { - // embedded mapping? - try { - $value = self::parseMapping('{'.$value.'}'); - } catch (\InvalidArgumentException $e) { - // no, it's not - } - } - - $output[] = $value; - - --$i; - } - - ++$i; - } - - throw new ParseException(sprintf('Malformed inline YAML string %s', $sequence)); - } - - /** - * Parses a mapping to a YAML string. - * - * @param string $mapping - * @param int &$i - * - * @return string A YAML string - * - * @throws ParseException When malformed inline YAML string is parsed - */ - private static function parseMapping($mapping, &$i = 0) - { - $output = array(); - $len = strlen($mapping); - $i += 1; - - // {foo: bar, bar:foo, ...} - while ($i < $len) { - switch ($mapping[$i]) { - case ' ': - case ',': - ++$i; - continue 2; - case '}': - return $output; - } - - // key - $key = self::parseScalar($mapping, array(':', ' '), array('"', "'"), $i, false); - - // value - $done = false; - while ($i < $len) { - switch ($mapping[$i]) { - case '[': - // nested sequence - $value = self::parseSequence($mapping, $i); - // Spec: Keys MUST be unique; first one wins. - // Parser cannot abort this mapping earlier, since lines - // are processed sequentially. - if (!isset($output[$key])) { - $output[$key] = $value; - } - $done = true; - break; - case '{': - // nested mapping - $value = self::parseMapping($mapping, $i); - // Spec: Keys MUST be unique; first one wins. - // Parser cannot abort this mapping earlier, since lines - // are processed sequentially. - if (!isset($output[$key])) { - $output[$key] = $value; - } - $done = true; - break; - case ':': - case ' ': - break; - default: - $value = self::parseScalar($mapping, array(',', '}'), array('"', "'"), $i); - // Spec: Keys MUST be unique; first one wins. - // Parser cannot abort this mapping earlier, since lines - // are processed sequentially. - if (!isset($output[$key])) { - $output[$key] = $value; - } - $done = true; - --$i; - } - - ++$i; - - if ($done) { - continue 2; - } - } - } - - throw new ParseException(sprintf('Malformed inline YAML string %s', $mapping)); - } - - /** - * Evaluates scalars and replaces magic values. - * - * @param string $scalar - * - * @return string A YAML string - * - * @throws ParseException when object parsing support was disabled and the parser detected a PHP object - */ - private static function evaluateScalar($scalar) - { - $scalar = trim($scalar); - $scalarLower = strtolower($scalar); - switch (true) { - case 'null' === $scalarLower: - case '' === $scalar: - case '~' === $scalar: - return; - case 'true' === $scalarLower: - return true; - case 'false' === $scalarLower: - return false; - // Optimise for returning strings. - case $scalar[0] === '+' || $scalar[0] === '-' || $scalar[0] === '.' || $scalar[0] === '!' || is_numeric($scalar[0]): - switch (true) { - case 0 === strpos($scalar, '!str'): - return (string) substr($scalar, 5); - case 0 === strpos($scalar, '! '): - return intval(self::parseScalar(substr($scalar, 2))); - case 0 === strpos($scalar, '!!php/object:'): - if (self::$objectSupport) { - return unserialize(substr($scalar, 13)); - } - - if (self::$exceptionOnInvalidType) { - throw new ParseException('Object support when parsing a YAML file has been disabled.'); - } - - return; - case ctype_digit($scalar): - $raw = $scalar; - $cast = intval($scalar); - - return '0' == $scalar[0] ? octdec($scalar) : (((string) $raw == (string) $cast) ? $cast : $raw); - case '-' === $scalar[0] && ctype_digit(substr($scalar, 1)): - $raw = $scalar; - $cast = intval($scalar); - - return '0' == $scalar[1] ? octdec($scalar) : (((string) $raw == (string) $cast) ? $cast : $raw); - case is_numeric($scalar): - return '0x' == $scalar[0].$scalar[1] ? hexdec($scalar) : floatval($scalar); - case '.inf' === $scalarLower: - case '.nan' === $scalarLower: - return -log(0); - case '-.inf' === $scalarLower: - return log(0); - case preg_match('/^(-|\+)?[0-9,]+(\.[0-9]+)?$/', $scalar): - return floatval(str_replace(',', '', $scalar)); - case preg_match(self::getTimestampRegex(), $scalar): - return strtotime($scalar); - } - default: - return (string) $scalar; - } - } - - /** - * Gets a regex that matches a YAML date. - * - * @return string The regular expression - * - * @see http://www.yaml.org/spec/1.2/spec.html#id2761573 - */ - private static function getTimestampRegex() - { - return <<[0-9][0-9][0-9][0-9]) - -(?P[0-9][0-9]?) - -(?P[0-9][0-9]?) - (?:(?:[Tt]|[ \t]+) - (?P[0-9][0-9]?) - :(?P[0-9][0-9]) - :(?P[0-9][0-9]) - (?:\.(?P[0-9]*))? - (?:[ \t]*(?PZ|(?P[-+])(?P[0-9][0-9]?) - (?::(?P[0-9][0-9]))?))?)? - $~x -EOF; - } -} diff --git a/vendor/symfony/yaml/Symfony/Component/Yaml/LICENSE b/vendor/symfony/yaml/Symfony/Component/Yaml/LICENSE deleted file mode 100644 index 0b3292cf9..000000000 --- a/vendor/symfony/yaml/Symfony/Component/Yaml/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2004-2014 Fabien Potencier - -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/vendor/symfony/yaml/Symfony/Component/Yaml/Parser.php b/vendor/symfony/yaml/Symfony/Component/Yaml/Parser.php deleted file mode 100644 index 0577b5e88..000000000 --- a/vendor/symfony/yaml/Symfony/Component/Yaml/Parser.php +++ /dev/null @@ -1,673 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Yaml; - -use Symfony\Component\Yaml\Exception\ParseException; - -/** - * Parser parses YAML strings to convert them to PHP arrays. - * - * @author Fabien Potencier - */ -class Parser -{ - const FOLDED_SCALAR_PATTERN = '(?P\||>)(?P\+|\-|\d+|\+\d+|\-\d+|\d+\+|\d+\-)?(?P +#.*)?'; - - private $offset = 0; - private $lines = array(); - private $currentLineNb = -1; - private $currentLine = ''; - private $refs = array(); - - /** - * Constructor - * - * @param int $offset The offset of YAML document (used for line numbers in error messages) - */ - public function __construct($offset = 0) - { - $this->offset = $offset; - } - - /** - * Parses a YAML string to a PHP value. - * - * @param string $value A YAML string - * @param bool $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise - * @param bool $objectSupport true if object support is enabled, false otherwise - * - * @return mixed A PHP value - * - * @throws ParseException If the YAML is not valid - */ - public function parse($value, $exceptionOnInvalidType = false, $objectSupport = false) - { - $this->currentLineNb = -1; - $this->currentLine = ''; - $this->lines = explode("\n", $this->cleanup($value)); - - if (!preg_match('//u', $value)) { - throw new ParseException('The YAML value does not appear to be valid UTF-8.'); - } - - if (function_exists('mb_internal_encoding') && ((int) ini_get('mbstring.func_overload')) & 2) { - $mbEncoding = mb_internal_encoding(); - mb_internal_encoding('UTF-8'); - } - - $data = array(); - $context = null; - $allowOverwrite = false; - while ($this->moveToNextLine()) { - if ($this->isCurrentLineEmpty()) { - continue; - } - - // tab? - if ("\t" === $this->currentLine[0]) { - throw new ParseException('A YAML file cannot contain tabs as indentation.', $this->getRealCurrentLineNb() + 1, $this->currentLine); - } - - $isRef = $mergeNode = false; - if (preg_match('#^\-((?P\s+)(?P.+?))?\s*$#u', $this->currentLine, $values)) { - if ($context && 'mapping' == $context) { - throw new ParseException('You cannot define a sequence item when in a mapping'); - } - $context = 'sequence'; - - if (isset($values['value']) && preg_match('#^&(?P[^ ]+) *(?P.*)#u', $values['value'], $matches)) { - $isRef = $matches['ref']; - $values['value'] = $matches['value']; - } - - // array - if (!isset($values['value']) || '' == trim($values['value'], ' ') || 0 === strpos(ltrim($values['value'], ' '), '#')) { - $c = $this->getRealCurrentLineNb() + 1; - $parser = new Parser($c); - $parser->refs =& $this->refs; - $data[] = $parser->parse($this->getNextEmbedBlock(), $exceptionOnInvalidType, $objectSupport); - } else { - if (isset($values['leadspaces']) - && ' ' == $values['leadspaces'] - && preg_match('#^(?P'.Inline::REGEX_QUOTED_STRING.'|[^ \'"\{\[].*?) *\:(\s+(?P.+?))?\s*$#u', $values['value'], $matches) - ) { - // this is a compact notation element, add to next block and parse - $c = $this->getRealCurrentLineNb(); - $parser = new Parser($c); - $parser->refs =& $this->refs; - - $block = $values['value']; - if ($this->isNextLineIndented()) { - $block .= "\n".$this->getNextEmbedBlock($this->getCurrentLineIndentation() + 2); - } - - $data[] = $parser->parse($block, $exceptionOnInvalidType, $objectSupport); - } else { - $data[] = $this->parseValue($values['value'], $exceptionOnInvalidType, $objectSupport); - } - } - } elseif (preg_match('#^(?P'.Inline::REGEX_QUOTED_STRING.'|[^ \'"\[\{].*?) *\:(\s+(?P.+?))?\s*$#u', $this->currentLine, $values) && false === strpos($values['key'],' #')) { - if ($context && 'sequence' == $context) { - throw new ParseException('You cannot define a mapping item when in a sequence'); - } - $context = 'mapping'; - - // force correct settings - Inline::parse(null, $exceptionOnInvalidType, $objectSupport); - try { - $key = Inline::parseScalar($values['key']); - } catch (ParseException $e) { - $e->setParsedLine($this->getRealCurrentLineNb() + 1); - $e->setSnippet($this->currentLine); - - throw $e; - } - - if ('<<' === $key) { - $mergeNode = true; - $allowOverwrite = true; - if (isset($values['value']) && 0 === strpos($values['value'], '*')) { - $refName = substr($values['value'], 1); - if (!array_key_exists($refName, $this->refs)) { - throw new ParseException(sprintf('Reference "%s" does not exist.', $refName), $this->getRealCurrentLineNb() + 1, $this->currentLine); - } - - $refValue = $this->refs[$refName]; - - if (!is_array($refValue)) { - throw new ParseException('YAML merge keys used with a scalar value instead of an array.', $this->getRealCurrentLineNb() + 1, $this->currentLine); - } - - foreach ($refValue as $key => $value) { - if (!isset($data[$key])) { - $data[$key] = $value; - } - } - } else { - if (isset($values['value']) && $values['value'] !== '') { - $value = $values['value']; - } else { - $value = $this->getNextEmbedBlock(); - } - $c = $this->getRealCurrentLineNb() + 1; - $parser = new Parser($c); - $parser->refs =& $this->refs; - $parsed = $parser->parse($value, $exceptionOnInvalidType, $objectSupport); - - if (!is_array($parsed)) { - throw new ParseException('YAML merge keys used with a scalar value instead of an array.', $this->getRealCurrentLineNb() + 1, $this->currentLine); - } - - if (isset($parsed[0])) { - // If the value associated with the merge key is a sequence, then this sequence is expected to contain mapping nodes - // and each of these nodes is merged in turn according to its order in the sequence. Keys in mapping nodes earlier - // in the sequence override keys specified in later mapping nodes. - foreach ($parsed as $parsedItem) { - if (!is_array($parsedItem)) { - throw new ParseException('Merge items must be arrays.', $this->getRealCurrentLineNb() + 1, $parsedItem); - } - - foreach ($parsedItem as $key => $value) { - if (!isset($data[$key])) { - $data[$key] = $value; - } - } - } - } else { - // If the value associated with the key is a single mapping node, each of its key/value pairs is inserted into the - // current mapping, unless the key already exists in it. - foreach ($parsed as $key => $value) { - if (!isset($data[$key])) { - $data[$key] = $value; - } - } - } - } - } elseif (isset($values['value']) && preg_match('#^&(?P[^ ]+) *(?P.*)#u', $values['value'], $matches)) { - $isRef = $matches['ref']; - $values['value'] = $matches['value']; - } - - if ($mergeNode) { - // Merge keys - } elseif (!isset($values['value']) || '' == trim($values['value'], ' ') || 0 === strpos(ltrim($values['value'], ' '), '#')) { - // hash - // if next line is less indented or equal, then it means that the current value is null - if (!$this->isNextLineIndented() && !$this->isNextLineUnIndentedCollection()) { - // Spec: Keys MUST be unique; first one wins. - // But overwriting is allowed when a merge node is used in current block. - if ($allowOverwrite || !isset($data[$key])) { - $data[$key] = null; - } - } else { - $c = $this->getRealCurrentLineNb() + 1; - $parser = new Parser($c); - $parser->refs =& $this->refs; - $value = $parser->parse($this->getNextEmbedBlock(), $exceptionOnInvalidType, $objectSupport); - // Spec: Keys MUST be unique; first one wins. - // But overwriting is allowed when a merge node is used in current block. - if ($allowOverwrite || !isset($data[$key])) { - $data[$key] = $value; - } - } - } else { - $value = $this->parseValue($values['value'], $exceptionOnInvalidType, $objectSupport); - // Spec: Keys MUST be unique; first one wins. - // But overwriting is allowed when a merge node is used in current block. - if ($allowOverwrite || !isset($data[$key])) { - $data[$key] = $value; - } - } - } else { - // 1-liner optionally followed by newline - $lineCount = count($this->lines); - if (1 === $lineCount || (2 === $lineCount && empty($this->lines[1]))) { - try { - $value = Inline::parse($this->lines[0], $exceptionOnInvalidType, $objectSupport); - } catch (ParseException $e) { - $e->setParsedLine($this->getRealCurrentLineNb() + 1); - $e->setSnippet($this->currentLine); - - throw $e; - } - - if (is_array($value)) { - $first = reset($value); - if (is_string($first) && 0 === strpos($first, '*')) { - $data = array(); - foreach ($value as $alias) { - $data[] = $this->refs[substr($alias, 1)]; - } - $value = $data; - } - } - - if (isset($mbEncoding)) { - mb_internal_encoding($mbEncoding); - } - - return $value; - } - - switch (preg_last_error()) { - case PREG_INTERNAL_ERROR: - $error = 'Internal PCRE error.'; - break; - case PREG_BACKTRACK_LIMIT_ERROR: - $error = 'pcre.backtrack_limit reached.'; - break; - case PREG_RECURSION_LIMIT_ERROR: - $error = 'pcre.recursion_limit reached.'; - break; - case PREG_BAD_UTF8_ERROR: - $error = 'Malformed UTF-8 data.'; - break; - case PREG_BAD_UTF8_OFFSET_ERROR: - $error = 'Offset doesn\'t correspond to the begin of a valid UTF-8 code point.'; - break; - default: - $error = 'Unable to parse.'; - } - - throw new ParseException($error, $this->getRealCurrentLineNb() + 1, $this->currentLine); - } - - if ($isRef) { - $this->refs[$isRef] = end($data); - } - } - - if (isset($mbEncoding)) { - mb_internal_encoding($mbEncoding); - } - - return empty($data) ? null : $data; - } - - /** - * Returns the current line number (takes the offset into account). - * - * @return int The current line number - */ - private function getRealCurrentLineNb() - { - return $this->currentLineNb + $this->offset; - } - - /** - * Returns the current line indentation. - * - * @return int The current line indentation - */ - private function getCurrentLineIndentation() - { - return strlen($this->currentLine) - strlen(ltrim($this->currentLine, ' ')); - } - - /** - * Returns the next embed block of YAML. - * - * @param int $indentation The indent level at which the block is to be read, or null for default - * - * @return string A YAML string - * - * @throws ParseException When indentation problem are detected - */ - private function getNextEmbedBlock($indentation = null) - { - $this->moveToNextLine(); - - if (null === $indentation) { - $newIndent = $this->getCurrentLineIndentation(); - - $unindentedEmbedBlock = $this->isStringUnIndentedCollectionItem($this->currentLine); - - if (!$this->isCurrentLineEmpty() && 0 === $newIndent && !$unindentedEmbedBlock) { - throw new ParseException('Indentation problem.', $this->getRealCurrentLineNb() + 1, $this->currentLine); - } - } else { - $newIndent = $indentation; - } - - $data = array(substr($this->currentLine, $newIndent)); - - $isItUnindentedCollection = $this->isStringUnIndentedCollectionItem($this->currentLine); - - // Comments must not be removed inside a string block (ie. after a line ending with "|") - $removeCommentsPattern = '~'.self::FOLDED_SCALAR_PATTERN.'$~'; - $removeComments = !preg_match($removeCommentsPattern, $this->currentLine); - - while ($this->moveToNextLine()) { - $indent = $this->getCurrentLineIndentation(); - - if ($indent === $newIndent) { - $removeComments = !preg_match($removeCommentsPattern, $this->currentLine); - } - - if ($isItUnindentedCollection && !$this->isStringUnIndentedCollectionItem($this->currentLine)) { - $this->moveToPreviousLine(); - break; - } - - if ($this->isCurrentLineBlank()) { - $data[] = substr($this->currentLine, $newIndent); - continue; - } - - if ($removeComments && $this->isCurrentLineComment()) { - continue; - } - - if ($indent >= $newIndent) { - $data[] = substr($this->currentLine, $newIndent); - } elseif (0 == $indent) { - $this->moveToPreviousLine(); - - break; - } else { - throw new ParseException('Indentation problem.', $this->getRealCurrentLineNb() + 1, $this->currentLine); - } - } - - return implode("\n", $data); - } - - /** - * Moves the parser to the next line. - * - * @return bool - */ - private function moveToNextLine() - { - if ($this->currentLineNb >= count($this->lines) - 1) { - return false; - } - - $this->currentLine = $this->lines[++$this->currentLineNb]; - - return true; - } - - /** - * Moves the parser to the previous line. - */ - private function moveToPreviousLine() - { - $this->currentLine = $this->lines[--$this->currentLineNb]; - } - - /** - * Parses a YAML value. - * - * @param string $value A YAML value - * @param bool $exceptionOnInvalidType True if an exception must be thrown on invalid types false otherwise - * @param bool $objectSupport True if object support is enabled, false otherwise - * - * @return mixed A PHP value - * - * @throws ParseException When reference does not exist - */ - private function parseValue($value, $exceptionOnInvalidType, $objectSupport) - { - if (0 === strpos($value, '*')) { - if (false !== $pos = strpos($value, '#')) { - $value = substr($value, 1, $pos - 2); - } else { - $value = substr($value, 1); - } - - if (!array_key_exists($value, $this->refs)) { - throw new ParseException(sprintf('Reference "%s" does not exist.', $value), $this->currentLine); - } - - return $this->refs[$value]; - } - - if (preg_match('/^'.self::FOLDED_SCALAR_PATTERN.'$/', $value, $matches)) { - $modifiers = isset($matches['modifiers']) ? $matches['modifiers'] : ''; - - return $this->parseFoldedScalar($matches['separator'], preg_replace('#\d+#', '', $modifiers), intval(abs($modifiers))); - } - - try { - return Inline::parse($value, $exceptionOnInvalidType, $objectSupport); - } catch (ParseException $e) { - $e->setParsedLine($this->getRealCurrentLineNb() + 1); - $e->setSnippet($this->currentLine); - - throw $e; - } - } - - /** - * Parses a folded scalar. - * - * @param string $separator The separator that was used to begin this folded scalar (| or >) - * @param string $indicator The indicator that was used to begin this folded scalar (+ or -) - * @param int $indentation The indentation that was used to begin this folded scalar - * - * @return string The text value - */ - private function parseFoldedScalar($separator, $indicator = '', $indentation = 0) - { - $notEOF = $this->moveToNextLine(); - if (!$notEOF) { - return ''; - } - - $isCurrentLineBlank = $this->isCurrentLineBlank(); - $text = ''; - - // leading blank lines are consumed before determining indentation - while ($notEOF && $isCurrentLineBlank) { - // newline only if not EOF - if ($notEOF = $this->moveToNextLine()) { - $text .= "\n"; - $isCurrentLineBlank = $this->isCurrentLineBlank(); - } - } - - // determine indentation if not specified - if (0 === $indentation) { - if (preg_match('/^ +/', $this->currentLine, $matches)) { - $indentation = strlen($matches[0]); - } - } - - if ($indentation > 0) { - $pattern = sprintf('/^ {%d}(.*)$/', $indentation); - - while ( - $notEOF && ( - $isCurrentLineBlank || - preg_match($pattern, $this->currentLine, $matches) - ) - ) { - if ($isCurrentLineBlank) { - $text .= substr($this->currentLine, $indentation); - } else { - $text .= $matches[1]; - } - - // newline only if not EOF - if ($notEOF = $this->moveToNextLine()) { - $text .= "\n"; - $isCurrentLineBlank = $this->isCurrentLineBlank(); - } - } - } elseif ($notEOF) { - $text .= "\n"; - } - - if ($notEOF) { - $this->moveToPreviousLine(); - } - - // replace all non-trailing single newlines with spaces in folded blocks - if ('>' === $separator) { - preg_match('/(\n*)$/', $text, $matches); - $text = preg_replace('/(?getCurrentLineIndentation(); - $EOF = !$this->moveToNextLine(); - - while (!$EOF && $this->isCurrentLineEmpty()) { - $EOF = !$this->moveToNextLine(); - } - - if ($EOF) { - return false; - } - - $ret = false; - if ($this->getCurrentLineIndentation() > $currentIndentation) { - $ret = true; - } - - $this->moveToPreviousLine(); - - return $ret; - } - - /** - * Returns true if the current line is blank or if it is a comment line. - * - * @return bool Returns true if the current line is empty or if it is a comment line, false otherwise - */ - private function isCurrentLineEmpty() - { - return $this->isCurrentLineBlank() || $this->isCurrentLineComment(); - } - - /** - * Returns true if the current line is blank. - * - * @return bool Returns true if the current line is blank, false otherwise - */ - private function isCurrentLineBlank() - { - return '' == trim($this->currentLine, ' '); - } - - /** - * Returns true if the current line is a comment line. - * - * @return bool Returns true if the current line is a comment line, false otherwise - */ - private function isCurrentLineComment() - { - //checking explicitly the first char of the trim is faster than loops or strpos - $ltrimmedLine = ltrim($this->currentLine, ' '); - - return $ltrimmedLine[0] === '#'; - } - - /** - * Cleanups a YAML string to be parsed. - * - * @param string $value The input YAML string - * - * @return string A cleaned up YAML string - */ - private function cleanup($value) - { - $value = str_replace(array("\r\n", "\r"), "\n", $value); - - // strip YAML header - $count = 0; - $value = preg_replace('#^\%YAML[: ][\d\.]+.*\n#su', '', $value, -1, $count); - $this->offset += $count; - - // remove leading comments - $trimmedValue = preg_replace('#^(\#.*?\n)+#s', '', $value, -1, $count); - if ($count == 1) { - // items have been removed, update the offset - $this->offset += substr_count($value, "\n") - substr_count($trimmedValue, "\n"); - $value = $trimmedValue; - } - - // remove start of the document marker (---) - $trimmedValue = preg_replace('#^\-\-\-.*?\n#s', '', $value, -1, $count); - if ($count == 1) { - // items have been removed, update the offset - $this->offset += substr_count($value, "\n") - substr_count($trimmedValue, "\n"); - $value = $trimmedValue; - - // remove end of the document marker (...) - $value = preg_replace('#\.\.\.\s*$#s', '', $value); - } - - return $value; - } - - /** - * Returns true if the next line starts unindented collection - * - * @return bool Returns true if the next line starts unindented collection, false otherwise - */ - private function isNextLineUnIndentedCollection() - { - $currentIndentation = $this->getCurrentLineIndentation(); - $notEOF = $this->moveToNextLine(); - - while ($notEOF && $this->isCurrentLineEmpty()) { - $notEOF = $this->moveToNextLine(); - } - - if (false === $notEOF) { - return false; - } - - $ret = false; - if ( - $this->getCurrentLineIndentation() == $currentIndentation - && - $this->isStringUnIndentedCollectionItem($this->currentLine) - ) { - $ret = true; - } - - $this->moveToPreviousLine(); - - return $ret; - } - - /** - * Returns true if the string is un-indented collection item - * - * @return bool Returns true if the string is un-indented collection item, false otherwise - */ - private function isStringUnIndentedCollectionItem() - { - return (0 === strpos($this->currentLine, '- ')); - } - -} diff --git a/vendor/symfony/yaml/Symfony/Component/Yaml/README.md b/vendor/symfony/yaml/Symfony/Component/Yaml/README.md deleted file mode 100644 index 941a3460e..000000000 --- a/vendor/symfony/yaml/Symfony/Component/Yaml/README.md +++ /dev/null @@ -1,19 +0,0 @@ -Yaml Component -============== - -YAML implements most of the YAML 1.2 specification. - - use Symfony\Component\Yaml\Yaml; - - $array = Yaml::parse($file); - - print Yaml::dump($array); - -Resources ---------- - -You can run the unit tests with the following command: - - $ cd path/to/Symfony/Component/Yaml/ - $ composer.phar install - $ phpunit diff --git a/vendor/symfony/yaml/Symfony/Component/Yaml/Unescaper.php b/vendor/symfony/yaml/Symfony/Component/Yaml/Unescaper.php deleted file mode 100644 index b47d4a592..000000000 --- a/vendor/symfony/yaml/Symfony/Component/Yaml/Unescaper.php +++ /dev/null @@ -1,141 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Yaml; - -/** - * Unescaper encapsulates unescaping rules for single and double-quoted - * YAML strings. - * - * @author Matthew Lewinski - */ -class Unescaper -{ - // Parser and Inline assume UTF-8 encoding, so escaped Unicode characters - // must be converted to that encoding. - // @deprecated since 2.5, to be removed in 3.0 - const ENCODING = 'UTF-8'; - - // Regex fragment that matches an escaped character in a double quoted - // string. - const REGEX_ESCAPED_CHARACTER = "\\\\([0abt\tnvfre \\\"\\/\\\\N_LP]|x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8})"; - - /** - * Unescapes a single quoted string. - * - * @param string $value A single quoted string. - * - * @return string The unescaped string. - */ - public function unescapeSingleQuotedString($value) - { - return str_replace('\'\'', '\'', $value); - } - - /** - * Unescapes a double quoted string. - * - * @param string $value A double quoted string. - * - * @return string The unescaped string. - */ - public function unescapeDoubleQuotedString($value) - { - $self = $this; - $callback = function ($match) use ($self) { - return $self->unescapeCharacter($match[0]); - }; - - // evaluate the string - return preg_replace_callback('/'.self::REGEX_ESCAPED_CHARACTER.'/u', $callback, $value); - } - - /** - * Unescapes a character that was found in a double-quoted string - * - * @param string $value An escaped character - * - * @return string The unescaped character - */ - public function unescapeCharacter($value) - { - switch ($value{1}) { - case '0': - return "\x0"; - case 'a': - return "\x7"; - case 'b': - return "\x8"; - case 't': - return "\t"; - case "\t": - return "\t"; - case 'n': - return "\n"; - case 'v': - return "\xB"; - case 'f': - return "\xC"; - case 'r': - return "\r"; - case 'e': - return "\x1B"; - case ' ': - return ' '; - case '"': - return '"'; - case '/': - return '/'; - case '\\': - return '\\'; - case 'N': - // U+0085 NEXT LINE - return "\xC2\x85"; - case '_': - // U+00A0 NO-BREAK SPACE - return "\xC2\xA0"; - case 'L': - // U+2028 LINE SEPARATOR - return "\xE2\x80\xA8"; - case 'P': - // U+2029 PARAGRAPH SEPARATOR - return "\xE2\x80\xA9"; - case 'x': - return self::utf8chr(hexdec(substr($value, 2, 2))); - case 'u': - return self::utf8chr(hexdec(substr($value, 2, 4))); - case 'U': - return self::utf8chr(hexdec(substr($value, 2, 8))); - } - } - - /** - * Get the UTF-8 character for the given code point. - * - * @param int $c The unicode code point - * - * @return string The corresponding UTF-8 character - */ - private static function utf8chr($c) - { - if (0x80 > $c %= 0x200000) { - return chr($c); - } - if (0x800 > $c) { - return chr(0xC0 | $c>>6).chr(0x80 | $c & 0x3F); - } - if (0x10000 > $c) { - return chr(0xE0 | $c>>12).chr(0x80 | $c>>6 & 0x3F).chr(0x80 | $c & 0x3F); - } - - return chr(0xF0 | $c>>18).chr(0x80 | $c>>12 & 0x3F).chr(0x80 | $c>>6 & 0x3F).chr(0x80 | $c & 0x3F); - } -} diff --git a/vendor/symfony/yaml/Symfony/Component/Yaml/Yaml.php b/vendor/symfony/yaml/Symfony/Component/Yaml/Yaml.php deleted file mode 100644 index 61793fb3a..000000000 --- a/vendor/symfony/yaml/Symfony/Component/Yaml/Yaml.php +++ /dev/null @@ -1,100 +0,0 @@ - - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -namespace Symfony\Component\Yaml; - -use Symfony\Component\Yaml\Exception\ParseException; - -/** - * Yaml offers convenience methods to load and dump YAML. - * - * @author Fabien Potencier - * - * @api - */ -class Yaml -{ - /** - * Parses YAML into a PHP array. - * - * The parse method, when supplied with a YAML stream (string or file), - * will do its best to convert YAML in a file into a PHP array. - * - * Usage: - * - * $array = Yaml::parse('config.yml'); - * print_r($array); - * - * - * As this method accepts both plain strings and file names as an input, - * you must validate the input before calling this method. Passing a file - * as an input is a deprecated feature and will be removed in 3.0. - * - * @param string $input Path to a YAML file or a string containing YAML - * @param bool $exceptionOnInvalidType True if an exception must be thrown on invalid types false otherwise - * @param bool $objectSupport True if object support is enabled, false otherwise - * - * @return array The YAML converted to a PHP array - * - * @throws ParseException If the YAML is not valid - * - * @api - */ - public static function parse($input, $exceptionOnInvalidType = false, $objectSupport = false) - { - // if input is a file, process it - $file = ''; - if (strpos($input, "\n") === false && is_file($input)) { - if (false === is_readable($input)) { - throw new ParseException(sprintf('Unable to parse "%s" as the file is not readable.', $input)); - } - - $file = $input; - $input = file_get_contents($file); - } - - $yaml = new Parser(); - - try { - return $yaml->parse($input, $exceptionOnInvalidType, $objectSupport); - } catch (ParseException $e) { - if ($file) { - $e->setParsedFile($file); - } - - throw $e; - } - } - - /** - * Dumps a PHP array to a YAML string. - * - * The dump method, when supplied with an array, will do its best - * to convert the array into friendly YAML. - * - * @param array $array PHP array - * @param int $inline The level where you switch to inline YAML - * @param int $indent The amount of spaces to use for indentation of nested nodes. - * @param bool $exceptionOnInvalidType true if an exception must be thrown on invalid types (a PHP resource or object), false otherwise - * @param bool $objectSupport true if object support is enabled, false otherwise - * - * @return string A YAML string representing the original PHP array - * - * @api - */ - public static function dump($array, $inline = 2, $indent = 4, $exceptionOnInvalidType = false, $objectSupport = false) - { - $yaml = new Dumper(); - $yaml->setIndentation($indent); - - return $yaml->dump($array, $inline, 0, $exceptionOnInvalidType, $objectSupport); - } -} diff --git a/vendor/tracy/tracy/license.md b/vendor/tracy/tracy/license.md deleted file mode 100644 index 31f0a80c7..000000000 --- a/vendor/tracy/tracy/license.md +++ /dev/null @@ -1,55 +0,0 @@ -Licenses -======== - -Good news! You may use Tracy under the terms of either the New BSD License -or the GNU General Public License (GPL) version 2 or 3. - -The BSD License is recommended for most projects. It is easy to understand and it -places almost no restrictions on what you can do with the framework. If the GPL -fits better to your project, you can use the framework under this license. - -You don't have to notify anyone which license you are using. You can freely -use Tracy in commercial projects as long as the copyright header -remains intact. - - -New BSD License ---------------- - -Copyright (c) 2004, 2014 David Grudl (http://davidgrudl.com) -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of "Tracy" nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -This software is provided by the copyright holders and contributors "as is" and -any express or implied warranties, including, but not limited to, the implied -warranties of merchantability and fitness for a particular purpose are -disclaimed. In no event shall the copyright owner or contributors be liable for -any direct, indirect, incidental, special, exemplary, or consequential damages -(including, but not limited to, procurement of substitute goods or services; -loss of use, data, or profits; or business interruption) however caused and on -any theory of liability, whether in contract, strict liability, or tort -(including negligence or otherwise) arising in any way out of the use of this -software, even if advised of the possibility of such damage. - - -GNU General Public License --------------------------- - -GPL licenses are very very long, so instead of including them here we offer -you URLs with full text: - -- [GPL version 2](http://www.gnu.org/licenses/gpl-2.0.html) -- [GPL version 3](http://www.gnu.org/licenses/gpl-3.0.html) diff --git a/vendor/tracy/tracy/readme.md b/vendor/tracy/tracy/readme.md deleted file mode 100644 index 1564d592a..000000000 --- a/vendor/tracy/tracy/readme.md +++ /dev/null @@ -1,226 +0,0 @@ -[Tracy](http://tracy.nette.org) - PHP debugger -============================================== - -[![Downloads this Month](https://img.shields.io/packagist/dm/tracy/tracy.svg)](https://packagist.org/packages/tracy/tracy) -[![Build Status](https://travis-ci.org/nette/tracy.svg?branch=v2.2)](https://travis-ci.org/nette/tracy) - -Tracy library is a useful PHP everyday programmer's helper. It helps you to: - -- quickly detect and correct errors -- log errors -- dump variables -- measure the time - - -PHP is a perfect language for making hardly detectable errors because it gives a great flexibility to programmers. Tracy\Debugger is more valuable because of that. It is a ultimate tool among the diagnostic ones. -If you are meeting Tracy the first time, believe me, your life starts to be divided one before the Tracy and the one with her. -Welcome to the good part! - -The best way how to install Tracy is to [download a latest package](https://github.com/nette/tracy/releases) or use a Composer: - -``` -php composer.phar require tracy/tracy -``` - -It is easy to activate Tracy. Preferably immediately after library loading (using `require 'src/tracy.php'` or via Composer) add code: - -```php -use Tracy\Debugger; - -Debugger::enable(); -``` - -The first thing you notice on the web site is a Debugger Bar. - - -Debugger Bar ------------- - -The Debugger Bar is a floating panel. It is displayed in the bottom right corner of a page. You can move it by the mouse. It will remember its position after the page reloading. - -![Debugger-Bar](http://nette.github.io/tracy/images/tracy-bar.png) - -You can add other useful panels into the Debugger Bar. - - -Visualization of errors and exceptions --------------------------------------- - -Surely, you know how PHP reports errors: there is something like this in the page source code: - -```pre -Parse error: syntax error, unexpected T_STRING in SignPresenter.php on line 6 -``` - -or uncaught exception: - -```pre -Fatal error: Uncaught exception 'Nette\Security\AuthenticationException' with message 'The password is incorrect.' in W:\examples\CD-collection\app\model\Authenticator.php:38 -Stack trace: -#0 W:\Nette\Security\User.php(87): Authenticator->authenticate(Array) -#1 W:\examples\CD-collection\app\presenters\SignPresenter.php(36): Nette\Security\User->login('demo', 'xx') -#2 [internal function]: SignPresenter->signInFormSucceeded(Object(Nette\Application\UI\Form)) -#3 W:\Nette\Utils\Callback.php(38): call_user_func_array(Array, Array) -#4 [internal function]: Nette\Utils\{closure}(Object(Nette\Application\UI\Form)) -#5 W:\Nette\Utils\Callback.php(50): call_user_func_array(Object(Closure), Array) -#6 W:\Nette\Forms\Form.php(412): Nette\Utils\Callback::invoke(Object(Closure), Object(Nette\Application\UI\Form)) -#7 W:\Nette\Application\UI\Form.php(129): Nette\Forms\Form->fireEvents() -#8 W:\Nette\Application\UI\Presenter.php(320): Nette\Application\UI in W:\examples\CD-collection\app\model\Authenticator.php on line 38
-``` - -It is not so easy to navigate throw this output. If you enable the Tracy, errors or exceptions are displayed completely in a different form: - -[![Uncaught exception rendered by Tracy](http://nette.github.io/tracy/images/tracy-exception.png)](http://nette.github.io/tracy/tracy-exception.html) - -The error message literally screams. You can see a part of the source code with the highlighted line where the error occurred. A message clearly explains an error. The entire site is [interactive, try it](http://nette.github.io/tracy/tracy-exception.html). - -And you know what? A fatal errors are captured and displayed in the same way. No need to install any extension (click for live example): - -[![Fatal error rendered by Tracy](http://nette.github.io/tracy/images/tracy-error.png)](http://nette.github.io/tracy/tracy-error.html) - -Errors like a typo in a variable name or an attempt to open a nonexistent file generate reports of E_NOTICE or E_WARNING level. These can be easily overlooked and/or can be completly hidden in a web page graphic layout. Let Tracy to manage them: - -![Notice rendered by Tracy](http://nette.github.io/tracy/images/tracy-notice2.png) - -Or they may be displayed like errors: - -```php -Debugger::$strictMode = TRUE; -``` - -[![Notice rendered by Tracy](http://nette.github.io/tracy/images/tracy-notice.png)](http://nette.github.io/tracy/tracy-notice.html) - - -Production mode and error logging ---------------------------------- - -As you can see, Tracy is quite eloquent. It is appreciated in a development environment, but on a production server it would cause disaster. There cannot be listed any debugging information. Therefore Tracy has an environment autodetection and logging functionality. Instead of showing self, Tracy stores information into log file and shows a server error with user-comprehensible message to visitor: - -![Server Error 500](http://nette.github.io/tracy/images/tracy-error2.png) - -An output mode suppresses all debugging information which are sent out via `Debugger::dump()` or `Debugger::fireLog()`, and of course all error messages generated by PHP. So, if you forget `Debugger::dump($obj)` in the source code, you do not have to worry about it on a production server. Nothing will be listed. - -The output mode is switched by the first parameter of `Debugger::enable()`. You can specify either a constant `Debugger::PRODUCTION` or `Debugger::DEVELOPMENT`. - -If it is not specified, the default value `Debugger::DETECT` is used. In this case the system detects a server by IP address. The production mode is choosed if an application is accessed via public IP address. A local IP address leads to development mode. It is not necessary to set the mode in most cases. The mode is correctly recognized when you are launching the application on your local server or in production. - -In the production mode, Tracy automatically capture all errors and exceptions into a text log. Unless you specify otherwise, it will be a set of log/error.log. This error logging is extremely useful. Imagine, that all users of your application are actually betatesters. They are doing cutting-edge work for free when hunting bugs and you would be silly if you threw away their valuable reports to a recycle bin unnoticed. - -If you need a own messages logging or you caught an exception, use the method `log()`: - -```php -Debugger::log('Unexpected error'); // text message - -try { - criticalOperation(); -} catch (Exception $e) { - Debugger::log($e); // log exception - // or - Debugger::log($e, Debugger::ERROR) // sends also an email notification -} -``` - -A directory for errors logging can be set by the second parameter of enable() method: - -```php -Debugger::enable(Debugger::DETECT, __DIR__ . '/mylog'); -``` - -For a real professional is the error log a key source of information and he wants to be noticed about any new error immediately. Tracy helps him. She is capable to send an email on every new error record. The variable $email identify where to send the e-mails: - -```php -Debugger::$email = 'admin@example.com'; -``` - -To protect your e-mail box from flood, Tracy sends **the only one message** and creates a file `email-sent`. When developer receives an e-mail notification, he checks the log, corrects application and deletes the monitoring file. It activates the e-mails sending back. - - -Variables dumping ------------------ - -Each debugging developer is a good friend with the function `var_dump` which lists a content of a variable in detail. Unfortunately, the output is without HTML formatting and decants dump into a single line of HTML code. Not to mention an context escaping. It is necessary replace the `var_dump` by a handier function. That is just `Debugger::dump()`. - -```php -$arr = array(10, 20.2, TRUE, NULL, 'hello'); - -Debugger::dump($arr); -// including namespace Tracy\Debugger::dump($arr); -``` - -generates the output: - -![dump](http://nette.github.io/tracy/images/tracy-dump.png) - -You can also change the nesting depth by `Debugger::$maxDepth` and displayed strings length by `Debugger::$maxLen`. Naturally, lower values accelerates Tracy rendering. - -```php -Debugger::$maxDepth = 2; // default: 3 -Debugger::$maxLen = 50; // default: 150 -``` - -Timing ------- - -An another useful tool is a debugger stopwatch with a precision of microseconds: - -```php -Debugger::timer(); - -// sweet dreams my cherrie -sleep(2); - -$elapsed = Debugger::timer(); -// $elapsed = 2 -``` - -Multiple measurements can be achieved by an optional parameter. - -```php -Debugger::timer('page-generating'); -// some code - -Debugger::timer('rss-generating'); -// some code - -$rssElapsed = Debugger::timer('rss-generating'); -$pageElapsed = Debugger::timer('page-generating'); -``` - -```php -Debugger::timer(); // runs the timer - -... // some difficult operation - -echo Debugger::timer(); // elapsed time in seconds -``` - - -Firebug and FireLogger ----------------------- - -You cannot send debugging information to the browser window always. This applies to Ajax requests, or generating XML files to output. In such cases, you can send the messages by a separate channel into Firebug. Error, Notice and Warning levels are sent to Firebug window automatically. It is also possible to log suppressed exceptions in running application when attention to them is important. - -How to do it? - -- download and run Firefox browser -- download extension [Firebug](http://www.getfirebug.com) -- download extension [FireLogger](http://firelogger.binaryage.com) -- restart browser, turn on Firebug (key F12) and enable network (Net) and Logger panels - -... Open our utility panel and click on the Console. Ha!, error message has been moved there. - -Because the Tracy\Debugger communicates with Firebug via an HTTP headers, you must call the logging function before the PHP script sends anything to the output. It is also possible to enable the output buffering and delay the output. - -```php -use Tracy\Debugger; - -Debugger::fireLog('Hello World'); // render string into Firebug console - -Debugger::fireLog($_SERVER); // or even arrays and objects - -Debugger::fireLog(new Exception('Test Exception')); // or exceptions -``` - -The result looks like this: - -![FireLogger](http://nette.github.io/tracy/images/firelogger.png) diff --git a/vendor/tracy/tracy/src/Tracy/Bar.php b/vendor/tracy/tracy/src/Tracy/Bar.php deleted file mode 100644 index b9788b49a..000000000 --- a/vendor/tracy/tracy/src/Tracy/Bar.php +++ /dev/null @@ -1,112 +0,0 @@ -panels[$id])); - } - $this->panels[$id] = $panel; - return $this; - } - - - /** - * Returns panel with given id - * @param string - * @return IBarPanel|NULL - */ - public function getPanel($id) - { - return isset($this->panels[$id]) ? $this->panels[$id] : NULL; - } - - - /** - * Renders debug bar. - * @return void - */ - public function render() - { - $obLevel = ob_get_level(); - $panels = array(); - foreach ($this->panels as $id => $panel) { - $idHtml = preg_replace('#[^a-z0-9]+#i', '-', $id); - try { - $tab = (string) $panel->getTab(); - $panelHtml = $tab ? (string) $panel->getPanel() : NULL; - if ($tab && $panel instanceof \Nette\Diagnostics\IBarPanel) { - $panelHtml = preg_replace('~(["\'.\s#])nette-(debug|inner|collapsed|toggle|toggle-collapsed)(["\'\s])~', '$1tracy-$2$3', $panelHtml); - $panelHtml = str_replace('tracy-toggle-collapsed', 'tracy-toggle tracy-collapsed', $panelHtml); - } - $panels[] = array('id' => $idHtml, 'tab' => $tab, 'panel' => $panelHtml); - - } catch (\Exception $e) { - $panels[] = array( - 'id' => "error-$idHtml", - 'tab' => "Error in $id", - 'panel' => '

Error: ' . $id . '

' . nl2br(htmlSpecialChars($e, ENT_IGNORE)) . '
', - ); - while (ob_get_level() > $obLevel) { // restore ob-level if broken - ob_end_clean(); - } - } - } - - @session_start(); - $session = & $_SESSION['__NF']['debuggerbar']; - if (preg_match('#^Location:#im', implode("\n", headers_list()))) { - $session[] = $panels; - return; - } - - foreach (array_reverse((array) $session) as $reqId => $oldpanels) { - $panels[] = array( - 'tab' => 'previous', - 'panel' => NULL, - 'previous' => TRUE, - ); - foreach ($oldpanels as $panel) { - $panel['id'] .= '-' . $reqId; - $panels[] = $panel; - } - } - $session = NULL; - - $info = array_filter($this->info); - require __DIR__ . '/templates/bar.phtml'; - } - -} diff --git a/vendor/tracy/tracy/src/Tracy/BlueScreen.php b/vendor/tracy/tracy/src/Tracy/BlueScreen.php deleted file mode 100644 index 907bb6952..000000000 --- a/vendor/tracy/tracy/src/Tracy/BlueScreen.php +++ /dev/null @@ -1,172 +0,0 @@ -panels, TRUE)) { - $this->panels[] = $panel; - } - return $this; - } - - - /** - * Renders blue screen. - * @param \Exception - * @return void - */ - public function render(\Exception $exception) - { - $panels = $this->panels; - $info = array_filter($this->info); - require __DIR__ . '/templates/bluescreen.phtml'; - } - - - /** - * Returns syntax highlighted source code. - * @param string - * @param int - * @param int - * @return string - */ - public static function highlightFile($file, $line, $lines = 15, array $vars = NULL) - { - $source = @file_get_contents($file); // intentionally @ - if ($source) { - $source = static::highlightPhp($source, $line, $lines, $vars); - if ($editor = Helpers::editorUri($file, $line)) { - $source = substr_replace($source, ' data-tracy-href="' . htmlspecialchars($editor) . '"', 4, 0); - } - return $source; - } - } - - - /** - * Returns syntax highlighted source code. - * @param string - * @param int - * @param int - * @return string - */ - public static function highlightPhp($source, $line, $lines = 15, array $vars = NULL) - { - if (function_exists('ini_set')) { - ini_set('highlight.comment', '#998; font-style: italic'); - ini_set('highlight.default', '#000'); - ini_set('highlight.html', '#06B'); - ini_set('highlight.keyword', '#D24; font-weight: bold'); - ini_set('highlight.string', '#080'); - } - - $source = str_replace(array("\r\n", "\r"), "\n", $source); - $source = explode("\n", highlight_string($source, TRUE)); - $out = $source[0]; // - $source = str_replace('
', "\n", $source[1]); - $out .= static::highlightLine($source, $line, $lines); - - if ($vars) { - $out = preg_replace_callback('#">\$(\w+)( )?
#', function($m) use ($vars) { - return array_key_exists($m[1], $vars) - ? '" title="' . str_replace('"', '"', trim(strip_tags(Dumper::toHtml($vars[$m[1]])))) . $m[0] - : $m[0]; - }, $out); - } - - return "
$out
"; - } - - - - /** - * Returns highlighted line in HTML code. - * @return string - */ - public static function highlightLine($html, $line, $lines = 15) - { - $source = explode("\n", "\n" . str_replace("\r\n", "\n", $html)); - $out = ''; - $spans = 1; - $start = $i = max(1, $line - floor($lines * 2/3)); - while (--$i >= 1) { // find last highlighted block - if (preg_match('#.*(]*>)#', $source[$i], $m)) { - if ($m[1] !== '') { - $spans++; - $out .= $m[1]; - } - break; - } - } - - $source = array_slice($source, $start, $lines, TRUE); - end($source); - $numWidth = strlen((string) key($source)); - - foreach ($source as $n => $s) { - $spans += substr_count($s, ']+>#', $s, $tags); - if ($n == $line) { - $out .= sprintf( - "%{$numWidth}s: %s\n%s", - $n, - strip_tags($s), - implode('', $tags[0]) - ); - } else { - $out .= sprintf("%{$numWidth}s: %s\n", $n, $s); - } - } - $out .= str_repeat('', $spans) . '
'; - return $out; - } - - - /** - * Should a file be collapsed in stack trace? - * @param string - * @return bool - */ - public function isCollapsed($file) - { - foreach ($this->collapsePaths as $path) { - if (strpos(strtr($file, '\\', '/'), strtr("$path/", '\\', '/')) === 0) { - return TRUE; - } - } - return FALSE; - } - -} diff --git a/vendor/tracy/tracy/src/Tracy/Debugger.php b/vendor/tracy/tracy/src/Tracy/Debugger.php deleted file mode 100644 index fc6247eeb..000000000 --- a/vendor/tracy/tracy/src/Tracy/Debugger.php +++ /dev/null @@ -1,598 +0,0 @@ - 'Fatal Error', - E_USER_ERROR => 'User Error', - E_RECOVERABLE_ERROR => 'Recoverable Error', - E_CORE_ERROR => 'Core Error', - E_COMPILE_ERROR => 'Compile Error', - E_PARSE => 'Parse Error', - E_WARNING => 'Warning', - E_CORE_WARNING => 'Core Warning', - E_COMPILE_WARNING => 'Compile Warning', - E_USER_WARNING => 'User Warning', - E_NOTICE => 'Notice', - E_USER_NOTICE => 'User Notice', - E_STRICT => 'Strict standards', - E_DEPRECATED => 'Deprecated', - E_USER_DEPRECATED => 'User Deprecated', - ); - - /********************* logging ****************d*g**/ - - /** @var Logger */ - private static $logger; - - /** @var FireLogger */ - private static $fireLogger; - - /** @var string name of the directory where errors should be logged */ - public static $logDirectory; - - /** @var int log bluescreen in production mode for this error severity */ - public static $logSeverity = 0; - - /** @var string|array email(s) to which send error notifications */ - public static $email; - - /** @deprecated */ - public static $mailer = array('Tracy\Logger', 'defaultMailer'); - - /** @deprecated */ - public static $emailSnooze = 172800; - - /** {@link Debugger::log()} and {@link Debugger::fireLog()} */ - const DEBUG = 'debug', - INFO = 'info', - WARNING = 'warning', - ERROR = 'error', - EXCEPTION = 'exception', - CRITICAL = 'critical'; - - /********************* debug bar ****************d*g**/ - - /** @var Bar */ - private static $bar; - - - /** - * Static class - cannot be instantiated. - */ - final public function __construct() - { - throw new \LogicException; - } - - - /** - * Enables displaying or logging errors and exceptions. - * @param mixed production, development mode, autodetection or IP address(es) whitelist. - * @param string error log directory; enables logging in production mode, FALSE means that logging is disabled - * @param string administrator email; enables email sending in production mode - * @return void - */ - public static function enable($mode = NULL, $logDirectory = NULL, $email = NULL) - { - self::$enabled = TRUE; - self::$time = isset($_SERVER['REQUEST_TIME_FLOAT']) ? $_SERVER['REQUEST_TIME_FLOAT'] : microtime(TRUE); - if (isset($_SERVER['REQUEST_URI'])) { - self::$source = (!empty($_SERVER['HTTPS']) && strcasecmp($_SERVER['HTTPS'], 'off') ? 'https://' : 'http://') - . (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '') - . $_SERVER['REQUEST_URI']; - } else { - self::$source = empty($_SERVER['argv']) ? 'CLI' : 'CLI: ' . implode(' ', $_SERVER['argv']); - } - error_reporting(E_ALL | E_STRICT); - - // production/development mode detection - if (is_bool($mode)) { - self::$productionMode = $mode; - - } elseif ($mode !== self::DETECT || self::$productionMode === NULL) { // IP addresses or computer names whitelist detection - $list = is_string($mode) ? preg_split('#[,\s]+#', $mode) : (array) $mode; - if (!isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { - $list[] = '127.0.0.1'; - $list[] = '::1'; - } - self::$productionMode = !in_array(isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : php_uname('n'), $list, TRUE); - } - - // logging configuration - if ($email !== NULL) { - self::$email = $email; - } - if (is_string($logDirectory)) { - self::$logDirectory = realpath($logDirectory); - if (self::$logDirectory === FALSE) { - self::_exceptionHandler(new \RuntimeException("Log directory is not found or is not directory.")); - } - } elseif ($logDirectory === FALSE) { - self::$logDirectory = NULL; - } - if (self::$logDirectory) { - ini_set('error_log', self::$logDirectory . '/php_error.log'); - } - - // php configuration - if (function_exists('ini_set')) { - ini_set('display_errors', !self::$productionMode); // or 'stderr' - ini_set('html_errors', FALSE); - ini_set('log_errors', FALSE); - - } elseif (ini_get('display_errors') != !self::$productionMode && ini_get('display_errors') !== (self::$productionMode ? 'stderr' : 'stdout')) { // intentionally == - self::_exceptionHandler(new \RuntimeException("Unable to set 'display_errors' because function ini_set() is disabled.")); - } - - register_shutdown_function(array(__CLASS__, '_shutdownHandler')); - set_exception_handler(array(__CLASS__, '_exceptionHandler')); - set_error_handler(array(__CLASS__, '_errorHandler')); - - foreach (array('Tracy\Bar', 'Tracy\BlueScreen', 'Tracy\DefaultBarPanel', 'Tracy\Dumper', - 'Tracy\FireLogger', 'Tracy\Helpers', 'Tracy\Logger', ) as $class) { - class_exists($class); - } - } - - - /** - * @return BlueScreen - */ - public static function getBlueScreen() - { - if (!self::$blueScreen) { - self::$blueScreen = new BlueScreen; - self::$blueScreen->info = array( - 'PHP ' . PHP_VERSION, - isset($_SERVER['SERVER_SOFTWARE']) ? $_SERVER['SERVER_SOFTWARE'] : NULL, - 'Tracy ' . self::$version, - ); - } - return self::$blueScreen; - } - - - /** - * @return Bar - */ - public static function getBar() - { - if (!self::$bar) { - self::$bar = new Bar; - self::$bar->addPanel(new DefaultBarPanel('time')); - self::$bar->addPanel(new DefaultBarPanel('memory')); - self::$bar->addPanel(new DefaultBarPanel('errors'), __CLASS__ . ':errors'); // filled by _errorHandler() - self::$bar->addPanel(new DefaultBarPanel('dumps'), __CLASS__ . ':dumps'); // filled by barDump() - self::$bar->info = array( - 'PHP ' . PHP_VERSION, - isset($_SERVER['SERVER_SOFTWARE']) ? $_SERVER['SERVER_SOFTWARE'] : NULL, - 'Tracy ' . self::$version, - ); - } - return self::$bar; - } - - - /** - * @return void - */ - public static function setLogger($logger) - { - self::$logger = $logger; - } - - - /** - * @return Logger - */ - public static function getLogger() - { - if (!self::$logger) { - self::$logger = new Logger; - self::$logger->directory = & self::$logDirectory; - self::$logger->email = & self::$email; - self::$logger->mailer = & self::$mailer; - self::$logger->emailSnooze = & self::$emailSnooze; - } - return self::$logger; - } - - - /** - * @return FireLogger - */ - public static function getFireLogger() - { - if (!self::$fireLogger) { - self::$fireLogger = new FireLogger; - } - return self::$fireLogger; - } - - - /** - * Is Debug enabled? - * @return bool - */ - public static function isEnabled() - { - return self::$enabled; - } - - - /** - * Logs message or exception to file (if not disabled) and sends email notification (if enabled). - * @param string|Exception - * @param int one of constant Debugger::INFO, WARNING, ERROR (sends email), EXCEPTION (sends email), CRITICAL (sends email) - * @return string logged error filename - */ - public static function log($message, $priority = self::INFO) - { - if (!self::$logDirectory) { - return; - } - - $exceptionFilename = NULL; - if ($message instanceof \Exception) { - $exception = $message; - while ($exception) { - $tmp[] = ($exception instanceof ErrorException - ? 'Fatal error: ' . $exception->getMessage() - : get_class($exception) . ': ' . $exception->getMessage()) - . ' in ' . $exception->getFile() . ':' . $exception->getLine(); - $exception = $exception->getPrevious(); - } - $exception = $message; - $message = implode($tmp, "\ncaused by "); - - $hash = md5(preg_replace('~(Resource id #)\d+~', '$1', $exception)); - $exceptionFilename = 'exception-' . @date('Y-m-d-H-i-s') . "-$hash.html"; - foreach (new \DirectoryIterator(self::$logDirectory) as $entry) { - if (strpos($entry, $hash)) { - $exceptionFilename = $entry; - $saved = TRUE; - break; - } - } - } elseif (!is_string($message)) { - $message = Dumper::toText($message); - } - - if ($exceptionFilename) { - $exceptionFilename = self::$logDirectory . '/' . $exceptionFilename; - if (empty($saved) && $logHandle = @fopen($exceptionFilename, 'w')) { - ob_start(); // double buffer prevents sending HTTP headers in some PHP - ob_start(function($buffer) use ($logHandle) { fwrite($logHandle, $buffer); }, 4096); - self::getBlueScreen()->render($exception); - ob_end_flush(); - ob_end_clean(); - fclose($logHandle); - } - } - - self::getLogger()->log(array( - @date('[Y-m-d H-i-s]'), - trim($message), - self::$source ? ' @ ' . self::$source : NULL, - $exceptionFilename ? ' @@ ' . basename($exceptionFilename) : NULL - ), $priority); - - return $exceptionFilename ? strtr($exceptionFilename, '\\/', DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR) : NULL; - } - - - /** - * Shutdown handler to catch fatal errors and execute of the planned activities. - * @return void - * @internal - */ - public static function _shutdownHandler() - { - if (!self::$enabled) { - return; - } - - $error = error_get_last(); - if (in_array($error['type'], array(E_ERROR, E_CORE_ERROR, E_COMPILE_ERROR, E_PARSE), TRUE)) { - self::_exceptionHandler(Helpers::fixStack(new ErrorException($error['message'], 0, $error['type'], $error['file'], $error['line'])), FALSE); - - } elseif (!connection_aborted() && !self::$productionMode && self::isHtmlMode()) { - self::getBar()->render(); - } - } - - - /** - * Handler to catch uncaught exception. - * @param \Exception - * @return void - * @internal - */ - public static function _exceptionHandler(\Exception $exception, $exit = TRUE) - { - if (!self::$enabled) { - return; - } - self::$enabled = FALSE; // prevent double rendering - - if (!headers_sent()) { - $protocol = isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1'; - $code = isset($_SERVER['HTTP_USER_AGENT']) && strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE ') !== FALSE ? 503 : 500; - header("$protocol $code", TRUE, $code); - if (self::isHtmlMode()) { - header('Content-Type: text/html; charset=UTF-8'); - } - } - - $logMsg = 'Unable to log error. Check if directory is writable and path is absolute.'; - if (self::$productionMode) { - try { - self::log($exception, self::EXCEPTION); - } catch (\Exception $e) { - } - - $error = isset($e) ? $logMsg : NULL; - if (self::isHtmlMode()) { - require __DIR__ . '/templates/error.phtml'; - } else { - echo "ERROR: application encountered an error and can not continue.\n$error\n"; - } - - } elseif (!connection_aborted() && self::isHtmlMode()) { - self::getBlueScreen()->render($exception); - self::getBar()->render(); - - } elseif (connection_aborted() || !self::fireLog($exception)) { - try { - $file = self::log($exception, self::EXCEPTION); - if ($file && !headers_sent()) { - header("X-Tracy-Error-Log: $file"); - } - echo "$exception\n" . ($file ? "(stored in $file)\n" : ''); - if ($file && self::$browser) { - exec(self::$browser . ' ' . escapeshellarg($file)); - } - } catch (\Exception $e) { - echo "$exception\n$logMsg {$e->getMessage()}\n"; - } - } - - try { - foreach (self::$onFatalError as $handler) { - call_user_func($handler, $exception); - } - } catch (\Exception $e) { - try { - self::log($e, self::EXCEPTION); - } catch (\Exception $e) {} - } - - if ($exit) { - exit(254); - } - } - - - /** - * Handler to catch warnings and notices. - * @param int level of the error raised - * @param string error message - * @param string file that the error was raised in - * @param int line number the error was raised at - * @param array an array of variables that existed in the scope the error was triggered in - * @return bool FALSE to call normal error handler, NULL otherwise - * @throws ErrorException - * @internal - */ - public static function _errorHandler($severity, $message, $file, $line, $context) - { - if (self::$scream) { - error_reporting(E_ALL | E_STRICT); - } - - if ($severity === E_RECOVERABLE_ERROR || $severity === E_USER_ERROR) { - if (Helpers::findTrace(debug_backtrace(PHP_VERSION_ID >= 50306 ? DEBUG_BACKTRACE_IGNORE_ARGS : FALSE), '*::__toString')) { - $previous = isset($context['e']) && $context['e'] instanceof \Exception ? $context['e'] : NULL; - $e = new ErrorException($message, 0, $severity, $file, $line, $previous); - $e->context = $context; - self::_exceptionHandler($e); - } - - $e = new ErrorException($message, 0, $severity, $file, $line); - $e->context = $context; - throw $e; - - } elseif (($severity & error_reporting()) !== $severity) { - return FALSE; // calls normal error handler to fill-in error_get_last() - - } elseif (($severity & self::$logSeverity) === $severity) { - $e = new ErrorException($message, 0, $severity, $file, $line); - $e->context = $context; - self::log($e, self::ERROR); - return NULL; - - } elseif (!self::$productionMode && (is_bool(self::$strictMode) ? self::$strictMode : ((self::$strictMode & $severity) === $severity))) { - $e = new ErrorException($message, 0, $severity, $file, $line); - $e->context = $context; - self::_exceptionHandler($e); - } - - $message = 'PHP ' . (isset(self::$errorTypes[$severity]) ? self::$errorTypes[$severity] : 'Unknown error') . ": $message"; - $count = & self::getBar()->getPanel(__CLASS__ . ':errors')->data["$file|$line|$message"]; - - if ($count++) { // repeated error - return NULL; - - } elseif (self::$productionMode) { - self::log("$message in $file:$line", self::ERROR); - return NULL; - - } else { - self::fireLog(new ErrorException($message, 0, $severity, $file, $line)); - return self::isHtmlMode() ? NULL : FALSE; // FALSE calls normal error handler - } - } - - - /********************* useful tools ****************d*g**/ - - - /** - * Dumps information about a variable in readable format. - * @tracySkipLocation - * @param mixed variable to dump - * @param bool return output instead of printing it? (bypasses $productionMode) - * @return mixed variable itself or dump - */ - public static function dump($var, $return = FALSE) - { - if ($return) { - ob_start(); - Dumper::dump($var, array( - Dumper::DEPTH => self::$maxDepth, - Dumper::TRUNCATE => self::$maxLen, - )); - return ob_get_clean(); - - } elseif (!self::$productionMode) { - Dumper::dump($var, array( - Dumper::DEPTH => self::$maxDepth, - Dumper::TRUNCATE => self::$maxLen, - Dumper::LOCATION => self::$showLocation, - )); - } - - return $var; - } - - - /** - * Starts/stops stopwatch. - * @param string name - * @return float elapsed seconds - */ - public static function timer($name = NULL) - { - static $time = array(); - $now = microtime(TRUE); - $delta = isset($time[$name]) ? $now - $time[$name] : 0; - $time[$name] = $now; - return $delta; - } - - - /** - * Dumps information about a variable in Tracy Debug Bar. - * @tracySkipLocation - * @param mixed variable to dump - * @param string optional title - * @param array dumper options - * @return mixed variable itself - */ - public static function barDump($var, $title = NULL, array $options = NULL) - { - if (!self::$productionMode) { - self::getBar()->getPanel(__CLASS__ . ':dumps')->data[] = array('title' => $title, 'dump' => Dumper::toHtml($var, (array) $options + array( - Dumper::DEPTH => self::$maxDepth, - Dumper::TRUNCATE => self::$maxLen, - Dumper::LOCATION => self::$showLocation, - ))); - } - return $var; - } - - - /** - * Sends message to FireLogger console. - * @param mixed message to log - * @return bool was successful? - */ - public static function fireLog($message) - { - if (!self::$productionMode) { - return self::getFireLogger()->log($message); - } - } - - - private static function isHtmlMode() - { - return empty($_SERVER['HTTP_X_REQUESTED_WITH']) - && PHP_SAPI !== 'cli' - && !preg_match('#^Content-Type: (?!text/html)#im', implode("\n", headers_list())); - } - -} diff --git a/vendor/tracy/tracy/src/Tracy/DefaultBarPanel.php b/vendor/tracy/tracy/src/Tracy/DefaultBarPanel.php deleted file mode 100644 index d8f55012f..000000000 --- a/vendor/tracy/tracy/src/Tracy/DefaultBarPanel.php +++ /dev/null @@ -1,57 +0,0 @@ -id = $id; - } - - - /** - * Renders HTML code for custom tab. - * @return string - */ - public function getTab() - { - ob_start(); - require __DIR__ . "/templates/bar.{$this->id}.tab.phtml"; - return ob_get_clean(); - } - - - /** - * Renders HTML code for custom panel. - * @return string - */ - public function getPanel() - { - ob_start(); - if (is_file(__DIR__ . "/templates/bar.{$this->id}.panel.phtml")) { - require __DIR__ . "/templates/bar.{$this->id}.panel.phtml"; - } - return ob_get_clean(); - } - -} diff --git a/vendor/tracy/tracy/src/Tracy/Dumper.php b/vendor/tracy/tracy/src/Tracy/Dumper.php deleted file mode 100644 index cdd8dbc5a..000000000 --- a/vendor/tracy/tracy/src/Tracy/Dumper.php +++ /dev/null @@ -1,337 +0,0 @@ - '1;33', - 'null' => '1;33', - 'number' => '1;32', - 'string' => '1;36', - 'array' => '1;31', - 'key' => '1;37', - 'object' => '1;31', - 'visibility' => '1;30', - 'resource' => '1;37', - 'indent' => '1;30', - ); - - /** @var array */ - public static $resources = array( - 'stream' => 'stream_get_meta_data', - 'stream-context' => 'stream_context_get_options', - 'curl' => 'curl_getinfo', - ); - - - /** - * Dumps variable to the output. - * @return mixed variable - */ - public static function dump($var, array $options = NULL) - { - if (PHP_SAPI !== 'cli' && !preg_match('#^Content-Type: (?!text/html)#im', implode("\n", headers_list()))) { - echo self::toHtml($var, $options); - } elseif (self::detectColors()) { - echo self::toTerminal($var, $options); - } else { - echo self::toText($var, $options); - } - return $var; - } - - - /** - * Dumps variable to HTML. - * @return string - */ - public static function toHtml($var, array $options = NULL) - { - $options = (array) $options + array( - self::DEPTH => 4, - self::TRUNCATE => 150, - self::COLLAPSE => FALSE, - self::COLLAPSE_COUNT => 7, - self::LOCATION => FALSE, - ); - list($file, $line, $code) = $options[self::LOCATION] ? self::findLocation() : NULL; - return '
' : '>')
-			. self::dumpVar($var, $options)
-			. ($file ? 'in ' . Helpers::editorLink($file, $line) . '' : '')
-			. "
\n"; - } - - - /** - * Dumps variable to plain text. - * @return string - */ - public static function toText($var, array $options = NULL) - { - return htmlspecialchars_decode(strip_tags(self::toHtml($var, $options)), ENT_QUOTES); - } - - - /** - * Dumps variable to x-terminal. - * @return string - */ - public static function toTerminal($var, array $options = NULL) - { - return htmlspecialchars_decode(strip_tags(preg_replace_callback('#|#', function($m) { - return "\033[" . (isset($m[1], Dumper::$terminalColors[$m[1]]) ? Dumper::$terminalColors[$m[1]] : '0') . 'm'; - }, self::toHtml($var, $options))), ENT_QUOTES); - } - - - /** - * Internal toHtml() dump implementation. - * @param mixed variable to dump - * @param array options - * @param int current recursion level - * @return string - */ - private static function dumpVar(& $var, array $options, $level = 0) - { - if (method_exists(__CLASS__, $m = 'dump' . gettype($var))) { - return self::$m($var, $options, $level); - } else { - return "unknown type\n"; - } - } - - - private static function dumpNull() - { - return "NULL\n"; - } - - - private static function dumpBoolean(& $var) - { - return '' . ($var ? 'TRUE' : 'FALSE') . "\n"; - } - - - private static function dumpInteger(& $var) - { - return "$var\n"; - } - - - private static function dumpDouble(& $var) - { - $var = is_finite($var) - ? ($tmp = json_encode($var)) . (strpos($tmp, '.') === FALSE ? '.0' : '') - : var_export($var, TRUE); - return "$var\n"; - } - - - private static function dumpString(& $var, $options) - { - return '' - . self::encodeString($options[self::TRUNCATE] && strlen($var) > $options[self::TRUNCATE] ? substr($var, 0, $options[self::TRUNCATE]) . ' ... ' : $var) - . '' . (strlen($var) > 1 ? ' (' . strlen($var) . ')' : '') . "\n"; - } - - - private static function dumpArray(& $var, $options, $level) - { - static $marker; - if ($marker === NULL) { - $marker = uniqid("\x00", TRUE); - } - - $out = 'array ('; - - if (empty($var)) { - return $out . ")\n"; - - } elseif (isset($var[$marker])) { - return $out . (count($var) - 1) . ") [ RECURSION ]\n"; - - } elseif (!$options[self::DEPTH] || $level < $options[self::DEPTH]) { - $collapsed = $level ? count($var) >= $options[self::COLLAPSE_COUNT] : $options[self::COLLAPSE]; - $out = '' . $out . count($var) . ")\n'; - $var[$marker] = TRUE; - foreach ($var as $k => & $v) { - if ($k !== $marker) { - $out .= ' ' . str_repeat('| ', $level) . '' - . '' . (preg_match('#^\w+\z#', $k) ? $k : self::encodeString($k)) . ' => ' - . self::dumpVar($v, $options, $level + 1); - } - } - unset($var[$marker]); - return $out . ''; - - } else { - return $out . count($var) . ") [ ... ]\n"; - } - } - - - private static function dumpObject(& $var, $options, $level) - { - if ($var instanceof \Closure) { - $rc = new \ReflectionFunction($var); - $fields = array(); - foreach ($rc->getParameters() as $param) { - $fields[] = '$' . $param->getName(); - } - $fields = array( - 'file' => $rc->getFileName(), 'line' => $rc->getStartLine(), - 'variables' => $rc->getStaticVariables(), 'parameters' => implode(', ', $fields) - ); - } elseif ($var instanceof \SplFileInfo) { - $fields = array('path' => $var->getPathname()); - } elseif ($var instanceof \SplObjectStorage) { - $fields = array(); - foreach (clone $var as $obj) { - $fields[] = array('object' => $obj, 'data' => $var[$obj]); - } - } else { - $fields = (array) $var; - } - - static $list = array(); - $rc = $var instanceof \Closure ? new \ReflectionFunction($var) : new \ReflectionClass($var); - $out = 'getFileName(), $rc->getStartLine())) ? ' data-tracy-href="' . htmlspecialchars($editor) . '"' : '') - . '>' . get_class($var) . ' #' . substr(md5(spl_object_hash($var)), 0, 4) . ''; - - if (empty($fields)) { - return $out . "\n"; - - } elseif (in_array($var, $list, TRUE)) { - return $out . " { RECURSION }\n"; - - } elseif (!$options[self::DEPTH] || $level < $options[self::DEPTH] || $var instanceof \Closure) { - $collapsed = $level ? count($fields) >= $options[self::COLLAPSE_COUNT] : $options[self::COLLAPSE]; - $out = '' . $out . "\n'; - $list[] = $var; - foreach ($fields as $k => & $v) { - $vis = ''; - if ($k[0] === "\x00") { - $vis = ' ' . ($k[1] === '*' ? 'protected' : 'private') . ''; - $k = substr($k, strrpos($k, "\x00") + 1); - } - $out .= ' ' . str_repeat('| ', $level) . '' - . '' . (preg_match('#^\w+\z#', $k) ? $k : self::encodeString($k)) . "$vis => " - . self::dumpVar($v, $options, $level + 1); - } - array_pop($list); - return $out . ''; - - } else { - return $out . " { ... }\n"; - } - } - - - private static function dumpResource(& $var, $options, $level) - { - $type = get_resource_type($var); - $out = '' . htmlSpecialChars($type) . ' resource'; - if (isset(self::$resources[$type])) { - $out = "$out\n
"; - foreach (call_user_func(self::$resources[$type], $var) as $k => $v) { - $out .= ' ' . str_repeat('| ', $level) . '' - . '' . htmlSpecialChars($k) . " => " . self::dumpVar($v, $options, $level + 1); - } - return $out . '
'; - } - return "$out\n"; - } - - - private static function encodeString($s) - { - static $table; - if ($table === NULL) { - foreach (array_merge(range("\x00", "\x1F"), range("\x7F", "\xFF")) as $ch) { - $table[$ch] = '\x' . str_pad(dechex(ord($ch)), 2, '0', STR_PAD_LEFT); - } - $table["\\"] = '\\\\'; - $table["\r"] = '\r'; - $table["\n"] = '\n'; - $table["\t"] = '\t'; - } - - if (preg_match('#[^\x09\x0A\x0D\x20-\x7E\xA0-\x{10FFFF}]#u', $s) || preg_last_error()) { - $s = strtr($s, $table); - } - return '"' . htmlSpecialChars($s, ENT_NOQUOTES) . '"'; - } - - - /** - * Finds the location where dump was called. - * @return array [file, line, code] - */ - private static function findLocation() - { - foreach (debug_backtrace(PHP_VERSION_ID >= 50306 ? DEBUG_BACKTRACE_IGNORE_ARGS : FALSE) as $item) { - if (isset($item['class']) && $item['class'] === __CLASS__) { - $location = $item; - continue; - } elseif (isset($item['function'])) { - try { - $reflection = isset($item['class']) - ? new \ReflectionMethod($item['class'], $item['function']) - : new \ReflectionFunction($item['function']); - if (preg_match('#\s@tracySkipLocation\s#', $reflection->getDocComment())) { - $location = $item; - continue; - } - } catch (\ReflectionException $e) {} - } - break; - } - - if (isset($location['file'], $location['line']) && is_file($location['file'])) { - $lines = file($location['file']); - $line = $lines[$location['line'] - 1]; - return array( - $location['file'], - $location['line'], - trim(preg_match('#\w*dump(er::\w+)?\(.*\)#i', $line, $m) ? $m[0] : $line) - ); - } - } - - - /** - * @return bool - */ - private static function detectColors() - { - return self::$terminalColors && - (getenv('ConEmuANSI') === 'ON' - || getenv('ANSICON') !== FALSE - || (defined('STDOUT') && function_exists('posix_isatty') && posix_isatty(STDOUT))); - } - -} diff --git a/vendor/tracy/tracy/src/Tracy/FireLogger.php b/vendor/tracy/tracy/src/Tracy/FireLogger.php deleted file mode 100644 index 0ab114458..000000000 --- a/vendor/tracy/tracy/src/Tracy/FireLogger.php +++ /dev/null @@ -1,181 +0,0 @@ - array()); - - - /** - * Sends message to FireLogger console. - * @param mixed - * @return bool was successful? - */ - public static function log($message, $priority = self::DEBUG) - { - if (!isset($_SERVER['HTTP_X_FIRELOGGER']) || headers_sent()) { - return FALSE; - } - - $item = array( - 'name' => 'PHP', - 'level' => $priority, - 'order' => count(self::$payload['logs']), - 'time' => str_pad(number_format((microtime(TRUE) - Debugger::$time) * 1000, 1, '.', ' '), 8, '0', STR_PAD_LEFT) . ' ms', - 'template' => '', - 'message' => '', - 'style' => 'background:#767ab6', - ); - - $args = func_get_args(); - if (isset($args[0]) && is_string($args[0])) { - $item['template'] = array_shift($args); - } - - if (isset($args[0]) && $args[0] instanceof \Exception) { - $e = array_shift($args); - $trace = $e->getTrace(); - if (isset($trace[0]['class']) && $trace[0]['class'] === 'Tracy\Debugger' - && ($trace[0]['function'] === '_shutdownHandler' || $trace[0]['function'] === '_errorHandler') - ) { - unset($trace[0]); - } - - $file = str_replace(dirname(dirname(dirname($e->getFile()))), "\xE2\x80\xA6", $e->getFile()); - $item['template'] = ($e instanceof \ErrorException ? '' : get_class($e) . ': ') - . $e->getMessage() . ($e->getCode() ? ' #' . $e->getCode() : '') . ' in ' . $file . ':' . $e->getLine(); - $item['pathname'] = $e->getFile(); - $item['lineno'] = $e->getLine(); - - } else { - $trace = debug_backtrace(); - if (isset($trace[1]['class']) && $trace[1]['class'] === 'Tracy\Debugger' - && ($trace[1]['function'] === 'fireLog') - ) { - unset($trace[0]); - } - - foreach ($trace as $frame) { - if (isset($frame['file']) && is_file($frame['file'])) { - $item['pathname'] = $frame['file']; - $item['lineno'] = $frame['line']; - break; - } - } - } - - $item['exc_info'] = array('', '', array()); - $item['exc_frames'] = array(); - - foreach ($trace as $frame) { - $frame += array('file' => NULL, 'line' => NULL, 'class' => NULL, 'type' => NULL, 'function' => NULL, 'object' => NULL, 'args' => NULL); - $item['exc_info'][2][] = array($frame['file'], $frame['line'], "$frame[class]$frame[type]$frame[function]", $frame['object']); - $item['exc_frames'][] = $frame['args']; - } - - if (isset($args[0]) && in_array($args[0], array(self::DEBUG, self::INFO, self::WARNING, self::ERROR, self::CRITICAL), TRUE)) { - $item['level'] = array_shift($args); - } - - $item['args'] = $args; - - self::$payload['logs'][] = self::jsonDump($item, -1); - foreach (str_split(base64_encode(@json_encode(self::$payload)), 4990) as $k => $v) { // intentionally @ - header("FireLogger-de11e-$k:$v"); - } - return TRUE; - } - - - /** - * Dump implementation for JSON. - * @param mixed variable to dump - * @param int current recursion level - * @return string - */ - private static function jsonDump(& $var, $level = 0) - { - if (is_bool($var) || is_null($var) || is_int($var) || is_float($var)) { - return $var; - - } elseif (is_string($var)) { - if (Debugger::$maxLen && strlen($var) > Debugger::$maxLen) { - $var = substr($var, 0, Debugger::$maxLen) . " \xE2\x80\xA6 "; - } - return Helpers::fixEncoding($var); - - } elseif (is_array($var)) { - static $marker; - if ($marker === NULL) { - $marker = uniqid("\x00", TRUE); - } - if (isset($var[$marker])) { - return "\xE2\x80\xA6RECURSION\xE2\x80\xA6"; - - } elseif ($level < Debugger::$maxDepth || !Debugger::$maxDepth) { - $var[$marker] = TRUE; - $res = array(); - foreach ($var as $k => & $v) { - if ($k !== $marker) { - $res[self::jsonDump($k)] = self::jsonDump($v, $level + 1); - } - } - unset($var[$marker]); - return $res; - - } else { - return " \xE2\x80\xA6 "; - } - - } elseif (is_object($var)) { - $arr = (array) $var; - static $list = array(); - if (in_array($var, $list, TRUE)) { - return "\xE2\x80\xA6RECURSION\xE2\x80\xA6"; - - } elseif ($level < Debugger::$maxDepth || !Debugger::$maxDepth) { - $list[] = $var; - $res = array("\x00" => '(object) ' . get_class($var)); - foreach ($arr as $k => & $v) { - if ($k[0] === "\x00") { - $k = substr($k, strrpos($k, "\x00") + 1); - } - $res[self::jsonDump($k)] = self::jsonDump($v, $level + 1); - } - array_pop($list); - return $res; - - } else { - return " \xE2\x80\xA6 "; - } - - } elseif (is_resource($var)) { - return 'resource ' . get_resource_type($var); - - } else { - return 'unknown type'; - } - } - -} diff --git a/vendor/tracy/tracy/src/Tracy/Helpers.php b/vendor/tracy/tracy/src/Tracy/Helpers.php deleted file mode 100644 index 851098b1e..000000000 --- a/vendor/tracy/tracy/src/Tracy/Helpers.php +++ /dev/null @@ -1,118 +0,0 @@ -%%%', - $editor, - "$file:$line", - rtrim($dir, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR, - basename($file), - $line ? ":$line" : '' - ); - } else { - return self::createHtml('%', $file . ($line ? ":$line" : '')); - } - } - - - /** - * Returns link to editor. - * @return string - */ - public static function editorUri($file, $line) - { - if (Debugger::$editor && $file && is_file($file)) { - return strtr(Debugger::$editor, array('%file' => rawurlencode($file), '%line' => (int) $line)); - } - } - - - public static function createHtml($mask) - { - $args = func_get_args(); - return preg_replace_callback('#%#', function() use (& $args, & $count) { - return htmlspecialchars($args[++$count], ENT_IGNORE | ENT_QUOTES); - }, $mask); - } - - - public static function findTrace(array $trace, $method, & $index = NULL) - { - $m = explode('::', $method); - foreach ($trace as $i => $item) { - if (isset($item['function']) && $item['function'] === end($m) - && isset($item['class']) === isset($m[1]) - && (!isset($item['class']) || $item['class'] === $m[0] || $m[0] === '*' || is_subclass_of($item['class'], $m[0])) - ) { - $index = $i; - return $item; - } - } - } - - - /** @internal */ - public static function fixStack($exception) - { - if (function_exists('xdebug_get_function_stack')) { - $stack = array(); - foreach (array_slice(array_reverse(xdebug_get_function_stack()), 2, -1) as $row) { - $frame = array( - 'file' => $row['file'], - 'line' => $row['line'], - 'function' => isset($row['function']) ? $row['function'] : '*unknown*', - 'args' => array(), - ); - if (!empty($row['class'])) { - $frame['type'] = isset($row['type']) && $row['type'] === 'dynamic' ? '->' : '::'; - $frame['class'] = $row['class']; - } - $stack[] = $frame; - } - $ref = new \ReflectionProperty('Exception', 'trace'); - $ref->setAccessible(TRUE); - $ref->setValue($exception, $stack); - } - return $exception; - } - - - /** @internal */ - public static function fixEncoding($s) - { - if (PHP_VERSION_ID < 50400) { - return @iconv('UTF-16', 'UTF-8//IGNORE', iconv('UTF-8', 'UTF-16//IGNORE', $s)); // intentionally @ - } else { - return htmlspecialchars_decode(htmlspecialchars($s, ENT_NOQUOTES | ENT_IGNORE, 'UTF-8'), ENT_NOQUOTES); - } - } - -} diff --git a/vendor/tracy/tracy/src/Tracy/IBarPanel.php b/vendor/tracy/tracy/src/Tracy/IBarPanel.php deleted file mode 100644 index 1e0cc5507..000000000 --- a/vendor/tracy/tracy/src/Tracy/IBarPanel.php +++ /dev/null @@ -1,33 +0,0 @@ -directory)) { - throw new \RuntimeException("Directory '$this->directory' is not found or is not directory."); - } - - if (is_array($message)) { - $message = implode(' ', $message); - } - $message = preg_replace('#\s*\r?\n\s*#', ' ', trim($message)); - $file = $this->directory . '/' . strtolower($priority ?: self::INFO) . '.log'; - if (!@file_put_contents($file, $message . PHP_EOL, FILE_APPEND | LOCK_EX)) { - throw new \RuntimeException("Unable to write to log file '$file'. Is directory writable?"); - } - - if (in_array($priority, array(self::ERROR, self::EXCEPTION, self::CRITICAL), TRUE) && $this->email && $this->mailer - && @filemtime($this->directory . '/email-sent') + $this->emailSnooze < time() // @ - file may not exist - && @file_put_contents($this->directory . '/email-sent', 'sent') // @ - file may not be writable - ) { - call_user_func($this->mailer, $message, implode(', ', (array) $this->email)); - } - } - - - /** - * Default mailer. - * @param string - * @param string - * @return void - * @internal - */ - public static function defaultMailer($message, $email) - { - $host = preg_replace('#[^\w.-]+#', '', isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : php_uname('n')); - $parts = str_replace( - array("\r\n", "\n"), - array("\n", PHP_EOL), - array( - 'headers' => implode("\n", array( - "From: noreply@$host", - 'X-Mailer: Tracy', - 'Content-Type: text/plain; charset=UTF-8', - 'Content-Transfer-Encoding: 8bit', - )) . "\n", - 'subject' => "PHP: An error occurred on the server $host", - 'body' => "[" . @date('Y-m-d H:i:s') . "] $message", // @ - timezone may not be set - ) - ); - - mail($email, $parts['subject'], $parts['body'], $parts['headers']); - } - -} diff --git a/vendor/tracy/tracy/src/Tracy/OutputDebugger.php b/vendor/tracy/tracy/src/Tracy/OutputDebugger.php deleted file mode 100644 index 011a0ec46..000000000 --- a/vendor/tracy/tracy/src/Tracy/OutputDebugger.php +++ /dev/null @@ -1,72 +0,0 @@ -start(); - } - - - public function start() - { - foreach (get_included_files() as $file) { - if (fread(fopen($file, 'r'), 3) === self::BOM) { - $this->list[] = array($file, 1, self::BOM); - } - } - ob_start(array($this, 'handler'), PHP_VERSION_ID >= 50400 ? 1 : 2); - } - - - /** @internal */ - public function handler($s, $phase) - { - $trace = debug_backtrace(FALSE); - if (isset($trace[0]['file'], $trace[0]['line'])) { - if ($this->lastFile === $trace[0]['file']) { - $this->list[count($this->list) - 1][2] .= $s; - } else { - $this->list[] = array($this->lastFile = $trace[0]['file'], $trace[0]['line'], $s); - } - } - if ($phase === PHP_OUTPUT_HANDLER_FINAL) { - return $this->renderHtml(); - } - } - - - private function renderHtml() - { - $res = ''; - foreach ($this->list as $item) { - $res .= Helpers::editorLink($item[0], $item[1]) . ' ' - . str_replace(self::BOM, 'BOM', Dumper::toHtml($item[2])) . "
\n"; - } - return $res . '
'; - } - -} diff --git a/vendor/tracy/tracy/src/Tracy/templates/bar.css b/vendor/tracy/tracy/src/Tracy/templates/bar.css deleted file mode 100644 index ac2980838..000000000 --- a/vendor/tracy/tracy/src/Tracy/templates/bar.css +++ /dev/null @@ -1,318 +0,0 @@ -/** - * Debugger Bar - * - * This file is part of the Tracy (http://tracy.nette.org) - * Copyright (c) 2004 David Grudl (http://davidgrudl.com) - */ - -/* common styles */ -#tracy-debug { - display: none; - direction: ltr; -} - -body#tracy-debug { - margin: 5px 5px 0; - display: block; -} - -body #tracy-debug { - position: absolute; - bottom: 0; - right: 0; -} - -#tracy-debug * { - font: inherit; - color: inherit; - background: transparent; - margin: 0; - padding: 0; - border: none; - text-align: inherit; - list-style: inherit; - opacity: 1; - border-radius: 0; - box-shadow: none; -} - -#tracy-debug b, #tracy-debug strong { - font-weight: bold; -} - -#tracy-debug i, #tracy-debug em { - font-style: italic; -} - -#tracy-debug a { - color: #125EAE; - text-decoration: none; -} - -#tracy-debug .tracy-panel a { - color: #125EAE; - text-decoration: none; -} - -#tracy-debug a:hover, #tracy-debug a:active, #tracy-debug a:focus { - background-color: #125EAE; - color: white; -} - -#tracy-debug .tracy-panel h2, #tracy-debug .tracy-panel h3, #tracy-debug .tracy-panel p { - margin: .4em 0; -} - -#tracy-debug .tracy-panel table { - border-collapse: collapse; - background: #FDF5CE; -} - -#tracy-debug .tracy-panel tr:nth-child(2n) td { - background: #F7F0CB; -} - -#tracy-debug .tracy-panel td, #tracy-debug .tracy-panel th { - border: 1px solid #E6DFBF; - padding: 2px 5px; - vertical-align: top; - text-align: left; -} - -#tracy-debug .tracy-panel th { - background: #F4F3F1; - color: #655E5E; - font-size: 90%; - font-weight: bold; -} - -#tracy-debug .tracy-panel pre, #tracy-debug .tracy-panel code { - font: 9pt/1.5 Consolas, monospace; -} - -#tracy-debug table .tracy-right { - text-align: right; -} - - -/* bar */ -#tracy-debug-bar { - font: normal normal 12px/21px Tahoma, sans-serif; - color: #333; - border: 1px solid #c9c9c9; - background: #EDEAE0 url('data:image/png;base64,R0lGODlhAQAVALMAAOTh1/Px6eHe1fHv5e/s4vLw6Ofk2u3q4PPw6PPx6PDt5PLw5+Dd1OXi2Ojm3Orn3iH5BAAAAAAALAAAAAABABUAAAQPMISEyhpYkfOcaQAgCEwEADs=') top; - position: fixed; - right: 0; - bottom: 0; - overflow: auto; - min-height: 21px; - - min-width: 50px; - white-space: nowrap; - - z-index: 30000; - opacity: .9; - transition: opacity 0.2s; - - border-radius: 3px; - box-shadow: 1px 1px 10px rgba(0, 0, 0, .15); -} - -#tracy-debug-bar:hover { - opacity: 1; - transition: opacity 0.1s; -} - -#tracy-debug-bar ul { - list-style: none none; - margin-left: 4px; - clear: left; -} - -#tracy-debug-bar li { - float: left; -} - -#tracy-debug-bar ul.tracy-previous li { - font-size: 90%; - opacity: .6; - background: #F5F3EE; -} - -#tracy-debug-bar ul.tracy-previous li:first-child { - width: 45px; -} - -#tracy-debug-bar img { - vertical-align: middle; - position: relative; - top: -1px; - margin-right: 3px; -} - -#tracy-debug-bar li a { - color: #000; - display: block; - padding: 0 4px; -} - -#tracy-debug-bar li a:hover { - color: black; - background: #c3c1b8; -} - -#tracy-debug-bar li .tracy-warning { - color: #D32B2B; - font-weight: bold; -} - -#tracy-debug-bar li > span { - padding: 0 4px; -} - -#tracy-debug-logo { - background: url('data:image/gif;base64,R0lGODlhLgALANU/AO3r4v7+/P79+pSSjeTi2vDu5ysrKllYVvPx6razraqoovr49YqJhJyalN3b1Pz69fb07oSCfdTRyaWinPf17/799kZFQ8bEvWRjYfTy6+3r57y6s4aFgfr48W5safTy7Xp4daGfmejl2peVkODd1cvJwXZ0cZCOio2Mh2ppZvLx7Ovo3vj28Xh2c317eIF/e4iGgbGvqHBvbOnn4HJxbZ+dmF9dWvLw6Pj27/z79/38+lJRT/379OTi1////////yH5BAEAAD8ALAAAAAAuAAsAAAb/QFZmSMxAhEQEy/dr/gQLRMD5CwQoiOEiN8s5dR1NgPQaoBo184CgGLhRp9K0ChhFSoJmoBAbnAYwEyoDI1M+NyhrMyMNCmk1IxMaE2cNEyMmJV4BCi4jIA5TGScmIyGQNTcSGBc+nB4bRhkFD309BSwUDDE8PAE4HDUZPgURMT0vCTk+GyYJIjcFBTcLAjEpFAQeCgBzTw0nAE0QDAozDgQXLRNLJbAVIRwIAiEwJHlUPxQwbyQ6VDkGcFghakALGS8i0IAhQYCAEyBE+JBwQIKPEwy65ftBTIYLCR3y5eAAguCPDy44uDiAgkQFAT5I7NjA40GBFCN8NKBBYaOenYQImABskUKjChtrTlgw4YCjAgspMNjAcADDAw0GSPhw5coJixQgMmzUccCCxg8GUlTgUcKGgQkLLBwg2SICh7cBDhjwCCJFBApM4toQmy9AChsrAu9oAVhABgYnLhgI0YEFhAcIDth4AOCFhc8GDiT+QTZFgY0LABC40YTCCgIQ9FQAQEIEgH9NchRwUEAADwA9CAhn/YOFasI/ggAAOw==') 0 50% no-repeat; - min-width: 47px; - cursor: move; -} - -#tracy-debug-logo span { - display: none; -} - - -/* panels */ -#tracy-debug .tracy-panel { - font: normal normal 12px/1.5 sans-serif; - background: white; - color: #333; - text-align: left; -} - -#tracy-debug h1 { - font: normal normal 23px/1.4 Tahoma, sans-serif; - color: #575753; - margin: -5px -5px 5px; - padding: 0 25px 5px 5px; -} - -#tracy-debug .tracy-mode-peek .tracy-inner, #tracy-debug .tracy-mode-float .tracy-inner { - max-width: 700px; - max-height: 500px; - overflow: auto; -} - -#tracy-debug .tracy-panel .tracy-icons { - display: none; -} - -#tracy-debug .tracy-mode-peek { - display: none; - position: fixed; - right: 0; - bottom: 0; - padding: 10px; - min-width: 150px; - min-height: 50px; - border-radius: 5px; - box-shadow: 1px 1px 20px rgba(102, 102, 102, 0.36); - border: 1px solid rgba(0, 0, 0, 0.1); -} - -#tracy-debug .tracy-mode-peek h1 { - cursor: move; -} - -#tracy-debug .tracy-mode-float { - position: fixed; - right: 0; - bottom: 0; - padding: 10px; - min-width: 150px; - min-height: 50px; - border-radius: 5px; - opacity: .95; - transition: opacity 0.2s; - box-shadow: 1px 1px 30px rgba(102, 102, 102, 0.36); - border: 1px solid rgba(0, 0, 0, 0.1); -} - -#tracy-debug .tracy-focused { - opacity: 1; - transition: opacity 0.1s; -} - -#tracy-debug .tracy-mode-float h1 { - cursor: move; -} - -#tracy-debug .tracy-mode-float .tracy-icons { - display: block; - position: absolute; - top: 0; - right: 5px; - font-size: 18px; -} - -#tracy-debug .tracy-icons a { - color: #575753; -} - -#tracy-debug .tracy-icons a:hover { - color: white; -} - - -/* dump */ -#tracy-debug pre.tracy-dump div { - padding-left: 3ex; -} - -#tracy-debug pre.tracy-dump div div { - border-left: 1px solid rgba(0, 0, 0, .1); - margin-left: .5ex; -} - -#tracy-debug pre.tracy-dump { - background: #FDF5CE; - padding: .4em .7em; - border: 1px dotted silver; - overflow: auto; -} - -#tracy-debug table pre.tracy-dump { - padding: 0; - margin: 0; - border: none; -} - -#tracy-debug .tracy-dump-array, #tracy-debug .tracy-dump-object { - color: #C22; -} - -#tracy-debug .tracy-dump-string { - color: #35D; -} - -#tracy-debug .tracy-dump-number { - color: #090; -} - -#tracy-debug .tracy-dump-null, #tracy-debug .tracy-dump-bool { - color: #850; -} - -#tracy-debug .tracy-dump-visibility, #tracy-debug .tracy-dump-hash { - font-size: 85%; color: #999; -} - -#tracy-debug .tracy-dump-indent { - display: none; -} - - -@media print { - #tracy-debug * { - display: none; - } -} diff --git a/vendor/tracy/tracy/src/Tracy/templates/bar.dumps.panel.phtml b/vendor/tracy/tracy/src/Tracy/templates/bar.dumps.panel.phtml deleted file mode 100644 index 6f94179ed..000000000 --- a/vendor/tracy/tracy/src/Tracy/templates/bar.dumps.panel.phtml +++ /dev/null @@ -1,47 +0,0 @@ - - - - -

Dumped variables

- -
-data as $item): ?> - -

- - - - - - - -
- -
diff --git a/vendor/tracy/tracy/src/Tracy/templates/bar.dumps.tab.phtml b/vendor/tracy/tracy/src/Tracy/templates/bar.dumps.tab.phtml deleted file mode 100644 index 1af46a3c9..000000000 --- a/vendor/tracy/tracy/src/Tracy/templates/bar.dumps.tab.phtml +++ /dev/null @@ -1,18 +0,0 @@ -data)) { - return; -} -?> -variables diff --git a/vendor/tracy/tracy/src/Tracy/templates/bar.errors.panel.phtml b/vendor/tracy/tracy/src/Tracy/templates/bar.errors.panel.phtml deleted file mode 100644 index e4e4a833e..000000000 --- a/vendor/tracy/tracy/src/Tracy/templates/bar.errors.panel.phtml +++ /dev/null @@ -1,26 +0,0 @@ - -

Errors

- -
- - -data as $item => $count): list($file, $line, $message) = explode('|', $item, 3) ?> - - - - - -
-
diff --git a/vendor/tracy/tracy/src/Tracy/templates/bar.errors.tab.phtml b/vendor/tracy/tracy/src/Tracy/templates/bar.errors.tab.phtml deleted file mode 100644 index fac0d7fcc..000000000 --- a/vendor/tracy/tracy/src/Tracy/templates/bar.errors.tab.phtml +++ /dev/null @@ -1,19 +0,0 @@ -data)) { - return; -} -?> -data), $sum > 1 ? ' errors' : ' error' ?> diff --git a/vendor/tracy/tracy/src/Tracy/templates/bar.js b/vendor/tracy/tracy/src/Tracy/templates/bar.js deleted file mode 100644 index 95a6fd399..000000000 --- a/vendor/tracy/tracy/src/Tracy/templates/bar.js +++ /dev/null @@ -1,293 +0,0 @@ -/** - * Debugger Bar - * - * This file is part of the Tracy (http://tracy.nette.org) - * Copyright (c) 2004 David Grudl (http://davidgrudl.com) - */ - -(function(){ - - var $ = Tracy.Query.factory; - - var Panel = Tracy.DebugPanel = function(id) { - this.id = 'tracy-debug-panel-' + id; - this.elem = $('#' + this.id); - }; - - Panel.PEEK = 'tracy-mode-peek'; - Panel.FLOAT = 'tracy-mode-float'; - Panel.WINDOW = 'tracy-mode-window'; - Panel.FOCUSED = 'tracy-focused'; - Panel.zIndex = 20000; - - Panel.prototype.init = function() { - var _this = this; - - this.elem.data().onmove = function(coords) { - _this.moveConstrains(this, coords); - }; - - this.elem.draggable({ - rightEdge: true, - bottomEdge: true, - handle: this.elem.find('h1'), - stop: function() { - _this.toFloat(); - } - - }).bind('mouseenter', function() { - _this.focus(); - - }).bind('mouseleave', function() { - _this.blur(); - }); - - this.elem.find('.tracy-icons').find('a').bind('click', function(e) { - if (this.rel === 'close') { - _this.toPeek(); - } else { - _this.toWindow(); - } - e.preventDefault(); - }); - - this.restorePosition(); - }; - - Panel.prototype.is = function(mode) { - return this.elem.hasClass(mode); - }; - - Panel.prototype.focus = function(callback) { - var elem = this.elem; - if (this.is(Panel.WINDOW)) { - elem.data().win.focus(); - } else { - clearTimeout(elem.data().displayTimeout); - elem.data().displayTimeout = setTimeout(function() { - elem.addClass(Panel.FOCUSED).show(); - elem[0].style.zIndex = Panel.zIndex++; - if (callback) { - callback(); - } - }, 50); - } - }; - - Panel.prototype.blur = function() { - var elem = this.elem; - elem.removeClass(Panel.FOCUSED); - if (this.is(Panel.PEEK)) { - clearTimeout(elem.data().displayTimeout); - elem.data().displayTimeout = setTimeout(function() { - elem.hide(); - }, 50); - } - }; - - Panel.prototype.toFloat = function() { - this.elem.removeClass(Panel.WINDOW). - removeClass(Panel.PEEK). - addClass(Panel.FLOAT). - show(); - this.reposition(); - }; - - Panel.prototype.toPeek = function() { - this.elem.removeClass(Panel.WINDOW). - removeClass(Panel.FLOAT). - addClass(Panel.PEEK). - hide(); - document.cookie = this.id + '=; path=/'; // delete position - }; - - Panel.prototype.toWindow = function() { - var offset = this.elem.offset(); - offset.left += typeof window.screenLeft === 'number' ? window.screenLeft : (window.screenX + 10); - offset.top += typeof window.screenTop === 'number' ? window.screenTop : (window.screenY + 50); - - var win = window.open('', this.id.replace(/-/g, '_'), 'left='+offset.left+',top='+offset.top+',width='+offset.width+',height='+(offset.height+15)+',resizable=yes,scrollbars=yes'); - if (!win) { - return; - } - - var doc = win.document; - doc.write(' - - - - - - - - -
- -
- ¤ - × -
-
- - -
-
    - - -
      '; ?> -
    • ', trim($panel['tab']), ''; endif ?>
    • - -
    • ×
    • -
    -
- - - - - - diff --git a/vendor/tracy/tracy/src/Tracy/templates/bar.time.tab.phtml b/vendor/tracy/tracy/src/Tracy/templates/bar.time.tab.phtml deleted file mode 100644 index 5d0df19f9..000000000 --- a/vendor/tracy/tracy/src/Tracy/templates/bar.time.tab.phtml +++ /dev/null @@ -1,15 +0,0 @@ - - ms diff --git a/vendor/tracy/tracy/src/Tracy/templates/bluescreen.css b/vendor/tracy/tracy/src/Tracy/templates/bluescreen.css deleted file mode 100644 index d3da27558..000000000 --- a/vendor/tracy/tracy/src/Tracy/templates/bluescreen.css +++ /dev/null @@ -1,293 +0,0 @@ -/** - * Debugger Bluescreen - * - * This file is part of the Tracy (http://tracy.nette.org) - * Copyright (c) 2004 David Grudl (http://davidgrudl.com) - */ - -html { - overflow-y: scroll; -} - -#tracyBluescreen { - font: 9pt/1.5 Verdana, sans-serif; - background: white; - color: #333; - position: absolute; - z-index: 20000; - left: 0; - top: 0; - width: 100%; - text-align: left; -} - -#tracyBluescreen * { - font: inherit; - color: inherit; - background: transparent; - border: none; - margin: 0; - padding: 0; - text-align: inherit; - text-indent: 0; -} - -#tracyBluescreen b { - font-weight: bold; -} - -#tracyBluescreen i { - font-style: italic; -} - -#tracyBluescreen a { - text-decoration: none; - color: #328ADC; - padding: 2px 4px; - margin: -2px -4px; -} - -#tracyBluescreen a:hover, #tracyBluescreen a:active, #tracyBluescreen a:focus { - color: #085AA3; -} - -#tracyBluescreenIcon { - position: absolute; - right: .5em; - top: .5em; - text-decoration: none; - background: #CD1818; - color: white !important; - padding: 3px; -} - -#tracyBluescreenError { - background: #CD1818; - color: white; - font: 13pt/1.5 Verdana, sans-serif !important; - display: block; -} - -#tracyBluescreenError #tracyBsSearch { - color: #CD1818; - font-size: .7em; -} - -#tracyBluescreenError:hover #tracyBsSearch { - color: #ED8383; -} - -#tracyBluescreen h1 { - font-size: 18pt; - font-weight: normal; - text-shadow: 1px 1px 0 rgba(0, 0, 0, .4); - margin: .7em 0; -} - -#tracyBluescreen h2 { - font: 14pt/1.5 sans-serif !important; - color: #888; - margin: .6em 0; -} - -#tracyBluescreen h3 { - font: bold 10pt/1.5 Verdana, sans-serif !important; - margin: 1em 0; - padding: 0; -} - -#tracyBluescreen p, #tracyBluescreen pre { - margin: .8em 0 -} - -#tracyBluescreen pre, #tracyBluescreen code, #tracyBluescreen table { - font: 9pt/1.5 Consolas, monospace !important; -} - -#tracyBluescreen pre, #tracyBluescreen table { - background: #FDF5CE; - padding: .4em .7em; - border: 1px dotted silver; - overflow: auto; -} - -#tracyBluescreen table pre { - padding: 0; - margin: 0; - border: none; -} - -#tracyBluescreen table { - border-collapse: collapse; - width: 100%; -} - -#tracyBluescreen td, #tracyBluescreen th { - vertical-align: top; - text-align: left; - padding: 2px 6px; - border: 1px solid #e6dfbf; -} - -#tracyBluescreen th { - font-weight: bold; -} - -#tracyBluescreen tr > :first-child { - width: 20%; -} - -#tracyBluescreen tr:nth-child(2n), #tracyBluescreen tr:nth-child(2n) pre { - background-color: #F7F0CB; -} - -#tracyBluescreen ol { - margin: 1em 0; - padding-left: 2.5em; -} - -#tracyBluescreen ul { - font: 7pt/1.5 Verdana, sans-serif !important; - padding: 2em 4em; - margin: 1em 0 0; - color: #777; - background: #F6F5F3; - border-top: 1px solid #DDD; -} - -#tracyBluescreenLogo a { - position: absolute; - bottom: 0; - right: 0; - width: 100px; - height: 50px; - background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAAAUBAMAAAD/1DctAAAAMFBMVEWupZzj39rEvbTy8O3X0sz9/PvGwLu8tavQysHq6OS0rKP5+Pbd2dT29fPMxbzPx8DKErMJAAAACXBIWXMAAAsTAAALEwEAmpwYAAACGUlEQVQoFX3TQWgTQRQA0MWLIJJDYehBTykhG5ERTx56K1u8eEhCYtomE7x5L4iLh0ViF7egewuFFqSIYE6hIHsIYQ6CQSg9CDKn4QsNCRlB59C74J/ZNHW1+An5+bOPyf6/s46oz2P+A0yIeZZ2ieEHi6TOnLKTxvWq+b52mxlVO3xnM1s7xLX1504XQH65OnW2dBqn7cCkYsFsfYsWpyY/2salmFTpEyzeR8zosYqMdiPDXdyU52K1wgEa/SjGpdEwUAxqvRfckQCDOyFearsEHe2grvkh/cFAHKvdtI3lcVceKQIOFpv+FOZaNPQBwJZLPp+hfrvT5JZXaUFsR8zqQc9qSgAharkfS5M/5F6nGJJAtXq/eLr3ucZpHccSxOOIPaQhtHohpCH2Xu6rLmQ0djnr4/+J3C6v+AW8/XWYxwYNdlhWj/P5fPSTQwVr0T9lGxdaBCqErNZaqYnEwbkjEB3NasGF3lPdrHa1nnxNOMgj0+neePUPjd2v/qVvUv29ifvc19huQ48qwXShy/9o8o3OSk0cs37mOFd0Ydgvsf/oZEnPVtggfd66lORn9mDyyzXU13SRtH2L6aR5T/snGAcZPfAXz5J1YlJWBEuxdMYqQecpBrlM49xAbmqyHA+xlA1FxBtqT2xmJoNXZlIt74ZBLeJ9ZGDqByNI7p543idzJ23vXEv7IgnsxiS+eNtwNbFdLq7+Bi4wQ0I4SVb9AAAAAElFTkSuQmCC') no-repeat; - opacity: .6; - padding: 0; - margin: 0; -} - -#tracyBluescreenLogo a:hover, #tracyBluescreenLogo a:active, #tracyBluescreenLogo a:focus { - opacity: 1; - transition: opacity 0.1s; -} - - -#tracyBluescreen div.panel { - padding: 1px 25px; -} - -#tracyBluescreen div.inner { - background: #F4F3F1; - padding: .1em 1em 1em; - border-radius: 8px; -} - -#tracyBluescreen .outer { - overflow: auto; -} - - -/* source code */ -#tracyBluescreen pre.php div { - min-width: 100%; - float: left; - white-space: pre; -} - -#tracyBluescreen .highlight { - background: #CD1818; - color: white; - font-weight: bold; - font-style: normal; - display: block; - padding: 0 .4em; - margin: 0 -.4em; -} - -#tracyBluescreen .line { - color: #9F9C7F; - font-weight: normal; - font-style: normal; -} - -#tracyBluescreen a[href^=editor\:] { - color: inherit; - border-bottom: 1px dotted rgba(0, 0, 0, .2); -} - -#tracyBluescreen span[data-tracy-href] { - border-bottom: 1px dotted rgba(0, 0, 0, .2); -} - - -/* toggle */ -html.js #tracyBluescreen .tracy-collapsed { - display: none; -} - -html.js #tracyBluescreen .tracy-toggle.tracy-collapsed { - display: inline; -} - -#tracyBluescreen .tracy-toggle { - cursor: pointer; -} - -#tracyBluescreen .tracy-toggle:after { - content: " ▼"; - opacity: .4; -} - -#tracyBluescreen .tracy-toggle.tracy-collapsed:after { - content: " ►"; - opacity: .4; -} - - -/* dump */ -#tracyBluescreen .tracy-dump-array, #tracyBluescreen .tracy-dump-object { - color: #C22; -} - -#tracyBluescreen .tracy-dump-string { - color: #35D; -} - -#tracyBluescreen .tracy-dump-number { - color: #090; -} - -#tracyBluescreen .tracy-dump-null, #tracyBluescreen .tracy-dump-bool { - color: #850; -} - -#tracyBluescreen .tracy-dump-visibility, #tracyBluescreen .tracy-dump-hash { - font-size: 85%; - color: #998; -} - -#tracyBluescreen .tracy-dump-indent { - display: none; -} - -#tracyBluescreen pre.tracy-dump div { - padding-left: 3ex; -} - -#tracyBluescreen pre.tracy-dump div div { - border-left: 1px solid rgba(0, 0, 0, .1); - margin-left: .5ex; -} - -#tracyBluescreen .caused { - float: right; - padding: .3em .6em; - background: #df8075; - border-radius: 0 0 0 8px; - white-space: nowrap; -} - -#tracyBluescreen .caused a { - color: white; -} diff --git a/vendor/tracy/tracy/src/Tracy/templates/bluescreen.phtml b/vendor/tracy/tracy/src/Tracy/templates/bluescreen.phtml deleted file mode 100644 index 94729c6fc..000000000 --- a/vendor/tracy/tracy/src/Tracy/templates/bluescreen.phtml +++ /dev/null @@ -1,401 +0,0 @@ -getSeverity()])) ? Debugger::$errorTypes[$exception->getSeverity()] : get_class($exception); - -$counter = 0; - -?>
- - - - - - - <?php echo htmlspecialchars($title) ?> - - - - - - - -
- -
-
-

getCode() ? ' #' . $exception->getCode() : '') ?>

- -

getMessage(), ENT_IGNORE) ?> getMessage())) ?>" id="tracyBsSearch" rel="noreferrer">search►

-
- - getPrevious()): ?> - - - - - - - - -
> -

Caused by

- -
-
-

getCode() ? ' #' . $ex->getCode() : '')) ?>

- -

getMessage(), ENT_IGNORE) ?>

-
- - - - - - -
-

- -
- -
- - - - getTrace(); $expanded = NULL ?> - getSeverity(), array(E_USER_NOTICE, E_USER_WARNING, E_USER_DEPRECATED))) && $this->isCollapsed($ex->getFile())) { - foreach ($stack as $key => $row) { - if (isset($row['file']) && !$this->isCollapsed($row['file'])) { $expanded = $key; break; } - } - } ?> - -
-

Source file

- -
-

File: getFile(), $ex->getLine()) ?>

- getFile())): ?>getFile(), $ex->getLine(), 15, $ex instanceof \ErrorException && isset($ex->context) ? $ex->context : NULL) ?> -
- - - - -
-

Call stack

- -
-
    - $row): ?> -
  1. - - - - - inner-code - - - " class="tracy-toggle">source  - - " ?> - - ' ?> - - - (" class="tracy-toggle tracy-collapsed">arguments) -

    - - -
    id="tracyBsSrc">
    - - - -
    ">
    - - - -
    "> - - getParameters(); - } catch (\Exception $e) { - $params = array(); - } - foreach ($row['args'] as $k => $v) { - echo '\n"; - } - ?> -
    ', htmlspecialchars(isset($params[$k]) ? '$' . $params[$k]->name : "#$k"), ''; - echo Dumper::toHtml($v); - echo "
    -
    - -
  2. - -
-
- - - - context) && is_array($ex->context)):?> -
-

Variables

- -
-
- - context as $k => $v) { - echo '\n"; - } - ?> -
$', htmlspecialchars($k), '', Dumper::toHtml($v), "
-
-
- - - getPrevious()); ?> -
' ?> - - - - - - -
-

- -
- -
- - - -
-

Environment

- -
-

$_SERVER

-
- - $v) echo '\n"; - ?> -
', htmlspecialchars($k), '', Dumper::toHtml($v), "
-
- - -

$_SESSION

-
- -

empty

- - - $v) echo '\n"; - ?> -
', htmlspecialchars($k), '', $k === '__NF' ? 'Nette Session' : Dumper::toHtml($v), "
- -
- - - -

Nette Session

-
- - $v) echo '\n"; - ?> -
', htmlspecialchars($k), '', Dumper::toHtml($v), "
-
- - - - -

Constants

-
- - $v) { - echo ''; - echo '\n"; - } - ?> -
', htmlspecialchars($k), '', Dumper::toHtml($v), "
-
- - - -

Included files ()

-
- - \n"; - } - ?> -
', htmlspecialchars($v, ENT_IGNORE), "
-
- - -

Configuration options

-
- |.+\z#s', '', ob_get_clean()) ?> -
-
- - -
-

HTTP request

- -
- -

Headers

-
- - $v) echo '\n"; - ?> -
', htmlspecialchars($k), '', htmlspecialchars($v), "
-
- - - - -

$

- -

empty

- -
- - $v) echo '\n"; - ?> -
', htmlspecialchars($k), '', Dumper::toHtml($v), "
-
- - -
- - -
-

HTTP response

- -
-

Headers

- -
';
-			?>
- -

no headers

- -
- - - -
-

- -
- -
- - - -
    -
  • Report generated at
  • - -
  • - -
  • - -
  • -
- - -
-
- - - - diff --git a/vendor/tracy/tracy/src/Tracy/templates/dumper.css b/vendor/tracy/tracy/src/Tracy/templates/dumper.css deleted file mode 100644 index 1abe3a121..000000000 --- a/vendor/tracy/tracy/src/Tracy/templates/dumper.css +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Dumper - * - * This file is part of the Tracy (http://tracy.nette.org) - * Copyright (c) 2004 David Grudl (http://davidgrudl.com) - */ - -/* toggle */ -.tracy-collapsed { - display: none; -} - -.tracy-toggle.tracy-collapsed { - display: inline; -} - -.tracy-toggle { - cursor: pointer; -} - -.tracy-toggle:after { - content: " ▼"; - opacity: .4; -} - -.tracy-toggle.tracy-collapsed:after { - content: " ►"; -} - - -/* dump */ -pre.tracy-dump { - text-align: left; - color: #444; - background: white; -} - -pre.tracy-dump div { - padding-left: 3ex; -} - -pre.tracy-dump div div { - border-left: 1px solid rgba(0, 0, 0, .1); - margin-left: .5ex; -} - -.tracy-dump-array, .tracy-dump-object { - color: #C22; -} - -.tracy-dump-string { - color: #35D; -} - -.tracy-dump-number { - color: #090; -} - -.tracy-dump-null, .tracy-dump-bool { - color: #850; -} - -.tracy-dump-visibility, .tracy-dump-hash { - font-size: 85%; color: #999; -} - -.tracy-dump-indent { - display: none; -} - -span[data-tracy-href] { - border-bottom: 1px dotted rgba(0, 0, 0, .2); -} diff --git a/vendor/tracy/tracy/src/Tracy/templates/dumper.js b/vendor/tracy/tracy/src/Tracy/templates/dumper.js deleted file mode 100644 index fded2e632..000000000 --- a/vendor/tracy/tracy/src/Tracy/templates/dumper.js +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Dumper - * - * This file is part of the Tracy (http://tracy.nette.org) - * Copyright (c) 2004 David Grudl (http://davidgrudl.com) - */ - -(function(){ - - var $ = Tracy.Query.factory; - - var Dumper = Tracy.Dumper = {}; - - Dumper.init = function() { - $(document.body).bind('click', function(e) { - var link; - - // enables & ctrl key - for (link = e.target; link && (!link.getAttribute || !link.getAttribute('data-tracy-href')); link = link.parentNode) {} - if (e.ctrlKey && link) { - location.href = link.getAttribute('data-tracy-href'); - return false; - } - - if (e.shiftKey || e.altKey || e.ctrlKey || e.metaKey) { - return; - } - - // enables or toggling - link = $(e.target).closest('.tracy-toggle'); - if (!link.length) { - return; - } - var collapsed = link.hasClass('tracy-collapsed'), - ref = link[0].getAttribute('data-ref') || link[0].getAttribute('href', 2), - dest = ref && ref !== '#' ? $(ref) : link.next(''), - panel = link.closest('.tracy-panel'), - oldPosition = panel.position(); - - link[collapsed ? 'removeClass' : 'addClass']('tracy-collapsed'); - dest[collapsed ? 'removeClass' : 'addClass']('tracy-collapsed'); - e.preventDefault(); - - if (panel.length) { - var newPosition = panel.position(); - panel.position({ - right: newPosition.right - newPosition.width + oldPosition.width, - bottom: newPosition.bottom - newPosition.height + oldPosition.height - }); - } - }); - }; - -})(); diff --git a/vendor/tracy/tracy/src/Tracy/templates/error.phtml b/vendor/tracy/tracy/src/Tracy/templates/error.phtml deleted file mode 100644 index a3ae50961..000000000 --- a/vendor/tracy/tracy/src/Tracy/templates/error.phtml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - -Server Error - -
- - -

Server Error

- -

We're sorry! The server encountered an internal error and -was unable to complete your request. Please try again later.

- -

error 500Tracy says: ", htmlspecialchars($error) ?>

-
- - diff --git a/vendor/tracy/tracy/src/Tracy/templates/tracyQ.js b/vendor/tracy/tracy/src/Tracy/templates/tracyQ.js deleted file mode 100644 index 7d9a627d9..000000000 --- a/vendor/tracy/tracy/src/Tracy/templates/tracyQ.js +++ /dev/null @@ -1,294 +0,0 @@ -/** - * tracyQ - * - * This file is part of the Tracy. - * Copyright (c) 2004, 2014 David Grudl (http://davidgrudl.com) - */ - -var Tracy = Tracy || {}; - -(function(){ - - // supported cross-browser selectors: #id | div | div.class | .class - var Query = Tracy.Query = function(selector) { - if (typeof selector === "string") { - selector = this._find(document, selector); - - } else if (!selector || selector.nodeType || selector.length === undefined || selector === window) { - selector = [selector]; - } - - for (var i = 0, len = selector.length; i < len; i++) { - if (selector[i]) { this[this.length++] = selector[i]; } - } - }; - - Query.factory = function(selector) { - return new Query(selector); - }; - - Query.prototype.length = 0; - - Query.prototype.find = function(selector) { - return new Query(this._find(this[0], selector)); - }; - - Query.prototype._find = function(context, selector) { - if (!context || !selector) { - return []; - - } else if (document.querySelectorAll) { - return context.querySelectorAll(selector); - - } else if (selector.charAt(0) === '#') { // #id - return [document.getElementById(selector.substring(1))]; - - } else { // div | div.class | .class - selector = selector.split('.'); - var elms = context.getElementsByTagName(selector[0] || '*'); - - if (selector[1]) { - var list = [], pattern = new RegExp('(^|\\s)' + selector[1] + '(\\s|$)'); - for (var i = 0, len = elms.length; i < len; i++) { - if (pattern.test(elms[i].className)) { list.push(elms[i]); } - } - return list; - } else { - return elms; - } - } - }; - - Query.prototype.dom = function() { - return this[0]; - }; - - Query.prototype.each = function(callback) { - for (var i = 0; i < this.length; i++) { - if (callback.apply(this[i]) === false) { break; } - } - return this; - }; - - // cross-browser event attach - Query.prototype.bind = function(event, handler) { - if (document.addEventListener && (event === 'mouseenter' || event === 'mouseleave')) { // simulate mouseenter & mouseleave using mouseover & mouseout - var old = handler; - event = event === 'mouseenter' ? 'mouseover' : 'mouseout'; - handler = function(e) { - for (var target = e.relatedTarget; target; target = target.parentNode) { - if (target === this) { return; } // target must not be inside this - } - old.call(this, e); - }; - } - - return this.each(function() { - var elem = this, // fixes 'this' in iE - data = elem.tracy ? elem.tracy : elem.tracy = {}, - events = data.events = data.events || {}; // use own handler queue - - if (!events[event]) { - var handlers = events[event] = [], - generic = function(e) { // dont worry, 'e' is passed in IE - if (!e.target) { - e.target = e.srcElement; - } - if (!e.preventDefault) { - e.preventDefault = function() { e.returnValue = false; }; - } - if (!e.stopPropagation) { - e.stopPropagation = function() { e.cancelBubble = true; }; - } - e.stopImmediatePropagation = function() { this.stopPropagation(); i = handlers.length; }; - for (var i = 0; i < handlers.length; i++) { - handlers[i].call(elem, e); - } - }; - - if (document.addEventListener) { // non-IE - elem.addEventListener(event, generic, false); - } else if (document.attachEvent) { // IE < 9 - elem.attachEvent('on' + event, generic); - } - } - - events[event].push(handler); - }); - }; - - // adds class to element - Query.prototype.addClass = function(className) { - return this.each(function() { - this.className = (this.className.replace(/^|\s+|$/g, ' ').replace(' '+className+' ', ' ') + ' ' + className).replace(/^\s+|\s+$/g,''); - }); - }; - - // removes class from element - Query.prototype.removeClass = function(className) { - return this.each(function() { - this.className = this.className.replace(/^|\s+|$/g, ' ').replace(' '+className+' ', ' ').replace(/^\s+|\s+$/g,''); - }); - }; - - // tests whether element has given class - Query.prototype.hasClass = function(className) { - return this[0] && this[0].className && this[0].className.replace(/^|\s+|$/g, ' ').indexOf(' '+className+' ') > -1; - }; - - Query.prototype.show = function() { - Query.displays = Query.displays || {}; - return this.each(function() { - var tag = this.tagName; - if (!Query.displays[tag]) { - Query.displays[tag] = (new Query(document.body.appendChild(document.createElement(tag)))).css('display'); - } - this.style.display = Query.displays[tag]; - }); - }; - - Query.prototype.hide = function() { - return this.each(function() { - this.style.display = 'none'; - }); - }; - - Query.prototype.css = function(property) { - if (this[0] && this[0].currentStyle) { - return this[0].currentStyle[property]; - } else if (this[0] && window.getComputedStyle) { - return document.defaultView.getComputedStyle(this[0], null).getPropertyValue(property) - } - }; - - Query.prototype.data = function() { - if (this[0]) { - return this[0].tracy ? this[0].tracy : this[0].tracy = {}; - } - }; - - Query.prototype._trav = function(elem, selector, fce) { - selector = selector.split('.'); - while (elem && !(elem.nodeType === 1 && - (!selector[0] || elem.tagName.toLowerCase() === selector[0]) && - (!selector[1] || (new Query(elem)).hasClass(selector[1])))) { - elem = elem[fce]; - } - return new Query(elem || []); - }; - - Query.prototype.closest = function(selector) { - return this._trav(this[0], selector, 'parentNode'); - }; - - Query.prototype.prev = function(selector) { - return this._trav(this[0] && this[0].previousSibling, selector, 'previousSibling'); - }; - - Query.prototype.next = function(selector) { - return this._trav(this[0] && this[0].nextSibling, selector, 'nextSibling'); - }; - - // returns total offset for element - Query.prototype.offset = function(coords) { - if (coords) { - return this.each(function() { - var elem = this, ofs = {left: -coords.left || 0, top: -coords.top || 0}; - while (elem = elem.offsetParent) { - ofs.left += elem.offsetLeft; ofs.top += elem.offsetTop; - } - this.style.left = -ofs.left + 'px'; - this.style.top = -ofs.top + 'px'; - }); - } else if (this[0]) { - var elem = this[0], res = {left: elem.offsetLeft, top: elem.offsetTop}; - while (elem = elem.offsetParent) { - res.left += elem.offsetLeft; res.top += elem.offsetTop; - } - return res; - } - }; - - // returns current position or move to new position - Query.prototype.position = function(coords) { - if (coords) { - return this.each(function() { - if (this.tracy && this.tracy.onmove) { - this.tracy.onmove.call(this, coords); - } - for (var item in coords) { - this.style[item] = coords[item] + 'px'; - } - }); - } else if (this[0]) { - return { - left: this[0].offsetLeft, top: this[0].offsetTop, - right: this[0].style.right ? parseInt(this[0].style.right, 10) : 0, bottom: this[0].style.bottom ? parseInt(this[0].style.bottom, 10) : 0, - width: this[0].offsetWidth, height: this[0].offsetHeight - }; - } - }; - - // makes element draggable - Query.prototype.draggable = function(options) { - var elem = this[0], dE = document.documentElement, started; - options = options || {}; - - (options.handle ? new Query(options.handle) : this).bind('mousedown', function(e) { - var $el = new Query(options.handle ? elem : this); - e.preventDefault(); - e.stopPropagation(); - - if (Query.dragging) { // missed mouseup out of window? - return dE.onmouseup(e); - } - - var pos = $el.position(), - deltaX = options.rightEdge ? pos.right + e.clientX : pos.left - e.clientX, - deltaY = options.bottomEdge ? pos.bottom + e.clientY : pos.top - e.clientY; - - Query.dragging = true; - started = false; - - dE.onmousemove = function(e) { - e = e || window.event; - if (!started) { - if (options.draggedClass) { - $el.addClass(options.draggedClass); - } - if (options.start) { - options.start(e, $el); - } - started = true; - } - - var pos = {}; - pos[options.rightEdge ? 'right' : 'left'] = options.rightEdge ? deltaX - e.clientX : e.clientX + deltaX; - pos[options.bottomEdge ? 'bottom' : 'top'] = options.bottomEdge ? deltaY - e.clientY : e.clientY + deltaY; - $el.position(pos); - return false; - }; - - dE.onmouseup = function(e) { - if (started) { - if (options.draggedClass) { - $el.removeClass(options.draggedClass); - } - if (options.stop) { - options.stop(e || window.event, $el); - } - } - Query.dragging = dE.onmousemove = dE.onmouseup = null; - return false; - }; - - }).bind('click', function(e) { - if (started) { - e.stopImmediatePropagation(); - } - }); - - return this; - }; - -})(); diff --git a/vendor/tracy/tracy/src/shortcuts.php b/vendor/tracy/tracy/src/shortcuts.php deleted file mode 100644 index e8299f628..000000000 --- a/vendor/tracy/tracy/src/shortcuts.php +++ /dev/null @@ -1,20 +0,0 @@ -setStub("startBuffering(); -foreach ($iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator(__DIR__ . '/../../src', RecursiveDirectoryIterator::SKIP_DOTS)) as $file) { - echo "adding: {$iterator->getSubPathname()}\n"; - $phar[$iterator->getSubPathname()] = php_strip_whitespace($file); -} - -$phar->stopBuffering(); -$phar->compressFiles(Phar::GZ); - -echo "OK\n"; diff --git a/vendor/tracy/tracy/tools/open-in-editor/install.cmd b/vendor/tracy/tracy/tools/open-in-editor/install.cmd deleted file mode 100644 index ecee89f60..000000000 --- a/vendor/tracy/tracy/tools/open-in-editor/install.cmd +++ /dev/null @@ -1,8 +0,0 @@ -@echo off -:: This Windows batch file sets open-editor.js as handler for editor:// protocol - -if defined PROCESSOR_ARCHITEW6432 (set reg="%systemroot%\sysnative\reg.exe") else (set reg=reg) - -%reg% ADD HKCR\editor /ve /d "URL:editor Protocol" /f -%reg% ADD HKCR\editor /v "URL Protocol" /d "" /f -%reg% ADD HKCR\editor\shell\open\command /ve /d "wscript \"%~dp0open-editor.js\" \"%%1\"" /f diff --git a/vendor/tracy/tracy/tools/open-in-editor/open-editor.js b/vendor/tracy/tracy/tools/open-in-editor/open-editor.js deleted file mode 100644 index bc1fd0edd..000000000 --- a/vendor/tracy/tracy/tools/open-in-editor/open-editor.js +++ /dev/null @@ -1,47 +0,0 @@ -// NetBeans -// var editor = '"C:\\Program Files\\NetBeans 6.9.1\\bin\\netbeans.exe" "%file%:%line%" --console suppress'; - -// PhpStorm -// var editor = '"C:\\Users\\Martin\\AppData\\Roaming\\JetBrains\\PhpStorm 7.1.1\\bin\\PhpStorm.exe" --line %line% "%file%"'; - -// Nusphere PHPEd -// var editor = '"C:\\Program Files\\NuSphere\\PhpED\\phped.exe" "%file%" --line=%line%'; - -// SciTE -// var editor = '"C:\\Program Files\\SciTE\\scite.exe" "-open:%file%" -goto:%line%'; - -// EmEditor -// var editor = '"C:\\Program Files\\EmEditor\\EmEditor.exe" "%file%" /l %line%'; - -// PSPad Editor -// var editor = '"C:\\Program Files\\PSPad editor\\PSPad.exe" -%line% "%file%"'; - -// gVim -// var editor = '"C:\\Program Files\\Vim\\vim73\\gvim.exe" "%file%" +%line%'; - -// Sublime Text 2 -// var editor = '"C:\\Program Files\\Sublime Text 2\\sublime_text.exe" "%file%:%line%"'; - -var mappings = { - // '/remotepath': '/localpath' -}; - -if (typeof editor === 'undefined') { - WScript.Echo('Create variable "editor" in ' + WScript.ScriptFullName); - WScript.Quit(); -} - -var url = WScript.Arguments(0); -var match = /^editor:\/\/open\/\?file=(.+)&line=(\d+)/.exec(url); -if (match) { - var file = decodeURIComponent(match[1]).replace(/\+/g, ' '); - for (var id in mappings) { - if (file.indexOf(id) === 0) { - file = mappings[id] + file.substr(id.length); - break; - } - } - var command = editor.replace(/%line%/g, match[2]).replace(/%file%/g, file); - var shell = new ActiveXObject("WScript.Shell"); - shell.Exec(command.replace(/\\/g, '\\\\')); -} diff --git a/vendor/twig/twig/CHANGELOG b/vendor/twig/twig/CHANGELOG deleted file mode 100644 index 1cf54a7f8..000000000 --- a/vendor/twig/twig/CHANGELOG +++ /dev/null @@ -1,684 +0,0 @@ -* 1.16.0 (2014-07-05) - - * changed url_encode to always encode according to RFC 3986 - * fixed inheritance in a 'use'-hierarchy - * removed the __toString policy check when the sandbox is disabled - * fixed recursively calling blocks in templates with inheritance - -* 1.15.1 (2014-02-13) - - * fixed the conversion of the special '0000-00-00 00:00' date - * added an error message when trying to import an undefined block from a trait - * fixed a C extension crash when accessing defined but uninitialized property. - -* 1.15.0 (2013-12-06) - - * made ignoreStrictCheck in Template::getAttribute() works with __call() methods throwing BadMethodCallException - * added min and max functions - * added the round filter - * fixed a bug that prevented the optimizers to be enabled/disabled selectively - * fixed first and last filters for UTF-8 strings - * added a source function to include the content of a template without rendering it - * fixed the C extension sandbox behavior when get or set is prepend to method name - -* 1.14.2 (2013-10-30) - - * fixed error filename/line when an error occurs in an included file - * allowed operators that contain whitespaces to have more than one whitespace - * allowed tests to be made of 1 or 2 words (like "same as" or "divisible by") - -* 1.14.1 (2013-10-15) - - * made it possible to use named operators as variables - * fixed the possibility to have a variable named 'matches' - * added support for PHP 5.5 DateTimeInterface - -* 1.14.0 (2013-10-03) - - * fixed usage of the html_attr escaping strategy to avoid double-escaping with the html strategy - * added new operators: ends with, starts with, and matches - * fixed some compatibility issues with HHVM - * added a way to add custom escaping strategies - * fixed the C extension compilation on Windows - * fixed the batch filter when using a fill argument with an exact match of elements to batch - * fixed the filesystem loader cache when a template name exists in several namespaces - * fixed template_from_string when the template includes or extends other ones - * fixed a crash of the C extension on an edge case - -* 1.13.2 (2013-08-03) - - * fixed the error line number for an error occurs in and embedded template - * fixed crashes of the C extension on some edge cases - -* 1.13.1 (2013-06-06) - - * added the possibility to ignore the filesystem constructor argument in Twig_Loader_Filesystem - * fixed Twig_Loader_Chain::exists() for a loader which implements Twig_ExistsLoaderInterface - * adjusted backtrace call to reduce memory usage when an error occurs - * added support for object instances as the second argument of the constant test - * fixed the include function when used in an assignment - -* 1.13.0 (2013-05-10) - - * fixed getting a numeric-like item on a variable ('09' for instance) - * fixed getting a boolean or float key on an array, so it is consistent with PHP's array access: - `{{ array[false] }}` behaves the same as `echo $array[false];` (equals `$array[0]`) - * made the escape filter 20% faster for happy path (escaping string for html with UTF-8) - * changed ☃ to § in tests - * enforced usage of named arguments after positional ones - -* 1.12.3 (2013-04-08) - - * fixed a security issue in the filesystem loader where it was possible to include a template one - level above the configured path - * fixed fatal error that should be an exception when adding a filter/function/test too late - * added a batch filter - * added support for encoding an array as query string in the url_encode filter - -* 1.12.2 (2013-02-09) - - * fixed the timezone used by the date filter and function when the given date contains a timezone (like 2010-01-28T15:00:00+02:00) - * fixed globals when getGlobals is called early on - * added the first and last filter - -* 1.12.1 (2013-01-15) - - * added support for object instances as the second argument of the constant function - * relaxed globals management to avoid a BC break - * added support for {{ some_string[:2] }} - -* 1.12.0 (2013-01-08) - - * added verbatim as an alias for the raw tag to avoid confusion with the raw filter - * fixed registration of tests and functions as anonymous functions - * fixed globals management - -* 1.12.0-RC1 (2012-12-29) - - * added an include function (does the same as the include tag but in a more flexible way) - * added the ability to use any PHP callable to define filters, functions, and tests - * added a syntax error when using a loop variable that is not defined - * added the ability to set default values for macro arguments - * added support for named arguments for filters, tests, and functions - * moved filters/functions/tests syntax errors to the parser - * added support for extended ternary operator syntaxes - -* 1.11.1 (2012-11-11) - - * fixed debug info line numbering (was off by 2) - * fixed escaping when calling a macro inside another one (regression introduced in 1.9.1) - * optimized variable access on PHP 5.4 - * fixed a crash of the C extension when an exception was thrown from a macro called without being imported (using _self.XXX) - -* 1.11.0 (2012-11-07) - - * fixed macro compilation when a variable name is a PHP reserved keyword - * changed the date filter behavior to always apply the default timezone, except if false is passed as the timezone - * fixed bitwise operator precedences - * added the template_from_string function - * fixed default timezone usage for the date function - * optimized the way Twig exceptions are managed (to make them faster) - * added Twig_ExistsLoaderInterface (implementing this interface in your loader make the chain loader much faster) - -* 1.10.3 (2012-10-19) - - * fixed wrong template location in some error messages - * reverted a BC break introduced in 1.10.2 - * added a split filter - -* 1.10.2 (2012-10-15) - - * fixed macro calls on PHP 5.4 - -* 1.10.1 (2012-10-15) - - * made a speed optimization to macro calls when imported via the "import" tag - * fixed C extension compilation on Windows - * fixed a segfault in the C extension when using DateTime objects - -* 1.10.0 (2012-09-28) - - * extracted functional tests framework to make it reusable for third-party extensions - * added namespaced templates support in Twig_Loader_Filesystem - * added Twig_Loader_Filesystem::prependPath() - * fixed an error when a token parser pass a closure as a test to the subparse() method - -* 1.9.2 (2012-08-25) - - * fixed the in operator for objects that contain circular references - * fixed the C extension when accessing a public property of an object implementing the \ArrayAccess interface - -* 1.9.1 (2012-07-22) - - * optimized macro calls when auto-escaping is on - * fixed wrong parent class for Twig_Function_Node - * made Twig_Loader_Chain more explicit about problems - -* 1.9.0 (2012-07-13) - - * made the parsing independent of the template loaders - * fixed exception trace when an error occurs when rendering a child template - * added escaping strategies for CSS, URL, and HTML attributes - * fixed nested embed tag calls - * added the date_modify filter - -* 1.8.3 (2012-06-17) - - * fixed paths in the filesystem loader when passing a path that ends with a slash or a backslash - * fixed escaping when a project defines a function named html or js - * fixed chmod mode to apply the umask correctly - -* 1.8.2 (2012-05-30) - - * added the abs filter - * fixed a regression when using a number in template attributes - * fixed compiler when mbstring.func_overload is set to 2 - * fixed DateTimeZone support in date filter - -* 1.8.1 (2012-05-17) - - * fixed a regression when dealing with SimpleXMLElement instances in templates - * fixed "is_safe" value for the "dump" function when "html_errors" is not defined in php.ini - * switched to use mbstring whenever possible instead of iconv (you might need to update your encoding as mbstring and iconv encoding names sometimes differ) - -* 1.8.0 (2012-05-08) - - * enforced interface when adding tests, filters, functions, and node visitors from extensions - * fixed a side-effect of the date filter where the timezone might be changed - * simplified usage of the autoescape tag; the only (optional) argument is now the escaping strategy or false (with a BC layer) - * added a way to dynamically change the auto-escaping strategy according to the template "filename" - * changed the autoescape option to also accept a supported escaping strategy (for BC, true is equivalent to html) - * added an embed tag - -* 1.7.0 (2012-04-24) - - * fixed a PHP warning when using CIFS - * fixed template line number in some exceptions - * added an iterable test - * added an error when defining two blocks with the same name in a template - * added the preserves_safety option for filters - * fixed a PHP notice when trying to access a key on a non-object/array variable - * enhanced error reporting when the template file is an instance of SplFileInfo - * added Twig_Environment::mergeGlobals() - * added compilation checks to avoid misuses of the sandbox tag - * fixed filesystem loader freshness logic for high traffic websites - * fixed random function when charset is null - -* 1.6.5 (2012-04-11) - - * fixed a regression when a template only extends another one without defining any blocks - -* 1.6.4 (2012-04-02) - - * fixed PHP notice in Twig_Error::guessTemplateLine() introduced in 1.6.3 - * fixed performance when compiling large files - * optimized parent template creation when the template does not use dynamic inheritance - -* 1.6.3 (2012-03-22) - - * fixed usage of Z_ADDREF_P for PHP 5.2 in the C extension - * fixed compilation of numeric values used in templates when using a locale where the decimal separator is not a dot - * made the strategy used to guess the real template file name and line number in exception messages much faster and more accurate - -* 1.6.2 (2012-03-18) - - * fixed sandbox mode when used with inheritance - * added preserveKeys support for the slice filter - * fixed the date filter when a DateTime instance is passed with a specific timezone - * added a trim filter - -* 1.6.1 (2012-02-29) - - * fixed Twig C extension - * removed the creation of Twig_Markup instances when not needed - * added a way to set the default global timezone for dates - * fixed the slice filter on strings when the length is not specified - * fixed the creation of the cache directory in case of a race condition - -* 1.6.0 (2012-02-04) - - * fixed raw blocks when used with the whitespace trim option - * made a speed optimization to macro calls when imported via the "from" tag - * fixed globals, parsers, visitors, filters, tests, and functions management in Twig_Environment when a new one or new extension is added - * fixed the attribute function when passing arguments - * added slice notation support for the [] operator (syntactic sugar for the slice operator) - * added a slice filter - * added string support for the reverse filter - * fixed the empty test and the length filter for Twig_Markup instances - * added a date function to ease date comparison - * fixed unary operators precedence - * added recursive parsing support in the parser - * added string and integer handling for the random function - -* 1.5.1 (2012-01-05) - - * fixed a regression when parsing strings - -* 1.5.0 (2012-01-04) - - * added Traversable objects support for the join filter - -* 1.5.0-RC2 (2011-12-30) - - * added a way to set the default global date interval format - * fixed the date filter for DateInterval instances (setTimezone() does not exist for them) - * refactored Twig_Template::display() to ease its extension - * added a number_format filter - -* 1.5.0-RC1 (2011-12-26) - - * removed the need to quote hash keys - * allowed hash keys to be any expression - * added a do tag - * added a flush tag - * added support for dynamically named filters and functions - * added a dump function to help debugging templates - * added a nl2br filter - * added a random function - * added a way to change the default format for the date filter - * fixed the lexer when an operator ending with a letter ends a line - * added string interpolation support - * enhanced exceptions for unknown filters, functions, tests, and tags - -* 1.4.0 (2011-12-07) - - * fixed lexer when using big numbers (> PHP_INT_MAX) - * added missing preserveKeys argument to the reverse filter - * fixed macros containing filter tag calls - -* 1.4.0-RC2 (2011-11-27) - - * removed usage of Reflection in Twig_Template::getAttribute() - * added a C extension that can optionally replace Twig_Template::getAttribute() - * added negative timestamp support to the date filter - -* 1.4.0-RC1 (2011-11-20) - - * optimized variable access when using PHP 5.4 - * changed the precedence of the .. operator to be more consistent with languages that implements such a feature like Ruby - * added an Exception to Twig_Loader_Array::isFresh() method when the template does not exist to be consistent with other loaders - * added Twig_Function_Node to allow more complex functions to have their own Node class - * added Twig_Filter_Node to allow more complex filters to have their own Node class - * added Twig_Test_Node to allow more complex tests to have their own Node class - * added a better error message when a template is empty but contain a BOM - * fixed "in" operator for empty strings - * fixed the "defined" test and the "default" filter (now works with more than one call (foo.bar.foo) and for both values of the strict_variables option) - * changed the way extensions are loaded (addFilter/addFunction/addGlobal/addTest/addNodeVisitor/addTokenParser/addExtension can now be called in any order) - * added Twig_Environment::display() - * made the escape filter smarter when the encoding is not supported by PHP - * added a convert_encoding filter - * moved all node manipulations outside the compile() Node method - * made several speed optimizations - -* 1.3.0 (2011-10-08) - -no changes - -* 1.3.0-RC1 (2011-10-04) - - * added an optimization for the parent() function - * added cache reloading when auto_reload is true and an extension has been modified - * added the possibility to force the escaping of a string already marked as safe (instance of Twig_Markup) - * allowed empty templates to be used as traits - * added traits support for the "parent" function - -* 1.2.0 (2011-09-13) - -no changes - -* 1.2.0-RC1 (2011-09-10) - - * enhanced the exception when a tag remains unclosed - * added support for empty Countable objects for the "empty" test - * fixed algorithm that determines if a template using inheritance is valid (no output between block definitions) - * added better support for encoding problems when escaping a string (available as of PHP 5.4) - * added a way to ignore a missing template when using the "include" tag ({% include "foo" ignore missing %}) - * added support for an array of templates to the "include" and "extends" tags ({% include ['foo', 'bar'] %}) - * added support for bitwise operators in expressions - * added the "attribute" function to allow getting dynamic attributes on variables - * added Twig_Loader_Chain - * added Twig_Loader_Array::setTemplate() - * added an optimization for the set tag when used to capture a large chunk of static text - * changed name regex to match PHP one "[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*" (works for blocks, tags, functions, filters, and macros) - * removed the possibility to use the "extends" tag from a block - * added "if" modifier support to "for" loops - -* 1.1.2 (2011-07-30) - - * fixed json_encode filter on PHP 5.2 - * fixed regression introduced in 1.1.1 ({{ block(foo|lower) }}) - * fixed inheritance when using conditional parents - * fixed compilation of templates when the body of a child template is not empty - * fixed output when a macro throws an exception - * fixed a parsing problem when a large chunk of text is enclosed in a comment tag - * added PHPDoc for all Token parsers and Core extension functions - -* 1.1.1 (2011-07-17) - - * added a performance optimization in the Optimizer (also helps to lower the number of nested level calls) - * made some performance improvement for some edge cases - -* 1.1.0 (2011-06-28) - - * fixed json_encode filter - -* 1.1.0-RC3 (2011-06-24) - - * fixed method case-sensitivity when using the sandbox mode - * added timezone support for the date filter - * fixed possible security problems with NUL bytes - -* 1.1.0-RC2 (2011-06-16) - - * added an exception when the template passed to "use" is not a string - * made 'a.b is defined' not throw an exception if a is not defined (in strict mode) - * added {% line \d+ %} directive - -* 1.1.0-RC1 (2011-05-28) - -Flush your cache after upgrading. - - * fixed date filter when using a timestamp - * fixed the defined test for some cases - * fixed a parsing problem when a large chunk of text is enclosed in a raw tag - * added support for horizontal reuse of template blocks (see docs for more information) - * added whitespace control modifier to all tags (see docs for more information) - * added null as an alias for none (the null test is also an alias for the none test now) - * made TRUE, FALSE, NONE equivalent to their lowercase counterparts - * wrapped all compilation and runtime exceptions with Twig_Error_Runtime and added logic to guess the template name and line - * moved display() method to Twig_Template (generated templates should now use doDisplay() instead) - -* 1.0.0 (2011-03-27) - - * fixed output when using mbstring - * fixed duplicate call of methods when using the sandbox - * made the charset configurable for the escape filter - -* 1.0.0-RC2 (2011-02-21) - - * changed the way {% set %} works when capturing (the content is now marked as safe) - * added support for macro name in the endmacro tag - * make Twig_Error compatible with PHP 5.3.0 > - * fixed an infinite loop on some Windows configurations - * fixed the "length" filter for numbers - * fixed Template::getAttribute() as properties in PHP are case sensitive - * removed coupling between Twig_Node and Twig_Template - * fixed the ternary operator precedence rule - -* 1.0.0-RC1 (2011-01-09) - -Backward incompatibilities: - - * the "items" filter, which has been deprecated for quite a long time now, has been removed - * the "range" filter has been converted to a function: 0|range(10) -> range(0, 10) - * the "constant" filter has been converted to a function: {{ some_date|date('DATE_W3C'|constant) }} -> {{ some_date|date(constant('DATE_W3C')) }} - * the "cycle" filter has been converted to a function: {{ ['odd', 'even']|cycle(i) }} -> {{ cycle(['odd', 'even'], i) }} - * the "for" tag does not support "joined by" anymore - * the "autoescape" first argument is now "true"/"false" (instead of "on"/"off") - * the "parent" tag has been replaced by a "parent" function ({{ parent() }} instead of {% parent %}) - * the "display" tag has been replaced by a "block" function ({{ block('title') }} instead of {% display title %}) - * removed the grammar and simple token parser (moved to the Twig Extensions repository) - -Changes: - - * added "needs_context" option for filters and functions (the context is then passed as a first argument) - * added global variables support - * made macros return their value instead of echoing directly (fixes calling a macro in sandbox mode) - * added the "from" tag to import macros as functions - * added support for functions (a function is just syntactic sugar for a getAttribute() call) - * made macros callable when sandbox mode is enabled - * added an exception when a macro uses a reserved name - * the "default" filter now uses the "empty" test instead of just checking for null - * added the "empty" test - -* 0.9.10 (2010-12-16) - -Backward incompatibilities: - - * The Escaper extension is enabled by default, which means that all displayed - variables are now automatically escaped. You can revert to the previous - behavior by removing the extension via $env->removeExtension('escaper') - or just set the 'autoescape' option to 'false'. - * removed the "without loop" attribute for the "for" tag (not needed anymore - as the Optimizer take care of that for most cases) - * arrays and hashes have now a different syntax - * arrays keep the same syntax with square brackets: [1, 2] - * hashes now use curly braces (["a": "b"] should now be written as {"a": "b"}) - * support for "arrays with keys" and "hashes without keys" is not supported anymore ([1, "foo": "bar"] or {"foo": "bar", 1}) - * the i18n extension is now part of the Twig Extensions repository - -Changes: - - * added the merge filter - * removed 'is_escaper' option for filters (a left over from the previous version) -- you must use 'is_safe' now instead - * fixed usage of operators as method names (like is, in, and not) - * changed the order of execution for node visitors - * fixed default() filter behavior when used with strict_variables set to on - * fixed filesystem loader compatibility with PHAR files - * enhanced error messages when an unexpected token is parsed in an expression - * fixed filename not being added to syntax error messages - * added the autoescape option to enable/disable autoescaping - * removed the newline after a comment (mimics PHP behavior) - * added a syntax error exception when parent block is used on a template that does not extend another one - * made the Escaper extension enabled by default - * fixed sandbox extension when used with auto output escaping - * fixed escaper when wrapping a Twig_Node_Print (the original class must be preserved) - * added an Optimizer extension (enabled by default; optimizes "for" loops and "raw" filters) - * added priority to node visitors - -* 0.9.9 (2010-11-28) - -Backward incompatibilities: - * the self special variable has been renamed to _self - * the odd and even filters are now tests: - {{ foo|odd }} must now be written {{ foo is odd }} - * the "safe" filter has been renamed to "raw" - * in Node classes, - sub-nodes are now accessed via getNode() (instead of property access) - attributes via getAttribute() (instead of array access) - * the urlencode filter had been renamed to url_encode - * the include tag now merges the passed variables with the current context by default - (the old behavior is still possible by adding the "only" keyword) - * moved Exceptions to Twig_Error_* (Twig_SyntaxError/Twig_RuntimeError are now Twig_Error_Syntax/Twig_Error_Runtime) - * removed support for {{ 1 < i < 3 }} (use {{ i > 1 and i < 3 }} instead) - * the "in" filter has been removed ({{ a|in(b) }} should now be written {{ a in b }}) - -Changes: - * added file and line to Twig_Error_Runtime exceptions thrown from Twig_Template - * changed trans tag to accept any variable for the plural count - * fixed sandbox mode (__toString() method check was not enforced if called implicitly from complex statements) - * added the ** (power) operator - * changed the algorithm used for parsing expressions - * added the spaceless tag - * removed trim_blocks option - * added support for is*() methods for attributes (foo.bar now looks for foo->getBar() or foo->isBar()) - * changed all exceptions to extend Twig_Error - * fixed unary expressions ({{ not(1 or 0) }}) - * fixed child templates (with an extend tag) that uses one or more imports - * added support for {{ 1 not in [2, 3] }} (more readable than the current {{ not (1 in [2, 3]) }}) - * escaping has been rewritten - * the implementation of template inheritance has been rewritten - (blocks can now be called individually and still work with inheritance) - * fixed error handling for if tag when a syntax error occurs within a subparse process - * added a way to implement custom logic for resolving token parsers given a tag name - * fixed js escaper to be stricter (now uses a whilelist-based js escaper) - * added the following filers: "constant", "trans", "replace", "json_encode" - * added a "constant" test - * fixed objects with __toString() not being autoescaped - * fixed subscript expressions when calling __call() (methods now keep the case) - * added "test" feature (accessible via the "is" operator) - * removed the debug tag (should be done in an extension) - * fixed trans tag when no vars are used in plural form - * fixed race condition when writing template cache - * added the special _charset variable to reference the current charset - * added the special _context variable to reference the current context - * renamed self to _self (to avoid conflict) - * fixed Twig_Template::getAttribute() for protected properties - -* 0.9.8 (2010-06-28) - -Backward incompatibilities: - * the trans tag plural count is now attached to the plural tag: - old: `{% trans count %}...{% plural %}...{% endtrans %}` - new: `{% trans %}...{% plural count %}...{% endtrans %}` - - * added a way to translate strings coming from a variable ({% trans var %}) - * fixed trans tag when used with the Escaper extension - * fixed default cache umask - * removed Twig_Template instances from the debug tag output - * fixed objects with __isset() defined - * fixed set tag when used with a capture - * fixed type hinting for Twig_Environment::addFilter() method - -* 0.9.7 (2010-06-12) - -Backward incompatibilities: - * changed 'as' to '=' for the set tag ({% set title as "Title" %} must now be {% set title = "Title" %}) - * removed the sandboxed attribute of the include tag (use the new sandbox tag instead) - * refactored the Node system (if you have custom nodes, you will have to update them to use the new API) - - * added self as a special variable that refers to the current template (useful for importing macros from the current template) - * added Twig_Template instance support to the include tag - * added support for dynamic and conditional inheritance ({% extends some_var %} and {% extends standalone ? "minimum" : "base" %}) - * added a grammar sub-framework to ease the creation of custom tags - * fixed the for tag for large arrays (some loop variables are now only available for arrays and objects that implement the Countable interface) - * removed the Twig_Resource::resolveMissingFilter() method - * fixed the filter tag which did not apply filtering to included files - * added a bunch of unit tests - * added a bunch of phpdoc - * added a sandbox tag in the sandbox extension - * changed the date filter to support any date format supported by DateTime - * added strict_variable setting to throw an exception when an invalid variable is used in a template (disabled by default) - * added the lexer, parser, and compiler as arguments to the Twig_Environment constructor - * changed the cache option to only accepts an explicit path to a cache directory or false - * added a way to add token parsers, filters, and visitors without creating an extension - * added three interfaces: Twig_NodeInterface, Twig_TokenParserInterface, and Twig_FilterInterface - * changed the generated code to match the new coding standards - * fixed sandbox mode (__toString() method check was not enforced if called implicitly from a simple statement like {{ article }}) - * added an exception when a child template has a non-empty body (as it is always ignored when rendering) - -* 0.9.6 (2010-05-12) - - * fixed variables defined outside a loop and for which the value changes in a for loop - * fixed the test suite for PHP 5.2 and older versions of PHPUnit - * added support for __call() in expression resolution - * fixed node visiting for macros (macros are now visited by visitors as any other node) - * fixed nested block definitions with a parent call (rarely useful but nonetheless supported now) - * added the cycle filter - * fixed the Lexer when mbstring.func_overload is used with an mbstring.internal_encoding different from ASCII - * added a long-syntax for the set tag ({% set foo %}...{% endset %}) - * unit tests are now powered by PHPUnit - * added support for gettext via the `i18n` extension - * fixed twig_capitalize_string_filter() and fixed twig_length_filter() when used with UTF-8 values - * added a more useful exception if an if tag is not closed properly - * added support for escaping strategy in the autoescape tag - * fixed lexer when a template has a big chunk of text between/in a block - -* 0.9.5 (2010-01-20) - -As for any new release, don't forget to remove all cached templates after -upgrading. - -If you have defined custom filters, you MUST upgrade them for this release. To -upgrade, replace "array" with "new Twig_Filter_Function", and replace the -environment constant by the "needs_environment" option: - - // before - 'even' => array('twig_is_even_filter', false), - 'escape' => array('twig_escape_filter', true), - - // after - 'even' => new Twig_Filter_Function('twig_is_even_filter'), - 'escape' => new Twig_Filter_Function('twig_escape_filter', array('needs_environment' => true)), - -If you have created NodeTransformer classes, you will need to upgrade them to -the new interface (please note that the interface is not yet considered -stable). - - * fixed list nodes that did not extend the Twig_NodeListInterface - * added the "without loop" option to the for tag (it disables the generation of the loop variable) - * refactored node transformers to node visitors - * fixed automatic-escaping for blocks - * added a way to specify variables to pass to an included template - * changed the automatic-escaping rules to be more sensible and more configurable in custom filters (the documentation lists all the rules) - * improved the filter system to allow object methods to be used as filters - * changed the Array and String loaders to actually make use of the cache mechanism - * included the default filter function definitions in the extension class files directly (Core, Escaper) - * added the // operator (like the floor() PHP function) - * added the .. operator (as a syntactic sugar for the range filter when the step is 1) - * added the in operator (as a syntactic sugar for the in filter) - * added the following filters in the Core extension: in, range - * added support for arrays (same behavior as in PHP, a mix between lists and dictionaries, arrays and hashes) - * enhanced some error messages to provide better feedback in case of parsing errors - -* 0.9.4 (2009-12-02) - -If you have custom loaders, you MUST upgrade them for this release: The -Twig_Loader base class has been removed, and the Twig_LoaderInterface has also -been changed (see the source code for more information or the documentation). - - * added support for DateTime instances for the date filter - * fixed loop.last when the array only has one item - * made it possible to insert newlines in tag and variable blocks - * fixed a bug when a literal '\n' were present in a template text - * fixed bug when the filename of a template contains */ - * refactored loaders - -* 0.9.3 (2009-11-11) - -This release is NOT backward compatible with the previous releases. - - The loaders do not take the cache and autoReload arguments anymore. Instead, - the Twig_Environment class has two new options: cache and auto_reload. - Upgrading your code means changing this kind of code: - - $loader = new Twig_Loader_Filesystem('/path/to/templates', '/path/to/compilation_cache', true); - $twig = new Twig_Environment($loader); - - to something like this: - - $loader = new Twig_Loader_Filesystem('/path/to/templates'); - $twig = new Twig_Environment($loader, array( - 'cache' => '/path/to/compilation_cache', - 'auto_reload' => true, - )); - - * deprecated the "items" filter as it is not needed anymore - * made cache and auto_reload options of Twig_Environment instead of arguments of Twig_Loader - * optimized template loading speed - * removed output when an error occurs in a template and render() is used - * made major speed improvements for loops (up to 300% on even the smallest loops) - * added properties as part of the sandbox mode - * added public properties support (obj.item can now be the item property on the obj object) - * extended set tag to support expression as value ({% set foo as 'foo' ~ 'bar' %} ) - * fixed bug when \ was used in HTML - -* 0.9.2 (2009-10-29) - - * made some speed optimizations - * changed the cache extension to .php - * added a js escaping strategy - * added support for short block tag - * changed the filter tag to allow chained filters - * made lexer more flexible as you can now change the default delimiters - * added set tag - * changed default directory permission when cache dir does not exist (more secure) - * added macro support - * changed filters first optional argument to be a Twig_Environment instance instead of a Twig_Template instance - * made Twig_Autoloader::autoload() a static method - * avoid writing template file if an error occurs - * added $ escaping when outputting raw strings - * enhanced some error messages to ease debugging - * fixed empty cache files when the template contains an error - -* 0.9.1 (2009-10-14) - - * fixed a bug in PHP 5.2.6 - * fixed numbers with one than one decimal - * added support for method calls with arguments ({{ foo.bar('a', 43) }}) - * made small speed optimizations - * made minor tweaks to allow better extensibility and flexibility - -* 0.9.0 (2009-10-12) - - * Initial release diff --git a/vendor/twig/twig/LICENSE b/vendor/twig/twig/LICENSE deleted file mode 100644 index a470002bf..000000000 --- a/vendor/twig/twig/LICENSE +++ /dev/null @@ -1,31 +0,0 @@ -Copyright (c) 2009-2014 by the Twig Team. - -Some rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - - * The names of the contributors may not be used to endorse or - promote products derived from this software without specific - prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/twig/twig/README.rst b/vendor/twig/twig/README.rst deleted file mode 100644 index 81737b0b2..000000000 --- a/vendor/twig/twig/README.rst +++ /dev/null @@ -1,15 +0,0 @@ -Twig, the flexible, fast, and secure template language for PHP -============================================================== - -Twig is a template language for PHP, released under the new BSD license (code -and documentation). - -Twig uses a syntax similar to the Django and Jinja template languages which -inspired the Twig runtime environment. - -More Information ----------------- - -Read the `documentation`_ for more information. - -.. _documentation: http://twig.sensiolabs.org/documentation diff --git a/vendor/twig/twig/lib/Twig/Autoloader.php b/vendor/twig/twig/lib/Twig/Autoloader.php deleted file mode 100644 index 42f16f094..000000000 --- a/vendor/twig/twig/lib/Twig/Autoloader.php +++ /dev/null @@ -1,48 +0,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) - { - if (version_compare(phpversion(), '5.3.0', '>=')) { - spl_autoload_register(array(__CLASS__, 'autoload'), true, $prepend); - } else { - spl_autoload_register(array(__CLASS__, 'autoload')); - } - } - - /** - * 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/vendor/twig/twig/lib/Twig/Compiler.php b/vendor/twig/twig/lib/Twig/Compiler.php deleted file mode 100644 index ee0051998..000000000 --- a/vendor/twig/twig/lib/Twig/Compiler.php +++ /dev/null @@ -1,270 +0,0 @@ - - */ -class Twig_Compiler implements Twig_CompilerInterface -{ - protected $lastLine; - protected $source; - protected $indentation; - protected $env; - protected $debugInfo; - protected $sourceOffset; - protected $sourceLine; - protected $filename; - - /** - * Constructor. - * - * @param Twig_Environment $env The twig environment instance - */ - public function __construct(Twig_Environment $env) - { - $this->env = $env; - $this->debugInfo = array(); - } - - public function getFilename() - { - return $this->filename; - } - - /** - * Returns the environment instance related to this compiler. - * - * @return Twig_Environment The environment instance - */ - 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 Twig_Compiler The current compiler instance - */ - public function compile(Twig_NodeInterface $node, $indentation = 0) - { - $this->lastLine = null; - $this->source = ''; - $this->sourceOffset = 0; - // source code starts at 1 (as we then increment it when we encounter new lines) - $this->sourceLine = 1; - $this->indentation = $indentation; - - if ($node instanceof Twig_Node_Module) { - $this->filename = $node->getAttribute('filename'); - } - - $node->compile($this); - - return $this; - } - - public function subcompile(Twig_NodeInterface $node, $raw = true) - { - if (false === $raw) { - $this->addIndentation(); - } - - $node->compile($this); - - return $this; - } - - /** - * Adds a raw string to the compiled code. - * - * @param string $string The string - * - * @return Twig_Compiler The current compiler instance - */ - public function raw($string) - { - $this->source .= $string; - - return $this; - } - - /** - * Writes a string to the compiled code by adding indentation. - * - * @return Twig_Compiler The current compiler instance - */ - public function write() - { - $strings = func_get_args(); - foreach ($strings as $string) { - $this->addIndentation(); - $this->source .= $string; - } - - return $this; - } - - /** - * Appends an indentation to the current PHP code after compilation. - * - * @return Twig_Compiler The current compiler instance - */ - public function addIndentation() - { - $this->source .= str_repeat(' ', $this->indentation * 4); - - return $this; - } - - /** - * Adds a quoted string to the compiled code. - * - * @param string $value The string - * - * @return Twig_Compiler The current compiler instance - */ - 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 Twig_Compiler The current compiler instance - */ - 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 => $value) { - if (!$first) { - $this->raw(', '); - } - $first = false; - $this->repr($key); - $this->raw(' => '); - $this->repr($value); - } - $this->raw(')'); - } else { - $this->string($value); - } - - return $this; - } - - /** - * Adds debugging information. - * - * @param Twig_NodeInterface $node The related twig node - * - * @return Twig_Compiler The current compiler instance - */ - public function addDebugInfo(Twig_NodeInterface $node) - { - if ($node->getLine() != $this->lastLine) { - $this->write(sprintf("// line %d\n", $node->getLine())); - - // 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) { - // 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->getLine(); - - $this->lastLine = $node->getLine(); - } - - return $this; - } - - public function getDebugInfo() - { - return $this->debugInfo; - } - - /** - * Indents the generated code. - * - * @param int $step The number of indentation to add - * - * @return Twig_Compiler The current compiler instance - */ - public function indent($step = 1) - { - $this->indentation += $step; - - return $this; - } - - /** - * Outdents the generated code. - * - * @param int $step The number of indentation to remove - * - * @return Twig_Compiler The current compiler instance - * - * @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; - } -} diff --git a/vendor/twig/twig/lib/Twig/CompilerInterface.php b/vendor/twig/twig/lib/Twig/CompilerInterface.php deleted file mode 100644 index 272c7672f..000000000 --- a/vendor/twig/twig/lib/Twig/CompilerInterface.php +++ /dev/null @@ -1,36 +0,0 @@ - - * - * @deprecated since 1.12 (to be removed in 3.0) - */ -interface Twig_CompilerInterface -{ - /** - * Compiles a node. - * - * @param Twig_NodeInterface $node The node to compile - * - * @return Twig_CompilerInterface The current compiler instance - */ - public function compile(Twig_NodeInterface $node); - - /** - * Gets the current PHP code after compilation. - * - * @return string The PHP code - */ - public function getSource(); -} diff --git a/vendor/twig/twig/lib/Twig/Environment.php b/vendor/twig/twig/lib/Twig/Environment.php deleted file mode 100644 index d3ba9be91..000000000 --- a/vendor/twig/twig/lib/Twig/Environment.php +++ /dev/null @@ -1,1254 +0,0 @@ - - */ -class Twig_Environment -{ - const VERSION = '1.16.0'; - - 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; - protected $extensionInitialized; - protected $loadedTemplates; - protected $strictVariables; - protected $unaryOperators; - protected $binaryOperators; - protected $templateClassPrefix = '__TwigTemplate_'; - protected $functionCallbacks; - protected $filterCallbacks; - protected $staging; - - /** - * 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, 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 - * * PHP callback: a PHP callback that returns an escaping strategy based on the template "filename" - * - * * 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 A Twig_LoaderInterface instance - * @param array $options An array of options - */ - public function __construct(Twig_LoaderInterface $loader = null, $options = array()) - { - if (null !== $loader) { - $this->setLoader($loader); - } - - $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->runtimeInitialized = false; - $this->setCache($options['cache']); - $this->functionCallbacks = array(); - $this->filterCallbacks = array(); - - $this->addExtension(new Twig_Extension_Core()); - $this->addExtension(new Twig_Extension_Escaper($options['autoescape'])); - $this->addExtension(new Twig_Extension_Optimizer($options['optimizations'])); - $this->extensionInitialized = false; - $this->staging = new Twig_Extension_Staging(); - } - - /** - * 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; - } - - /** - * Enables debugging mode. - */ - public function enableDebug() - { - $this->debug = true; - } - - /** - * Disables debugging mode. - */ - public function disableDebug() - { - $this->debug = false; - } - - /** - * 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; - } - - /** - * Disables the strict_variables option. - */ - public function disableStrictVariables() - { - $this->strictVariables = false; - } - - /** - * 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 cache directory or false if cache is disabled. - * - * @return string|false - */ - public function getCache() - { - return $this->cache; - } - - /** - * Sets the cache directory or false if cache is disabled. - * - * @param string|false $cache The absolute path to the compiled templates, - * or false to disable cache - */ - public function setCache($cache) - { - $this->cache = $cache ? $cache : false; - } - - /** - * 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 - */ - public function getCacheFilename($name) - { - if (false === $this->cache) { - return false; - } - - $class = substr($this->getTemplateClass($name), strlen($this->templateClassPrefix)); - - return $this->getCache().'/'.substr($class, 0, 2).'/'.substr($class, 2, 2).'/'.substr($class, 4).'.php'; - } - - /** - * Gets the template class associated with the given string. - * - * @param string $name The name for which to calculate the template class name - * @param int $index The index if it is an embedded template - * - * @return string The template class name - */ - public function getTemplateClass($name, $index = null) - { - return $this->templateClassPrefix.hash('sha256', $this->getLoader()->getCacheKey($name)).(null === $index ? '' : '_'.$index); - } - - /** - * Gets the template class prefix. - * - * @return string The template class prefix - */ - public function getTemplateClassPrefix() - { - 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 by name. - * - * @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_Syntax When an error occurred during compilation - */ - public function loadTemplate($name, $index = null) - { - $cls = $this->getTemplateClass($name, $index); - - if (isset($this->loadedTemplates[$cls])) { - return $this->loadedTemplates[$cls]; - } - - if (!class_exists($cls, false)) { - if (false === $cache = $this->getCacheFilename($name)) { - eval('?>'.$this->compileSource($this->getLoader()->getSource($name), $name)); - } else { - if (!is_file($cache) || ($this->isAutoReload() && !$this->isTemplateFresh($name, filemtime($cache)))) { - $this->writeCacheFile($cache, $this->compileSource($this->getLoader()->getSource($name), $name)); - } - - require_once $cache; - } - } - - if (!$this->runtimeInitialized) { - $this->initRuntime(); - } - - return $this->loadedTemplates[$cls] = new $cls($this); - } - - /** - * 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 timestamp $time The last modification time of the cached template - * - * @return bool true if the template is fresh, false otherwise - */ - public function isTemplateFresh($name, $time) - { - foreach ($this->extensions as $extension) { - $r = new ReflectionObject($extension); - if (filemtime($r->getFileName()) > $time) { - return false; - } - } - - return $this->getLoader()->isFresh($name, $time); - } - - /** - * Tries to load a template consecutively from an array. - * - * Similar to loadTemplate() but it also accepts Twig_TemplateInterface instances and an array - * of templates where each is tried to be loaded. - * - * @param string|Twig_Template|array $names A template or an array of templates to try consecutively - * - * @return Twig_Template - * - * @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; - } - - 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. - */ - public function clearTemplateCache() - { - $this->loadedTemplates = array(); - } - - /** - * Clears the template cache files on the filesystem. - */ - public function clearCacheFiles() - { - if (false === $this->cache) { - return; - } - - foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($this->cache), RecursiveIteratorIterator::LEAVES_ONLY) as $file) { - if ($file->isFile()) { - @unlink($file->getPathname()); - } - } - } - - /** - * Gets the Lexer instance. - * - * @return Twig_LexerInterface A Twig_LexerInterface instance - */ - public function getLexer() - { - if (null === $this->lexer) { - $this->lexer = new Twig_Lexer($this); - } - - return $this->lexer; - } - - /** - * Sets the Lexer instance. - * - * @param Twig_LexerInterface A Twig_LexerInterface instance - */ - public function setLexer(Twig_LexerInterface $lexer) - { - $this->lexer = $lexer; - } - - /** - * Tokenizes a source code. - * - * @param string $source The template source code - * @param string $name The template name - * - * @return Twig_TokenStream A Twig_TokenStream instance - * - * @throws Twig_Error_Syntax When the code is syntactically wrong - */ - public function tokenize($source, $name = null) - { - return $this->getLexer()->tokenize($source, $name); - } - - /** - * Gets the Parser instance. - * - * @return Twig_ParserInterface A Twig_ParserInterface instance - */ - public function getParser() - { - if (null === $this->parser) { - $this->parser = new Twig_Parser($this); - } - - return $this->parser; - } - - /** - * Sets the Parser instance. - * - * @param Twig_ParserInterface A Twig_ParserInterface instance - */ - public function setParser(Twig_ParserInterface $parser) - { - $this->parser = $parser; - } - - /** - * Converts a token stream to a node tree. - * - * @param Twig_TokenStream $stream A token stream instance - * - * @return Twig_Node_Module A node tree - * - * @throws Twig_Error_Syntax When the token stream is syntactically or semantically wrong - */ - public function parse(Twig_TokenStream $stream) - { - return $this->getParser()->parse($stream); - } - - /** - * Gets the Compiler instance. - * - * @return Twig_CompilerInterface A Twig_CompilerInterface instance - */ - public function getCompiler() - { - if (null === $this->compiler) { - $this->compiler = new Twig_Compiler($this); - } - - return $this->compiler; - } - - /** - * Sets the Compiler instance. - * - * @param Twig_CompilerInterface $compiler A Twig_CompilerInterface instance - */ - public function setCompiler(Twig_CompilerInterface $compiler) - { - $this->compiler = $compiler; - } - - /** - * Compiles a node and returns the PHP code. - * - * @param Twig_NodeInterface $node A Twig_NodeInterface instance - * - * @return string The compiled PHP source code - */ - public function compile(Twig_NodeInterface $node) - { - return $this->getCompiler()->compile($node)->getSource(); - } - - /** - * Compiles a template source code. - * - * @param string $source The template source code - * @param string $name The template name - * - * @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) - { - try { - return $this->compile($this->parse($this->tokenize($source, $name))); - } catch (Twig_Error $e) { - $e->setTemplateFile($name); - 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, $name, $e); - } - } - - /** - * Sets the Loader instance. - * - * @param Twig_LoaderInterface $loader A Twig_LoaderInterface instance - */ - public function setLoader(Twig_LoaderInterface $loader) - { - $this->loader = $loader; - } - - /** - * Gets the Loader instance. - * - * @return Twig_LoaderInterface A Twig_LoaderInterface instance - */ - 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. - */ - public function initRuntime() - { - $this->runtimeInitialized = true; - - foreach ($this->getExtensions() as $extension) { - $extension->initRuntime($this); - } - } - - /** - * Returns true if the given extension is registered. - * - * @param string $name The extension name - * - * @return bool Whether the extension is registered or not - */ - public function hasExtension($name) - { - return isset($this->extensions[$name]); - } - - /** - * Gets an extension by name. - * - * @param string $name The extension name - * - * @return Twig_ExtensionInterface A Twig_ExtensionInterface instance - */ - public function getExtension($name) - { - if (!isset($this->extensions[$name])) { - throw new Twig_Error_Runtime(sprintf('The "%s" extension is not enabled.', $name)); - } - - return $this->extensions[$name]; - } - - /** - * Registers an extension. - * - * @param Twig_ExtensionInterface $extension A Twig_ExtensionInterface instance - */ - 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())); - } - - $this->extensions[$extension->getName()] = $extension; - } - - /** - * 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) - { - if ($this->extensionInitialized) { - throw new LogicException(sprintf('Unable to remove extension "%s" as extensions have already been initialized.', $name)); - } - - unset($this->extensions[$name]); - } - - /** - * 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 array An array of extensions - */ - public function getExtensions() - { - return $this->extensions; - } - - /** - * Registers a Token Parser. - * - * @param Twig_TokenParserInterface $parser A Twig_TokenParserInterface instance - */ - 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 A broker containing token parsers - */ - 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[] An array of Twig_TokenParserInterface instances - */ - public function getTags() - { - $tags = array(); - foreach ($this->getTokenParsers()->getParsers() as $parser) { - if ($parser instanceof Twig_TokenParserInterface) { - $tags[$parser->getTag()] = $parser; - } - } - - return $tags; - } - - /** - * Registers a Node Visitor. - * - * @param Twig_NodeVisitorInterface $visitor A Twig_NodeVisitorInterface instance - */ - 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[] An array of Twig_NodeVisitorInterface instances - */ - 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 A Twig_FilterInterface instance or a Twig_SimpleFilter instance - */ - 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(); - } - - 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 - */ - 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 registerUndefinedFunctionCallback. - * - * @return Twig_FilterInterface[] An array of Twig_FilterInterface instances - * - * @see registerUndefinedFilterCallback - */ - 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(); - } - - 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[] An array of Twig_TestInterface instances - */ - 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 - */ - 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 A Twig_FunctionInterface instance or a Twig_SimpleFunction instance - */ - 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(); - } - - 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 - */ - 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[] An array of Twig_FunctionInterface instances - * - * @see registerUndefinedFunctionCallback - */ - 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(); - } - - /* This condition must be uncommented in Twig 2.0 - if (!array_key_exists($name, $this->globals)) { - 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 - */ - 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 - */ - public function getUnaryOperators() - { - if (!$this->extensionInitialized) { - $this->initExtensions(); - } - - return $this->unaryOperators; - } - - /** - * Gets the registered binary Operators. - * - * @return array An array of binary operators - */ - public function getBinaryOperators() - { - if (!$this->extensionInitialized) { - $this->initExtensions(); - } - - return $this->binaryOperators; - } - - public 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); - } - - protected function initGlobals() - { - $globals = array(); - foreach ($this->extensions as $extension) { - $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); - } - - protected function initExtensions() - { - if ($this->extensionInitialized) { - return; - } - - $this->extensionInitialized = true; - $this->parsers = new Twig_TokenParserBroker(); - $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); - } - - protected function initExtension(Twig_ExtensionInterface $extension) - { - // filters - foreach ($extension->getFilters() as $name => $filter) { - if ($name instanceof Twig_SimpleFilter) { - $filter = $name; - $name = $filter->getName(); - } elseif ($filter instanceof Twig_SimpleFilter) { - $name = $filter->getName(); - } - - $this->filters[$name] = $filter; - } - - // functions - foreach ($extension->getFunctions() as $name => $function) { - if ($name instanceof Twig_SimpleFunction) { - $function = $name; - $name = $function->getName(); - } elseif ($function instanceof Twig_SimpleFunction) { - $name = $function->getName(); - } - - $this->functions[$name] = $function; - } - - // tests - foreach ($extension->getTests() as $name => $test) { - if ($name instanceof Twig_SimpleTest) { - $test = $name; - $name = $test->getName(); - } elseif ($test instanceof Twig_SimpleTest) { - $name = $test->getName(); - } - - $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) { - $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 (2 !== count($operators)) { - throw new InvalidArgumentException(sprintf('"%s::getOperators()" does not return a valid operators array.', get_class($extension))); - } - - $this->unaryOperators = array_merge($this->unaryOperators, $operators[0]); - $this->binaryOperators = array_merge($this->binaryOperators, $operators[1]); - } - } - - protected function writeCacheFile($file, $content) - { - $dir = dirname($file); - if (!is_dir($dir)) { - if (false === @mkdir($dir, 0777, true) && !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($file)); - if (false !== @file_put_contents($tmpFile, $content)) { - // rename does not work on Win32 before 5.2.6 - if (@rename($tmpFile, $file) || (@copy($tmpFile, $file) && unlink($tmpFile))) { - @chmod($file, 0666 & ~umask()); - - return; - } - } - - throw new RuntimeException(sprintf('Failed to write cache file "%s".', $file)); - } -} diff --git a/vendor/twig/twig/lib/Twig/Error.php b/vendor/twig/twig/lib/Twig/Error.php deleted file mode 100644 index 67728874f..000000000 --- a/vendor/twig/twig/lib/Twig/Error.php +++ /dev/null @@ -1,248 +0,0 @@ - - */ -class Twig_Error extends Exception -{ - protected $lineno; - protected $filename; - protected $rawMessage; - protected $previous; - - /** - * Constructor. - * - * Set both the line number and the filename 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 filename 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 string $filename The template file name where the error occurred - * @param Exception $previous The previous exception - */ - public function __construct($message, $lineno = -1, $filename = null, Exception $previous = null) - { - if (version_compare(PHP_VERSION, '5.3.0', '<')) { - $this->previous = $previous; - parent::__construct(''); - } else { - parent::__construct('', 0, $previous); - } - - $this->lineno = $lineno; - $this->filename = $filename; - - if (-1 === $this->lineno || null === $this->filename) { - $this->guessTemplateInfo(); - } - - $this->rawMessage = $message; - - $this->updateRepr(); - } - - /** - * Gets the raw message. - * - * @return string The raw message - */ - public function getRawMessage() - { - return $this->rawMessage; - } - - /** - * Gets the filename where the error occurred. - * - * @return string The filename - */ - public function getTemplateFile() - { - return $this->filename; - } - - /** - * Sets the filename where the error occurred. - * - * @param string $filename The filename - */ - public function setTemplateFile($filename) - { - $this->filename = $filename; - - $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(); - } - - 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)); - } - - protected function updateRepr() - { - $this->message = $this->rawMessage; - - $dot = false; - if ('.' === substr($this->message, -1)) { - $this->message = substr($this->message, 0, -1); - $dot = true; - } - - if ($this->filename) { - if (is_string($this->filename) || (is_object($this->filename) && method_exists($this->filename, '__toString'))) { - $filename = sprintf('"%s"', $this->filename); - } else { - $filename = json_encode($this->filename); - } - $this->message .= sprintf(' in %s', $filename); - } - - if ($this->lineno && $this->lineno >= 0) { - $this->message .= sprintf(' at line %d', $this->lineno); - } - - if ($dot) { - $this->message .= '.'; - } - } - - protected function guessTemplateInfo() - { - $template = null; - $templateClass = null; - - if (version_compare(phpversion(), '5.3.6', '>=')) { - $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 filename - if (null !== $template && null === $this->filename) { - $this->filename = $template->getTemplateName(); - } - - if (null === $template || $this->lineno > -1) { - return; - } - - $r = new ReflectionObject($template); - $file = $r->getFileName(); - - // hhvm has a bug where eval'ed files comes out as the current directory - if (is_dir($file)) { - $file = ''; - } - - $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(); - 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; - } - } - } - } - } -} diff --git a/vendor/twig/twig/lib/Twig/Error/Loader.php b/vendor/twig/twig/lib/Twig/Error/Loader.php deleted file mode 100644 index 68efb574a..000000000 --- a/vendor/twig/twig/lib/Twig/Error/Loader.php +++ /dev/null @@ -1,31 +0,0 @@ - - */ -class Twig_Error_Loader extends Twig_Error -{ - public function __construct($message, $lineno = -1, $filename = null, Exception $previous = null) - { - parent::__construct($message, false, false, $previous); - } -} diff --git a/vendor/twig/twig/lib/Twig/Error/Runtime.php b/vendor/twig/twig/lib/Twig/Error/Runtime.php deleted file mode 100644 index 8b6ceddb9..000000000 --- a/vendor/twig/twig/lib/Twig/Error/Runtime.php +++ /dev/null @@ -1,20 +0,0 @@ - - */ -class Twig_Error_Runtime extends Twig_Error -{ -} diff --git a/vendor/twig/twig/lib/Twig/Error/Syntax.php b/vendor/twig/twig/lib/Twig/Error/Syntax.php deleted file mode 100644 index 0f5c57928..000000000 --- a/vendor/twig/twig/lib/Twig/Error/Syntax.php +++ /dev/null @@ -1,20 +0,0 @@ - - */ -class Twig_Error_Syntax extends Twig_Error -{ -} diff --git a/vendor/twig/twig/lib/Twig/ExistsLoaderInterface.php b/vendor/twig/twig/lib/Twig/ExistsLoaderInterface.php deleted file mode 100644 index 48df9e1a3..000000000 --- a/vendor/twig/twig/lib/Twig/ExistsLoaderInterface.php +++ /dev/null @@ -1,29 +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); -} diff --git a/vendor/twig/twig/lib/Twig/ExpressionParser.php b/vendor/twig/twig/lib/Twig/ExpressionParser.php deleted file mode 100644 index 01594f710..000000000 --- a/vendor/twig/twig/lib/Twig/ExpressionParser.php +++ /dev/null @@ -1,598 +0,0 @@ - - */ -class Twig_ExpressionParser -{ - const OPERATOR_LEFT = 1; - const OPERATOR_RIGHT = 2; - - protected $parser; - protected $unaryOperators; - protected $binaryOperators; - - public function __construct(Twig_Parser $parser, array $unaryOperators, array $binaryOperators) - { - $this->parser = $parser; - $this->unaryOperators = $unaryOperators; - $this->binaryOperators = $binaryOperators; - } - - 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 (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; - } - - default: - if ($token->test(Twig_Token::PUNCTUATION_TYPE, '[')) { - $node = $this->parseArrayExpression(); - } elseif ($token->test(Twig_Token::PUNCTUATION_TYPE, '{')) { - $node = $this->parseHashExpression(); - } else { - throw new Twig_Error_Syntax(sprintf('Unexpected token "%s" of value "%s"', Twig_Token::typeToEnglish($token->getType()), $token->getValue()), $token->getLine(), $this->parser->getFilename()); - } - } - - 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->getLine()); - } - - 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(), $this->parser->getFilename()); - } - - $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 ($token->getType() == Twig_Token::PUNCTUATION_TYPE) { - 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': - $args = $this->parseArguments(); - if (!count($this->parser->getBlockStack())) { - throw new Twig_Error_Syntax('Calling "parent" outside a block is forbidden', $line, $this->parser->getFilename()); - } - - 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->getFilename()); - } - - return new Twig_Node_Expression_Parent($this->parser->peekBlockStack(), $line); - case 'block': - return new Twig_Node_Expression_BlockReference($this->parseArguments()->getNode(0), false, $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->getFilename()); - } - - return new Twig_Node_Expression_GetAttr($args->getNode(0), $args->getNode(1), count($args) > 2 ? $args->getNode(2) : new Twig_Node_Expression_Array(array(), $line), 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 ( - $token->getType() == Twig_Token::NAME_TYPE - || - $token->getType() == Twig_Token::NUMBER_TYPE - || - ($token->getType() == Twig_Token::OPERATOR_TYPE && 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_TemplateInterface::METHOD_CALL; - foreach ($this->parseArguments() as $n) { - $arguments->addElement($n); - } - } - } else { - throw new Twig_Error_Syntax('Expected name or number', $lineno, $this->parser->getFilename()); - } - - 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(), $this->parser->getFilename()); - } - - $node = new Twig_Node_Expression_MethodCall($node, 'get'.$arg->getAttribute('value'), $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 - */ - 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(), $this->parser->getFilename()); - } - $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(), $this->parser->getFilename()); - } - } 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() - { - $targets = array(); - while (true) { - $token = $this->parser->getStream()->expect(Twig_Token::NAME_TYPE, null, 'Only variables can be assigned to'); - if (in_array($token->getValue(), array('true', 'false', 'none'))) { - throw new Twig_Error_Syntax(sprintf('You cannot assign a value to "%s"', $token->getValue()), $token->getLine(), $this->parser->getFilename()); - } - $targets[] = new Twig_Node_Expression_AssignName($token->getValue(), $token->getLine()); - - if (!$this->parser->getStream()->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); - } - - protected function getFunctionNodeClass($name, $line) - { - $env = $this->parser->getEnvironment(); - - if (false === $function = $env->getFunction($name)) { - $message = sprintf('The function "%s" does not exist', $name); - if ($alternatives = $env->computeAlternatives($name, array_keys($env->getFunctions()))) { - $message = sprintf('%s. Did you mean "%s"', $message, implode('", "', $alternatives)); - } - - throw new Twig_Error_Syntax($message, $line, $this->parser->getFilename()); - } - - 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) - { - $env = $this->parser->getEnvironment(); - - if (false === $filter = $env->getFilter($name)) { - $message = sprintf('The filter "%s" does not exist', $name); - if ($alternatives = $env->computeAlternatives($name, array_keys($env->getFilters()))) { - $message = sprintf('%s. Did you mean "%s"', $message, implode('", "', $alternatives)); - } - - throw new Twig_Error_Syntax($message, $line, $this->parser->getFilename()); - } - - 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)) { - return false; - } - - foreach ($node as $n) { - if (!$this->checkConstantExpression($n)) { - return false; - } - } - - return true; - } -} diff --git a/vendor/twig/twig/lib/Twig/Extension.php b/vendor/twig/twig/lib/Twig/Extension.php deleted file mode 100644 index 5c8ad5c96..000000000 --- a/vendor/twig/twig/lib/Twig/Extension.php +++ /dev/null @@ -1,93 +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; - } - - /** - * Returns the token parser instance to add to the existing list. - * - * @return Twig_TokenParser[] An array of Twig_TokenParser instances - */ - 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(), - ); - } - - /** - * Returns a list of filters to add to the existing list. - * - * @return array An array of filters - */ - 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', 'strtr'), - 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', 'trim'), - 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'), - 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; - } - - /** - * Returns a list of global functions to add to the existing list. - * - * @return array An array of global functions - */ - 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'))), - ); - } - - /** - * Returns a list of tests to add to the existing list. - * - * @return array An array of tests - */ - 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')), - 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')), - 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'), - ); - } - - /** - * Returns a list of operators to add to the existing list. - * - * @return array An array of operators - */ - 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, 'callable' => array($this, 'parseTestExpression'), 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT), - 'is not' => array('precedence' => 100, 'callable' => array($this, 'parseNotTestExpression'), 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT), - '**' => array('precedence' => 200, 'class' => 'Twig_Node_Expression_Binary_Power', 'associativity' => Twig_ExpressionParser::OPERATOR_RIGHT), - ), - ); - } - - public function parseNotTestExpression(Twig_Parser $parser, Twig_NodeInterface $node) - { - return new Twig_Node_Expression_Unary_Not($this->parseTestExpression($parser, $node), $parser->getCurrentToken()->getLine()); - } - - public function parseTestExpression(Twig_Parser $parser, Twig_NodeInterface $node) - { - $stream = $parser->getStream(); - $name = $stream->expect(Twig_Token::NAME_TYPE)->getValue(); - $class = $this->getTestNodeClass($parser, $name, $node->getLine()); - $arguments = null; - if ($stream->test(Twig_Token::PUNCTUATION_TYPE, '(')) { - $arguments = $parser->getExpressionParser()->parseArguments(true); - } - - return new $class($node, $name, $arguments, $parser->getCurrentToken()->getLine()); - } - - protected function getTestNodeClass(Twig_Parser $parser, $name, $line) - { - $env = $parser->getEnvironment(); - $testMap = $env->getTests(); - $testName = null; - if (isset($testMap[$name])) { - $testName = $name; - } elseif ($parser->getStream()->test(Twig_Token::NAME_TYPE)) { - // try 2-words tests - $name = $name.' '.$parser->getCurrentToken()->getValue(); - - if (isset($testMap[$name])) { - $parser->getStream()->next(); - - $testName = $name; - } - } - - if (null === $testName) { - $message = sprintf('The test "%s" does not exist', $name); - if ($alternatives = $env->computeAlternatives($name, array_keys($env->getTests()))) { - $message = sprintf('%s. Did you mean "%s"', $message, implode('", "', $alternatives)); - } - - throw new Twig_Error_Syntax($message, $line, $parser->getFilename()); - } - - if ($testMap[$name] instanceof Twig_SimpleTest) { - return $testMap[$name]->getNodeClass(); - } - - return $testMap[$name] instanceof Twig_Test_Node ? $testMap[$name]->getClass() : 'Twig_Node_Expression_Test'; - } - - /** - * Returns the name of the extension. - * - * @return string The extension name - */ - public function getName() - { - return 'core'; - } -} - -/** - * Cycles over a value. - * - * @param ArrayAccess|array $values An array or an ArrayAccess instance - * @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 A Twig_Environment instance - * @param Traversable|array|int|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 A Twig_Environment instance - * @param DateTime|DateInterval|string $date A date - * @param string $format A format - * @param DateTimeZone|string $timezone A timezone - * - * @return string The formatted date - */ -function twig_date_format_filter(Twig_Environment $env, $date, $format = null, $timezone = null) -{ - if (null === $format) { - $formats = $env->getExtension('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 A Twig_Environment instance - * @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); - $date->modify($modifier); - - return $date; -} - -/** - * Converts an input to a DateTime instance. - * - *
- *    {% if date(user.created_at) < date('+2days') %}
- *      {# do something #}
- *    {% endif %}
- * 
- * - * @param Twig_Environment $env A Twig_Environment instance - * @param DateTime|string $date A date - * @param DateTimeZone|string $timezone A timezone - * - * @return DateTime A DateTime instance - */ -function twig_date_converter(Twig_Environment $env, $date = null, $timezone = null) -{ - // determine the timezone - if (!$timezone) { - $defaultTimezone = $env->getExtension('core')->getTimezone(); - } elseif (!$timezone instanceof DateTimeZone) { - $defaultTimezone = new DateTimeZone($timezone); - } else { - $defaultTimezone = $timezone; - } - - // immutable dates - if ($date instanceof DateTimeImmutable) { - return false !== $timezone ? $date->setTimezone($defaultTimezone) : $date; - } - - if ($date instanceof DateTime || $date instanceof DateTimeInterface) { - $date = clone $date; - if (false !== $timezone) { - $date->setTimezone($defaultTimezone); - } - - return $date; - } - - $asString = (string) $date; - if (ctype_digit($asString) || (!empty($asString) && '-' === $asString[0] && ctype_digit(substr($asString, 1)))) { - $date = '@'.$date; - } - - $date = new DateTime($date, $defaultTimezone); - if (false !== $timezone) { - $date->setTimezone($defaultTimezone); - } - - return $date; -} - -/** - * 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 A Twig_Environment instance - * @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('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 (version_compare(PHP_VERSION, '5.3.0', '<')) { - /** - * 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 $arr1 An array - * @param array $arr2 An array - * - * @return array The merged array - */ -function twig_array_merge($arr1, $arr2) -{ - if (!is_array($arr1) || !is_array($arr2)) { - throw new Twig_Error_Runtime('The merge filter only works with arrays or hashes.'); - } - - return array_merge($arr1, $arr2); -} - -/** - * Slices a variable. - * - * @param Twig_Environment $env A Twig_Environment instance - * @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) { - $item = iterator_to_array($item, false); - } - - 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 mb_substr($item, $start, null === $length ? mb_strlen($item, $charset) - $start : $length, $charset); - } - - return null === $length ? substr($item, $start) : substr($item, $start, $length); -} - -/** - * Returns the first element of the item. - * - * @param Twig_Environment $env A Twig_Environment instance - * @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 A Twig_Environment instance - * @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 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($value, $delimiter, $limit = null) -{ - if (empty($delimiter)) { - return str_split($value, null === $limit ? 1 : $limit); - } - - return null === $limit ? explode($delimiter, $value) : explode($delimiter, $value, $limit); -} - -// The '_default' filter is used internally to avoid using the ternary operator -// which costs a lot for big contexts (before PHP 5.4). So, on average, -// a function call is cheaper. -function _twig_default_filter($value, $default = '') -{ - if (twig_test_empty($value)) { - return $default; - } - - return $value; -} - -/** - * Returns the keys for the given array. - * - * It is useful when you want to iterate over the keys of an array: - * - *
- *  {% for key in array|keys %}
- *      {# ... #}
- *  {% endfor %}
- * 
- * - * @param array $array An array - * - * @return array The keys - */ -function twig_get_array_keys_filter($array) -{ - if (is_object($array) && $array instanceof Traversable) { - return array_keys(iterator_to_array($array)); - } - - if (!is_array($array)) { - return array(); - } - - return array_keys($array); -} - -/** - * Reverses a variable. - * - * @param Twig_Environment $env A Twig_Environment instance - * @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 (is_object($item) && $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 $array An array - */ -function twig_sort_filter($array) -{ - asort($array); - - return $array; -} - -/* used internally */ -function twig_in_filter($value, $compare) -{ - if (is_array($compare)) { - return in_array($value, $compare, is_object($value)); - } elseif (is_string($compare)) { - if (!strlen($value)) { - return empty($compare); - } - - return false !== strpos($compare, (string) $value); - } elseif ($compare instanceof Traversable) { - return in_array($value, iterator_to_array($compare, false), is_object($value)); - } - - return false; -} - -/** - * Escapes a string. - * - * @param Twig_Environment $env A Twig_Environment instance - * @param string $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) - */ -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; - } else { - return $string; - } - } - - if (null === $charset) { - $charset = $env->getCharset(); - } - - switch ($strategy) { - case 'html': - // see http://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; - - if (null === $htmlspecialcharsCharsets) { - if ('hiphop' === substr(PHP_VERSION, -6)) { - $htmlspecialcharsCharsets = array('utf-8' => true, 'UTF-8' => true); - } else { - $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 \xHH 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) ? false : true)) { - 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) ? false : true)) { - 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) ? false : true)) { - 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': - // hackish test to avoid version_compare that is much slower, this works unless PHP releases a 5.10.* - // at that point however PHP 5.2.* support can be removed - if (PHP_VERSION < '5.3.0') { - return str_replace('%7E', '~', rawurlencode($string)); - } - - return rawurlencode($string); - - default: - static $escapers; - - if (null === $escapers) { - $escapers = $env->getExtension('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)); - } -} - -/* used internally */ -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]; - - // \xHH - if (!isset($char[1])) { - return '\\x'.strtoupper(substr('00'.bin2hex($char), -2)); - } - - // \uHHHH - $char = twig_convert_encoding($char, 'UTF-16BE', 'UTF-8'); - - return '\\u'.strtoupper(substr('0000'.bin2hex($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. (http://www.zend.com) - * @license http://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 && $chr != "\t" && $chr != "\n" && $chr != "\r") || ($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 (strlen($chr) == 1) { - $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('&#x%s;', $hex); -} - -// add multibyte extensions if possible -if (function_exists('mb_get_info')) { - /** - * Returns the length of a variable. - * - * @param Twig_Environment $env A Twig_Environment instance - * @param mixed $thing A variable - * - * @return int The length of the value - */ - function twig_length_filter(Twig_Environment $env, $thing) - { - return is_scalar($thing) ? mb_strlen($thing, $env->getCharset()) : count($thing); - } - - /** - * Converts a string to uppercase. - * - * @param Twig_Environment $env A Twig_Environment instance - * @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 A Twig_Environment instance - * @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 A Twig_Environment instance - * @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 A Twig_Environment instance - * @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 A Twig_Environment instance - * @param mixed $thing A variable - * - * @return int The length of the value - */ - function twig_length_filter(Twig_Environment $env, $thing) - { - return is_scalar($thing) ? strlen($thing) : count($thing); - } - - /** - * Returns a titlecased string. - * - * @param Twig_Environment $env A Twig_Environment instance - * @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 A Twig_Environment instance - * @param string $string A string - * - * @return string The capitalized string - */ - function twig_capitalize_string_filter(Twig_Environment $env, $string) - { - return ucfirst(strtolower($string)); - } -} - -/* used internally */ -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); - } - - 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 traversable %}
- *     {# ... #}
- * {% 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 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 $with_context Whether to pass the current context variables or not - * @param bool $ignore_missing 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('sandbox')) { - $sandbox = $env->getExtension('sandbox'); - if (!$alreadySandboxed = $sandbox->isSandboxed()) { - $sandbox->enableSandbox(); - } - } - - try { - return $env->resolveTemplate($template)->render($variables); - } catch (Twig_Error_Loader $e) { - if (!$ignoreMissing) { - throw $e; - } - } - - if ($isSandboxed && !$alreadySandboxed) { - $sandbox->disableSandbox(); - } -} - -/** - * Returns a template content without rendering it. - * - * @param string $name The template name - * - * @return string The template source - */ -function twig_source(Twig_Environment $env, $name) -{ - return $env->getLoader()->getSource($name); -} - -/** - * 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); -} - -/** - * 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) { - $last = count($result) - 1; - if ($fillCount = $size - count($result[$last])) { - $result[$last] = array_merge( - $result[$last], - array_fill(0, $fillCount, $fill) - ); - } - } - - return $result; -} diff --git a/vendor/twig/twig/lib/Twig/Extension/Debug.php b/vendor/twig/twig/lib/Twig/Extension/Debug.php deleted file mode 100644 index e3a85bfe8..000000000 --- a/vendor/twig/twig/lib/Twig/Extension/Debug.php +++ /dev/null @@ -1,71 +0,0 @@ - $isDumpOutputHtmlSafe ? array('html') : array(), 'needs_context' => true, 'needs_environment' => true)), - ); - } - - /** - * Returns the name of the extension. - * - * @return string The extension name - */ - 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(); -} diff --git a/vendor/twig/twig/lib/Twig/Extension/Escaper.php b/vendor/twig/twig/lib/Twig/Extension/Escaper.php deleted file mode 100644 index d3e5ad0ec..000000000 --- a/vendor/twig/twig/lib/Twig/Extension/Escaper.php +++ /dev/null @@ -1,107 +0,0 @@ -setDefaultStrategy($defaultStrategy); - } - - /** - * Returns the token parser instances to add to the existing list. - * - * @return array An array of Twig_TokenParserInterface or Twig_TokenParserBrokerInterface instances - */ - public function getTokenParsers() - { - return array(new Twig_TokenParser_AutoEscape()); - } - - /** - * Returns the node visitor instances to add to the existing list. - * - * @return Twig_NodeVisitorInterface[] An array of Twig_NodeVisitorInterface instances - */ - public function getNodeVisitors() - { - return array(new Twig_NodeVisitor_Escaper()); - } - - /** - * Returns a list of filters to add to the existing list. - * - * @return array An array of filters - */ - 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 - * "filename" as an argument and returns the strategy to use. - * - * @param mixed $defaultStrategy An escaping strategy - */ - public function setDefaultStrategy($defaultStrategy) - { - // for BC - if (true === $defaultStrategy) { - $defaultStrategy = 'html'; - } - - $this->defaultStrategy = $defaultStrategy; - } - - /** - * Gets the default strategy to use when not defined by the user. - * - * @param string $filename The template "filename" - * - * @return string The default strategy to use for the template - */ - public function getDefaultStrategy($filename) - { - // disable string callables to avoid calling a function named html or js, - // or any other upcoming escaping strategy - if (!is_string($this->defaultStrategy) && is_callable($this->defaultStrategy)) { - return call_user_func($this->defaultStrategy, $filename); - } - - return $this->defaultStrategy; - } - - /** - * Returns the name of the extension. - * - * @return string The extension name - */ - public function getName() - { - return 'escaper'; - } -} - -/** - * Marks a variable as being safe. - * - * @param string $string A PHP variable - */ -function twig_raw_filter($string) -{ - return $string; -} diff --git a/vendor/twig/twig/lib/Twig/Extension/Optimizer.php b/vendor/twig/twig/lib/Twig/Extension/Optimizer.php deleted file mode 100644 index 013fcb625..000000000 --- a/vendor/twig/twig/lib/Twig/Extension/Optimizer.php +++ /dev/null @@ -1,35 +0,0 @@ -optimizers = $optimizers; - } - - /** - * {@inheritdoc} - */ - public function getNodeVisitors() - { - return array(new Twig_NodeVisitor_Optimizer($this->optimizers)); - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return 'optimizer'; - } -} diff --git a/vendor/twig/twig/lib/Twig/Extension/Sandbox.php b/vendor/twig/twig/lib/Twig/Extension/Sandbox.php deleted file mode 100644 index c58259c6a..000000000 --- a/vendor/twig/twig/lib/Twig/Extension/Sandbox.php +++ /dev/null @@ -1,112 +0,0 @@ -policy = $policy; - $this->sandboxedGlobally = $sandboxed; - } - - /** - * Returns the token parser instances to add to the existing list. - * - * @return array An array of Twig_TokenParserInterface or Twig_TokenParserBrokerInterface instances - */ - public function getTokenParsers() - { - return array(new Twig_TokenParser_Sandbox()); - } - - /** - * Returns the node visitor instances to add to the existing list. - * - * @return Twig_NodeVisitorInterface[] An array of Twig_NodeVisitorInterface instances - */ - 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; - } - - /** - * Returns the name of the extension. - * - * @return string The extension name - */ - public function getName() - { - return 'sandbox'; - } -} diff --git a/vendor/twig/twig/lib/Twig/Extension/Staging.php b/vendor/twig/twig/lib/Twig/Extension/Staging.php deleted file mode 100644 index 8ab0f4596..000000000 --- a/vendor/twig/twig/lib/Twig/Extension/Staging.php +++ /dev/null @@ -1,113 +0,0 @@ - - */ -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) - { - $this->functions[$name] = $function; - } - - /** - * {@inheritdoc} - */ - public function getFunctions() - { - return $this->functions; - } - - public function addFilter($name, $filter) - { - $this->filters[$name] = $filter; - } - - /** - * {@inheritdoc} - */ - public function getFilters() - { - return $this->filters; - } - - public function addNodeVisitor(Twig_NodeVisitorInterface $visitor) - { - $this->visitors[] = $visitor; - } - - /** - * {@inheritdoc} - */ - public function getNodeVisitors() - { - return $this->visitors; - } - - public function addTokenParser(Twig_TokenParserInterface $parser) - { - $this->tokenParsers[] = $parser; - } - - /** - * {@inheritdoc} - */ - public function getTokenParsers() - { - return $this->tokenParsers; - } - - public function addGlobal($name, $value) - { - $this->globals[$name] = $value; - } - - /** - * {@inheritdoc} - */ - public function getGlobals() - { - return $this->globals; - } - - public function addTest($name, $test) - { - $this->tests[$name] = $test; - } - - /** - * {@inheritdoc} - */ - public function getTests() - { - return $this->tests; - } - - /** - * {@inheritdoc} - */ - public function getName() - { - return 'staging'; - } -} diff --git a/vendor/twig/twig/lib/Twig/Extension/StringLoader.php b/vendor/twig/twig/lib/Twig/Extension/StringLoader.php deleted file mode 100644 index 5e1a60d0a..000000000 --- a/vendor/twig/twig/lib/Twig/Extension/StringLoader.php +++ /dev/null @@ -1,64 +0,0 @@ - true)), - ); - } - - /** - * {@inheritdoc} - */ - 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 - * - * @return Twig_Template A Twig_Template instance - */ -function twig_template_from_string(Twig_Environment $env, $template) -{ - $name = sprintf('__string_template__%s', hash('sha256', uniqid(mt_rand(), true), false)); - - $loader = new Twig_Loader_Chain(array( - new Twig_Loader_Array(array($name => $template)), - $current = $env->getLoader(), - )); - - $env->setLoader($loader); - try { - $template = $env->loadTemplate($name); - } catch (Exception $e) { - $env->setLoader($current); - - throw $e; - } - $env->setLoader($current); - - return $template; -} diff --git a/vendor/twig/twig/lib/Twig/ExtensionInterface.php b/vendor/twig/twig/lib/Twig/ExtensionInterface.php deleted file mode 100644 index 49541b02e..000000000 --- a/vendor/twig/twig/lib/Twig/ExtensionInterface.php +++ /dev/null @@ -1,83 +0,0 @@ - - */ -interface Twig_ExtensionInterface -{ - /** - * Initializes the runtime environment. - * - * This is where you can load some file that contains filter functions for instance. - * - * @param Twig_Environment $environment The current Twig_Environment instance - */ - public function initRuntime(Twig_Environment $environment); - - /** - * Returns the token parser instances to add to the existing list. - * - * @return array An array of Twig_TokenParserInterface or Twig_TokenParserBrokerInterface instances - */ - public function getTokenParsers(); - - /** - * Returns the node visitor instances to add to the existing list. - * - * @return Twig_NodeVisitorInterface[] An array of Twig_NodeVisitorInterface instances - */ - public function getNodeVisitors(); - - /** - * Returns a list of filters to add to the existing list. - * - * @return array An array of filters - */ - public function getFilters(); - - /** - * Returns a list of tests to add to the existing list. - * - * @return array An array of tests - */ - public function getTests(); - - /** - * Returns a list of functions to add to the existing list. - * - * @return array An array of functions - */ - public function getFunctions(); - - /** - * Returns a list of operators to add to the existing list. - * - * @return array An array of operators - */ - public function getOperators(); - - /** - * Returns a list of global variables to add to the existing list. - * - * @return array An array of global variables - */ - public function getGlobals(); - - /** - * Returns the name of the extension. - * - * @return string The extension name - */ - public function getName(); -} diff --git a/vendor/twig/twig/lib/Twig/Filter.php b/vendor/twig/twig/lib/Twig/Filter.php deleted file mode 100644 index 5cfbb6625..000000000 --- a/vendor/twig/twig/lib/Twig/Filter.php +++ /dev/null @@ -1,81 +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/vendor/twig/twig/lib/Twig/Filter/Function.php b/vendor/twig/twig/lib/Twig/Filter/Function.php deleted file mode 100644 index ad374a551..000000000 --- a/vendor/twig/twig/lib/Twig/Filter/Function.php +++ /dev/null @@ -1,37 +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/vendor/twig/twig/lib/Twig/Filter/Method.php b/vendor/twig/twig/lib/Twig/Filter/Method.php deleted file mode 100644 index 63c8c3be4..000000000 --- a/vendor/twig/twig/lib/Twig/Filter/Method.php +++ /dev/null @@ -1,39 +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', $this->extension->getName(), $this->method); - } -} diff --git a/vendor/twig/twig/lib/Twig/Filter/Node.php b/vendor/twig/twig/lib/Twig/Filter/Node.php deleted file mode 100644 index 8744c5e00..000000000 --- a/vendor/twig/twig/lib/Twig/Filter/Node.php +++ /dev/null @@ -1,39 +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/vendor/twig/twig/lib/Twig/FilterCallableInterface.php b/vendor/twig/twig/lib/Twig/FilterCallableInterface.php deleted file mode 100644 index 145534dfd..000000000 --- a/vendor/twig/twig/lib/Twig/FilterCallableInterface.php +++ /dev/null @@ -1,23 +0,0 @@ - - * @deprecated since 1.12 (to be removed in 2.0) - */ -interface Twig_FilterCallableInterface -{ - public function getCallable(); -} diff --git a/vendor/twig/twig/lib/Twig/FilterInterface.php b/vendor/twig/twig/lib/Twig/FilterInterface.php deleted file mode 100644 index 5319ecc9f..000000000 --- a/vendor/twig/twig/lib/Twig/FilterInterface.php +++ /dev/null @@ -1,42 +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/vendor/twig/twig/lib/Twig/Function.php b/vendor/twig/twig/lib/Twig/Function.php deleted file mode 100644 index b5ffb2b04..000000000 --- a/vendor/twig/twig/lib/Twig/Function.php +++ /dev/null @@ -1,71 +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/vendor/twig/twig/lib/Twig/Function/Function.php b/vendor/twig/twig/lib/Twig/Function/Function.php deleted file mode 100644 index d1e1b96a2..000000000 --- a/vendor/twig/twig/lib/Twig/Function/Function.php +++ /dev/null @@ -1,38 +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/vendor/twig/twig/lib/Twig/Function/Method.php b/vendor/twig/twig/lib/Twig/Function/Method.php deleted file mode 100644 index 67039a956..000000000 --- a/vendor/twig/twig/lib/Twig/Function/Method.php +++ /dev/null @@ -1,40 +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', $this->extension->getName(), $this->method); - } -} diff --git a/vendor/twig/twig/lib/Twig/Function/Node.php b/vendor/twig/twig/lib/Twig/Function/Node.php deleted file mode 100644 index 06a0d0dbe..000000000 --- a/vendor/twig/twig/lib/Twig/Function/Node.php +++ /dev/null @@ -1,39 +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/vendor/twig/twig/lib/Twig/FunctionCallableInterface.php b/vendor/twig/twig/lib/Twig/FunctionCallableInterface.php deleted file mode 100644 index 0aab4f5ec..000000000 --- a/vendor/twig/twig/lib/Twig/FunctionCallableInterface.php +++ /dev/null @@ -1,23 +0,0 @@ - - * @deprecated since 1.12 (to be removed in 2.0) - */ -interface Twig_FunctionCallableInterface -{ - public function getCallable(); -} diff --git a/vendor/twig/twig/lib/Twig/FunctionInterface.php b/vendor/twig/twig/lib/Twig/FunctionInterface.php deleted file mode 100644 index 67f4f89c0..000000000 --- a/vendor/twig/twig/lib/Twig/FunctionInterface.php +++ /dev/null @@ -1,39 +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/vendor/twig/twig/lib/Twig/Lexer.php b/vendor/twig/twig/lib/Twig/Lexer.php deleted file mode 100644 index ad3ec7d48..000000000 --- a/vendor/twig/twig/lib/Twig/Lexer.php +++ /dev/null @@ -1,409 +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; - protected $filename; - protected $options; - protected $regexes; - protected $position; - protected $positions; - protected $currentVarBlockLine; - - 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', - ); - } - - /** - * {@inheritdoc} - */ - public function tokenize($code, $filename = null) - { - 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", $code); - $this->filename = $filename; - $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->filename); - } - - if ($mbEncoding) { - mb_internal_encoding($mbEncoding); - } - - return new Twig_TokenStream($this->tokens, $this->filename); - } - - 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"', $this->state === self::STATE_BLOCK ? 'block' : 'variable'), $this->currentVarBlockLine, $this->filename); - } - } - - // 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->filename); - } - - 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->filename); - } - } - - $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->filename); - } - } - - protected function lexRawData($tag) - { - 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->filename); - } - - $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->filename); - } - - $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->filename); - } - - $this->popState(); - ++$this->cursor; - } - } - - 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); - } -} diff --git a/vendor/twig/twig/lib/Twig/LexerInterface.php b/vendor/twig/twig/lib/Twig/LexerInterface.php deleted file mode 100644 index 24a947870..000000000 --- a/vendor/twig/twig/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 $code The source code - * @param string $filename A unique identifier for the source code - * - * @return Twig_TokenStream A token stream instance - * - * @throws Twig_Error_Syntax When the code is syntactically wrong - */ - public function tokenize($code, $filename = null); -} diff --git a/vendor/twig/twig/lib/Twig/Loader/Array.php b/vendor/twig/twig/lib/Twig/Loader/Array.php deleted file mode 100644 index ac5610485..000000000 --- a/vendor/twig/twig/lib/Twig/Loader/Array.php +++ /dev/null @@ -1,95 +0,0 @@ - - */ -class Twig_Loader_Array implements Twig_LoaderInterface, Twig_ExistsLoaderInterface -{ - protected $templates = array(); - - /** - * Constructor. - * - * @param array $templates An array of templates (keys are the names, and values are the source code) - * - * @see Twig_Loader - */ - public function __construct(array $templates) - { - $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; - } - - /** - * {@inheritdoc} - */ - public function getSource($name) - { - $name = (string) $name; - if (!isset($this->templates[$name])) { - throw new Twig_Error_Loader(sprintf('Template "%s" is not defined.', $name)); - } - - return $this->templates[$name]; - } - - /** - * {@inheritdoc} - */ - public function exists($name) - { - return isset($this->templates[(string) $name]); - } - - /** - * {@inheritdoc} - */ - 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 $this->templates[$name]; - } - - /** - * {@inheritdoc} - */ - 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; - } -} diff --git a/vendor/twig/twig/lib/Twig/Loader/Chain.php b/vendor/twig/twig/lib/Twig/Loader/Chain.php deleted file mode 100644 index 7919eda62..000000000 --- a/vendor/twig/twig/lib/Twig/Loader/Chain.php +++ /dev/null @@ -1,138 +0,0 @@ - - */ -class Twig_Loader_Chain implements Twig_LoaderInterface, Twig_ExistsLoaderInterface -{ - private $hasSourceCache = array(); - protected $loaders = array(); - - /** - * Constructor. - * - * @param Twig_LoaderInterface[] $loaders An array of loader instances - */ - public function __construct(array $loaders = array()) - { - foreach ($loaders as $loader) { - $this->addLoader($loader); - } - } - - /** - * Adds a loader instance. - * - * @param Twig_LoaderInterface $loader A Loader instance - */ - public function addLoader(Twig_LoaderInterface $loader) - { - $this->loaders[] = $loader; - $this->hasSourceCache = array(); - } - - /** - * {@inheritdoc} - */ - public function getSource($name) - { - $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, implode(', ', $exceptions))); - } - - /** - * {@inheritdoc} - */ - 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 { - $loader->getSource($name); - - return $this->hasSourceCache[$name] = true; - } catch (Twig_Error_Loader $e) { - } - } - - return $this->hasSourceCache[$name] = false; - } - - /** - * {@inheritdoc} - */ - 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, implode(' ', $exceptions))); - } - - /** - * {@inheritdoc} - */ - 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, implode(' ', $exceptions))); - } -} diff --git a/vendor/twig/twig/lib/Twig/Loader/Filesystem.php b/vendor/twig/twig/lib/Twig/Loader/Filesystem.php deleted file mode 100644 index d0ae1cc1d..000000000 --- a/vendor/twig/twig/lib/Twig/Loader/Filesystem.php +++ /dev/null @@ -1,236 +0,0 @@ - - */ -class Twig_Loader_Filesystem implements Twig_LoaderInterface, Twig_ExistsLoaderInterface -{ - /** Identifier of the main namespace. */ - const MAIN_NAMESPACE = '__main__'; - - protected $paths = array(); - protected $cache = array(); - - /** - * Constructor. - * - * @param string|array $paths A path or an array of paths where to look for templates - */ - public function __construct($paths = array()) - { - 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 name - * - * @throws Twig_Error_Loader - */ - public function addPath($path, $namespace = self::MAIN_NAMESPACE) - { - // invalidate the cache - $this->cache = array(); - - if (!is_dir($path)) { - throw new Twig_Error_Loader(sprintf('The "%s" directory does not exist.', $path)); - } - - $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 name - * - * @throws Twig_Error_Loader - */ - public function prependPath($path, $namespace = self::MAIN_NAMESPACE) - { - // invalidate the cache - $this->cache = array(); - - if (!is_dir($path)) { - throw new Twig_Error_Loader(sprintf('The "%s" directory does not exist.', $path)); - } - - $path = rtrim($path, '/\\'); - - if (!isset($this->paths[$namespace])) { - $this->paths[$namespace][] = $path; - } else { - array_unshift($this->paths[$namespace], $path); - } - } - - /** - * {@inheritdoc} - */ - public function getSource($name) - { - return file_get_contents($this->findTemplate($name)); - } - - /** - * {@inheritdoc} - */ - public function getCacheKey($name) - { - return $this->findTemplate($name); - } - - /** - * {@inheritdoc} - */ - public function exists($name) - { - $name = $this->normalizeName($name); - - if (isset($this->cache[$name])) { - return true; - } - - try { - $this->findTemplate($name); - - return true; - } catch (Twig_Error_Loader $exception) { - return false; - } - } - - /** - * {@inheritdoc} - */ - public function isFresh($name, $time) - { - return filemtime($this->findTemplate($name)) <= $time; - } - - protected function findTemplate($name) - { - $name = $this->normalizeName($name); - - if (isset($this->cache[$name])) { - return $this->cache[$name]; - } - - $this->validateName($name); - - list($namespace, $shortname) = $this->parseName($name); - - if (!isset($this->paths[$namespace])) { - throw new Twig_Error_Loader(sprintf('There are no registered paths for namespace "%s".', $namespace)); - } - - foreach ($this->paths[$namespace] as $path) { - if (is_file($path.'/'.$shortname)) { - return $this->cache[$name] = $path.'/'.$shortname; - } - } - - throw new Twig_Error_Loader(sprintf('Unable to find template "%s" (looked into: %s).', $name, implode(', ', $this->paths[$namespace]))); - } - - 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,}#', '/', strtr((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)); - } - } - } -} diff --git a/vendor/twig/twig/lib/Twig/Loader/String.php b/vendor/twig/twig/lib/Twig/Loader/String.php deleted file mode 100644 index 8ad9856cc..000000000 --- a/vendor/twig/twig/lib/Twig/Loader/String.php +++ /dev/null @@ -1,59 +0,0 @@ - - */ -class Twig_Loader_String implements Twig_LoaderInterface, Twig_ExistsLoaderInterface -{ - /** - * {@inheritdoc} - */ - public function getSource($name) - { - return $name; - } - - /** - * {@inheritdoc} - */ - public function exists($name) - { - return true; - } - - /** - * {@inheritdoc} - */ - public function getCacheKey($name) - { - return $name; - } - - /** - * {@inheritdoc} - */ - public function isFresh($name, $time) - { - return true; - } -} diff --git a/vendor/twig/twig/lib/Twig/LoaderInterface.php b/vendor/twig/twig/lib/Twig/LoaderInterface.php deleted file mode 100644 index 4405291ff..000000000 --- a/vendor/twig/twig/lib/Twig/LoaderInterface.php +++ /dev/null @@ -1,52 +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 - */ - 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 timestamp $time 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); -} diff --git a/vendor/twig/twig/lib/Twig/Markup.php b/vendor/twig/twig/lib/Twig/Markup.php deleted file mode 100644 index 69871fcbd..000000000 --- a/vendor/twig/twig/lib/Twig/Markup.php +++ /dev/null @@ -1,37 +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); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node.php b/vendor/twig/twig/lib/Twig/Node.php deleted file mode 100644 index 978e76628..000000000 --- a/vendor/twig/twig/lib/Twig/Node.php +++ /dev/null @@ -1,226 +0,0 @@ - - */ -class Twig_Node implements Twig_NodeInterface -{ - protected $nodes; - protected $attributes; - protected $lineno; - protected $tag; - - /** - * 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) - { - $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); - } - - public function toXml($asDom = false) - { - $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 getLine() - { - return $this->lineno; - } - - public function getNodeTag() - { - return $this->tag; - } - - /** - * Returns true if the attribute is defined. - * - * @param string The attribute name - * - * @return bool true if the attribute is defined, false otherwise - */ - public function hasAttribute($name) - { - return array_key_exists($name, $this->attributes); - } - - /** - * Gets an attribute. - * - * @param string The attribute name - * - * @return mixed The attribute value - */ - 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]; - } - - /** - * Sets an attribute. - * - * @param string The attribute name - * @param mixed The attribute value - */ - public function setAttribute($name, $value) - { - $this->attributes[$name] = $value; - } - - /** - * Removes an attribute. - * - * @param string The attribute name - */ - public function removeAttribute($name) - { - unset($this->attributes[$name]); - } - - /** - * Returns true if the node with the given identifier exists. - * - * @param string The node name - * - * @return bool true if the node with the given name exists, false otherwise - */ - public function hasNode($name) - { - return array_key_exists($name, $this->nodes); - } - - /** - * Gets a node by name. - * - * @param string The node name - * - * @return Twig_Node A Twig_Node instance - */ - 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]; - } - - /** - * Sets a node. - * - * @param string The node name - * @param Twig_Node A Twig_Node instance - */ - public function setNode($name, $node = null) - { - $this->nodes[$name] = $node; - } - - /** - * Removes a node by name. - * - * @param string The node name - */ - public function removeNode($name) - { - unset($this->nodes[$name]); - } - - public function count() - { - return count($this->nodes); - } - - public function getIterator() - { - return new ArrayIterator($this->nodes); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/AutoEscape.php b/vendor/twig/twig/lib/Twig/Node/AutoEscape.php deleted file mode 100644 index 8f190e0bd..000000000 --- a/vendor/twig/twig/lib/Twig/Node/AutoEscape.php +++ /dev/null @@ -1,39 +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); - } - - /** - * Compiles the node to PHP. - * - * @param Twig_Compiler A Twig_Compiler instance - */ - public function compile(Twig_Compiler $compiler) - { - $compiler->subcompile($this->getNode('body')); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Block.php b/vendor/twig/twig/lib/Twig/Node/Block.php deleted file mode 100644 index 50eb67ed8..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Block.php +++ /dev/null @@ -1,44 +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); - } - - /** - * Compiles the node to PHP. - * - * @param Twig_Compiler A Twig_Compiler instance - */ - 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") - ; - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/BlockReference.php b/vendor/twig/twig/lib/Twig/Node/BlockReference.php deleted file mode 100644 index 013e369eb..000000000 --- a/vendor/twig/twig/lib/Twig/Node/BlockReference.php +++ /dev/null @@ -1,37 +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); - } - - /** - * Compiles the node to PHP. - * - * @param Twig_Compiler A Twig_Compiler instance - */ - public function compile(Twig_Compiler $compiler) - { - $compiler - ->addDebugInfo($this) - ->write(sprintf("\$this->displayBlock('%s', \$context, \$blocks);\n", $this->getAttribute('name'))) - ; - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Body.php b/vendor/twig/twig/lib/Twig/Node/Body.php deleted file mode 100644 index 3ffb1342b..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Body.php +++ /dev/null @@ -1,19 +0,0 @@ - - */ -class Twig_Node_Body extends Twig_Node -{ -} diff --git a/vendor/twig/twig/lib/Twig/Node/Do.php b/vendor/twig/twig/lib/Twig/Node/Do.php deleted file mode 100644 index c528066b2..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Do.php +++ /dev/null @@ -1,38 +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); - } - - /** - * Compiles the node to PHP. - * - * @param Twig_Compiler A Twig_Compiler instance - */ - public function compile(Twig_Compiler $compiler) - { - $compiler - ->addDebugInfo($this) - ->write('') - ->subcompile($this->getNode('expr')) - ->raw(";\n") - ; - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Embed.php b/vendor/twig/twig/lib/Twig/Node/Embed.php deleted file mode 100644 index 4c9456dc0..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Embed.php +++ /dev/null @@ -1,38 +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($filename, $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('filename', $filename); - $this->setAttribute('index', $index); - } - - protected function addGetTemplate(Twig_Compiler $compiler) - { - $compiler - ->write("\$this->env->loadTemplate(") - ->string($this->getAttribute('filename')) - ->raw(', ') - ->string($this->getAttribute('index')) - ->raw(")") - ; - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression.php b/vendor/twig/twig/lib/Twig/Node/Expression.php deleted file mode 100644 index a7382e7d6..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression.php +++ /dev/null @@ -1,20 +0,0 @@ - - */ -abstract class Twig_Node_Expression extends Twig_Node -{ -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Array.php b/vendor/twig/twig/lib/Twig/Node/Expression/Array.php deleted file mode 100644 index 1da785fe4..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Array.php +++ /dev/null @@ -1,86 +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->getLine()); - } - - array_push($this->nodes, $key, $value); - } - - /** - * Compiles the node to PHP. - * - * @param Twig_Compiler A Twig_Compiler instance - */ - 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(')'); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/AssignName.php b/vendor/twig/twig/lib/Twig/Node/Expression/AssignName.php deleted file mode 100644 index 2ddea78cf..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/AssignName.php +++ /dev/null @@ -1,28 +0,0 @@ -raw('$context[') - ->string($this->getAttribute('name')) - ->raw(']') - ; - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary.php deleted file mode 100644 index 9dd5de2c8..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary.php +++ /dev/null @@ -1,40 +0,0 @@ - $left, 'right' => $right), array(), $lineno); - } - - /** - * Compiles the node to PHP. - * - * @param Twig_Compiler A Twig_Compiler instance - */ - 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); -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Add.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Add.php deleted file mode 100644 index 0ef8e1172..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Add.php +++ /dev/null @@ -1,18 +0,0 @@ -raw('+'); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/And.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/And.php deleted file mode 100644 index d5752ebba..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/And.php +++ /dev/null @@ -1,18 +0,0 @@ -raw('&&'); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseAnd.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseAnd.php deleted file mode 100644 index 9a46d8455..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseAnd.php +++ /dev/null @@ -1,18 +0,0 @@ -raw('&'); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseOr.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseOr.php deleted file mode 100644 index 058a20bf6..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseOr.php +++ /dev/null @@ -1,18 +0,0 @@ -raw('|'); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseXor.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseXor.php deleted file mode 100644 index f4da73d44..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseXor.php +++ /dev/null @@ -1,18 +0,0 @@ -raw('^'); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Concat.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Concat.php deleted file mode 100644 index f9a646270..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Concat.php +++ /dev/null @@ -1,18 +0,0 @@ -raw('.'); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Div.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Div.php deleted file mode 100644 index e0797a612..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Div.php +++ /dev/null @@ -1,18 +0,0 @@ -raw('/'); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/EndsWith.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/EndsWith.php deleted file mode 100644 index 5de6c72d2..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/EndsWith.php +++ /dev/null @@ -1,30 +0,0 @@ -raw('(0 === substr_compare(') - ->subcompile($this->getNode('left')) - ->raw(', ') - ->subcompile($this->getNode('right')) - ->raw(', -strlen(') - ->subcompile($this->getNode('right')) - ->raw(')))') - ; - } - - public function operator(Twig_Compiler $compiler) - { - return $compiler->raw(''); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Equal.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Equal.php deleted file mode 100644 index 7b1236d0a..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Equal.php +++ /dev/null @@ -1,17 +0,0 @@ -raw('=='); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/FloorDiv.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/FloorDiv.php deleted file mode 100644 index 7fbd0556f..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/FloorDiv.php +++ /dev/null @@ -1,29 +0,0 @@ -raw('intval(floor('); - parent::compile($compiler); - $compiler->raw('))'); - } - - public function operator(Twig_Compiler $compiler) - { - return $compiler->raw('/'); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Greater.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Greater.php deleted file mode 100644 index a110bd92d..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Greater.php +++ /dev/null @@ -1,17 +0,0 @@ -raw('>'); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/GreaterEqual.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/GreaterEqual.php deleted file mode 100644 index 3754fed21..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/GreaterEqual.php +++ /dev/null @@ -1,17 +0,0 @@ -raw('>='); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/In.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/In.php deleted file mode 100644 index 788f9377a..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/In.php +++ /dev/null @@ -1,33 +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'); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Less.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Less.php deleted file mode 100644 index 45fd30049..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Less.php +++ /dev/null @@ -1,17 +0,0 @@ -raw('<'); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/LessEqual.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/LessEqual.php deleted file mode 100644 index e38e257c3..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/LessEqual.php +++ /dev/null @@ -1,17 +0,0 @@ -raw('<='); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Matches.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Matches.php deleted file mode 100644 index 93bb29205..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Matches.php +++ /dev/null @@ -1,28 +0,0 @@ -raw('preg_match(') - ->subcompile($this->getNode('right')) - ->raw(', ') - ->subcompile($this->getNode('left')) - ->raw(')') - ; - } - - public function operator(Twig_Compiler $compiler) - { - return $compiler->raw(''); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Mod.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Mod.php deleted file mode 100644 index 9924114fb..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Mod.php +++ /dev/null @@ -1,18 +0,0 @@ -raw('%'); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Mul.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Mul.php deleted file mode 100644 index c91529ca6..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Mul.php +++ /dev/null @@ -1,18 +0,0 @@ -raw('*'); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/NotEqual.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/NotEqual.php deleted file mode 100644 index 26867ba20..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/NotEqual.php +++ /dev/null @@ -1,17 +0,0 @@ -raw('!='); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/NotIn.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/NotIn.php deleted file mode 100644 index f347b7b6e..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/NotIn.php +++ /dev/null @@ -1,33 +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'); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Or.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Or.php deleted file mode 100644 index adba49c6f..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Or.php +++ /dev/null @@ -1,18 +0,0 @@ -raw('||'); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Power.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Power.php deleted file mode 100644 index b2c590405..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Power.php +++ /dev/null @@ -1,33 +0,0 @@ -raw('pow(') - ->subcompile($this->getNode('left')) - ->raw(', ') - ->subcompile($this->getNode('right')) - ->raw(')') - ; - } - - public function operator(Twig_Compiler $compiler) - { - return $compiler->raw('**'); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Range.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Range.php deleted file mode 100644 index bea4f2a60..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Range.php +++ /dev/null @@ -1,33 +0,0 @@ -raw('range(') - ->subcompile($this->getNode('left')) - ->raw(', ') - ->subcompile($this->getNode('right')) - ->raw(')') - ; - } - - public function operator(Twig_Compiler $compiler) - { - return $compiler->raw('..'); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/StartsWith.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/StartsWith.php deleted file mode 100644 index eb8c107cb..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/StartsWith.php +++ /dev/null @@ -1,28 +0,0 @@ -raw('(0 === strpos(') - ->subcompile($this->getNode('left')) - ->raw(', ') - ->subcompile($this->getNode('right')) - ->raw('))') - ; - } - - public function operator(Twig_Compiler $compiler) - { - return $compiler->raw(''); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Sub.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Sub.php deleted file mode 100644 index d44639915..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Sub.php +++ /dev/null @@ -1,18 +0,0 @@ -raw('-'); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/BlockReference.php b/vendor/twig/twig/lib/Twig/Node/Expression/BlockReference.php deleted file mode 100644 index 647196eb5..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/BlockReference.php +++ /dev/null @@ -1,51 +0,0 @@ - - */ -class Twig_Node_Expression_BlockReference extends Twig_Node_Expression -{ - public function __construct(Twig_NodeInterface $name, $asString = false, $lineno, $tag = null) - { - parent::__construct(array('name' => $name), array('as_string' => $asString, 'output' => false), $lineno, $tag); - } - - /** - * Compiles the node to PHP. - * - * @param Twig_Compiler A Twig_Compiler instance - */ - public function compile(Twig_Compiler $compiler) - { - if ($this->getAttribute('as_string')) { - $compiler->raw('(string) '); - } - - if ($this->getAttribute('output')) { - $compiler - ->addDebugInfo($this) - ->write("\$this->displayBlock(") - ->subcompile($this->getNode('name')) - ->raw(", \$context, \$blocks);\n") - ; - } else { - $compiler - ->raw("\$this->renderBlock(") - ->subcompile($this->getNode('name')) - ->raw(", \$context, \$blocks)") - ; - } - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Call.php b/vendor/twig/twig/lib/Twig/Node/Expression/Call.php deleted file mode 100644 index 912b837a9..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Call.php +++ /dev/null @@ -1,176 +0,0 @@ -hasAttribute('callable') && $callable = $this->getAttribute('callable')) { - if (is_string($callable)) { - $compiler->raw($callable); - } elseif (is_array($callable) && $callable[0] instanceof Twig_ExtensionInterface) { - $compiler->raw(sprintf('$this->env->getExtension(\'%s\')->%s', $callable[0]->getName(), $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') && null !== $this->getNode('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) - { - $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".', $this->getAttribute('type'), $this->getAttribute('name'))); - } - - $parameters[$name] = $node; - } - - if (!$named) { - return $parameters; - } - - if (!$callable) { - throw new LogicException(sprintf('Named arguments are not supported for %s "%s".', $this->getAttribute('type'), $this->getAttribute('name'))); - } - - // manage named arguments - if (is_array($callable)) { - $r = new ReflectionMethod($callable[0], $callable[1]); - } elseif (is_object($callable) && !$callable instanceof Closure) { - $r = new ReflectionObject($callable); - $r = $r->getMethod('__invoke'); - } else { - $r = new ReflectionFunction($callable); - } - - $definition = $r->getParameters(); - if ($this->hasNode('node')) { - array_shift($definition); - } - if ($this->hasAttribute('needs_environment') && $this->getAttribute('needs_environment')) { - array_shift($definition); - } - if ($this->hasAttribute('needs_context') && $this->getAttribute('needs_context')) { - array_shift($definition); - } - if ($this->hasAttribute('arguments') && null !== $this->getAttribute('arguments')) { - foreach ($this->getAttribute('arguments') as $argument) { - array_shift($definition); - } - } - - $arguments = array(); - $pos = 0; - foreach ($definition as $param) { - $name = $this->normalizeName($param->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, $this->getAttribute('type'), $this->getAttribute('name'))); - } - - $arguments[] = $parameters[$name]; - unset($parameters[$name]); - } elseif (array_key_exists($pos, $parameters)) { - $arguments[] = $parameters[$pos]; - unset($parameters[$pos]); - ++$pos; - } elseif ($param->isDefaultValueAvailable()) { - $arguments[] = new Twig_Node_Expression_Constant($param->getDefaultValue(), -1); - } elseif ($param->isOptional()) { - break; - } else { - throw new Twig_Error_Syntax(sprintf('Value for argument "%s" is required for %s "%s".', $name, $this->getAttribute('type'), $this->getAttribute('name'))); - } - } - - if (!empty($parameters)) { - throw new Twig_Error_Syntax(sprintf('Unknown argument%s "%s" for %s "%s".', count($parameters) > 1 ? 's' : '', implode('", "', array_keys($parameters)), $this->getAttribute('type'), $this->getAttribute('name'))); - } - - 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)); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Conditional.php b/vendor/twig/twig/lib/Twig/Node/Expression/Conditional.php deleted file mode 100644 index edcb1e2d2..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Conditional.php +++ /dev/null @@ -1,31 +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('))') - ; - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Constant.php b/vendor/twig/twig/lib/Twig/Node/Expression/Constant.php deleted file mode 100644 index a91dc6985..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Constant.php +++ /dev/null @@ -1,23 +0,0 @@ - $value), $lineno); - } - - public function compile(Twig_Compiler $compiler) - { - $compiler->repr($this->getAttribute('value')); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/ExtensionReference.php b/vendor/twig/twig/lib/Twig/Node/Expression/ExtensionReference.php deleted file mode 100644 index 00ac6701f..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/ExtensionReference.php +++ /dev/null @@ -1,33 +0,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); - } - - /** - * Compiles the node to PHP. - * - * @param Twig_Compiler A Twig_Compiler instance - */ - public function compile(Twig_Compiler $compiler) - { - $compiler->raw(sprintf("\$this->env->getExtension('%s')", $this->getAttribute('name'))); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Filter.php b/vendor/twig/twig/lib/Twig/Node/Expression/Filter.php deleted file mode 100644 index 207b062a3..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Filter.php +++ /dev/null @@ -1,36 +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()); - } - - $this->compileCallable($compiler); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Filter/Default.php b/vendor/twig/twig/lib/Twig/Node/Expression/Filter/Default.php deleted file mode 100644 index 1827c8886..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Filter/Default.php +++ /dev/null @@ -1,43 +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->getLine()), $arguments, $node->getLine()); - - 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->getLine()); - $false = count($arguments) ? $arguments->getNode(0) : new Twig_Node_Expression_Constant('', $node->getLine()); - - $node = new Twig_Node_Expression_Conditional($test, $default, $false, $node->getLine()); - } else { - $node = $default; - } - - parent::__construct($node, $filterName, $arguments, $lineno, $tag); - } - - public function compile(Twig_Compiler $compiler) - { - $compiler->subcompile($this->getNode('node')); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Function.php b/vendor/twig/twig/lib/Twig/Node/Expression/Function.php deleted file mode 100644 index 3e1f6b559..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Function.php +++ /dev/null @@ -1,35 +0,0 @@ - $arguments), array('name' => $name), $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) { - $this->setAttribute('callable', $function->getCallable()); - } - - $this->compileCallable($compiler); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/GetAttr.php b/vendor/twig/twig/lib/Twig/Node/Expression/GetAttr.php deleted file mode 100644 index 55d9fcc32..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/GetAttr.php +++ /dev/null @@ -1,53 +0,0 @@ - $node, 'attribute' => $attribute, 'arguments' => $arguments), array('type' => $type, 'is_defined_test' => false, 'ignore_strict_check' => false, 'disable_c_ext' => false), $lineno); - } - - public function compile(Twig_Compiler $compiler) - { - 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')); - - if (count($this->getNode('arguments')) || Twig_Template::ANY_CALL !== $this->getAttribute('type') || $this->getAttribute('is_defined_test') || $this->getAttribute('ignore_strict_check')) { - $compiler->raw(', ')->subcompile($this->getNode('arguments')); - - if (Twig_Template::ANY_CALL !== $this->getAttribute('type') || $this->getAttribute('is_defined_test') || $this->getAttribute('ignore_strict_check')) { - $compiler->raw(', ')->repr($this->getAttribute('type')); - } - - if ($this->getAttribute('is_defined_test') || $this->getAttribute('ignore_strict_check')) { - $compiler->raw(', '.($this->getAttribute('is_defined_test') ? 'true' : 'false')); - } - - if ($this->getAttribute('ignore_strict_check')) { - $compiler->raw(', '.($this->getAttribute('ignore_strict_check') ? 'true' : 'false')); - } - } - - $compiler->raw(')'); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/MethodCall.php b/vendor/twig/twig/lib/Twig/Node/Expression/MethodCall.php deleted file mode 100644 index 620b02bf4..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/MethodCall.php +++ /dev/null @@ -1,41 +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(')'); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Name.php b/vendor/twig/twig/lib/Twig/Node/Expression/Name.php deleted file mode 100644 index 3b8fae01d..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Name.php +++ /dev/null @@ -1,88 +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'); - - 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 { - // remove the non-PHP 5.4 version when PHP 5.3 support is dropped - // as the non-optimized version is just a workaround for slow ternary operator - // when the context has a lot of variables - if (version_compare(phpversion(), '5.4.0RC1', '>=')) { - // 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'); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Parent.php b/vendor/twig/twig/lib/Twig/Node/Expression/Parent.php deleted file mode 100644 index dcf618c04..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Parent.php +++ /dev/null @@ -1,47 +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); - } - - /** - * Compiles the node to PHP. - * - * @param Twig_Compiler A Twig_Compiler instance - */ - 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)") - ; - } - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/TempName.php b/vendor/twig/twig/lib/Twig/Node/Expression/TempName.php deleted file mode 100644 index e6b058e85..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/TempName.php +++ /dev/null @@ -1,26 +0,0 @@ - $name), $lineno); - } - - public function compile(Twig_Compiler $compiler) - { - $compiler - ->raw('$_') - ->raw($this->getAttribute('name')) - ->raw('_') - ; - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Test.php b/vendor/twig/twig/lib/Twig/Node/Expression/Test.php deleted file mode 100644 index 639f501a1..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Test.php +++ /dev/null @@ -1,32 +0,0 @@ - $node, 'arguments' => $arguments), 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()); - } - - $this->compileCallable($compiler); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Test/Constant.php b/vendor/twig/twig/lib/Twig/Node/Expression/Test/Constant.php deleted file mode 100644 index de55f5f55..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Test/Constant.php +++ /dev/null @@ -1,46 +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('))') - ; - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Test/Defined.php b/vendor/twig/twig/lib/Twig/Node/Expression/Test/Defined.php deleted file mode 100644 index 247b2e23a..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Test/Defined.php +++ /dev/null @@ -1,54 +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) - { - parent::__construct($node, $name, $arguments, $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); - } else { - throw new Twig_Error_Syntax('The "defined" test only works with simple variables', $this->getLine()); - } - } - - 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')); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Test/Divisibleby.php b/vendor/twig/twig/lib/Twig/Node/Expression/Test/Divisibleby.php deleted file mode 100644 index d5bed234a..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Test/Divisibleby.php +++ /dev/null @@ -1,33 +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(')') - ; - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Test/Even.php b/vendor/twig/twig/lib/Twig/Node/Expression/Test/Even.php deleted file mode 100644 index d7853e89c..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Test/Even.php +++ /dev/null @@ -1,32 +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(')') - ; - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Test/Null.php b/vendor/twig/twig/lib/Twig/Node/Expression/Test/Null.php deleted file mode 100644 index 1c83825a0..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Test/Null.php +++ /dev/null @@ -1,31 +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(')') - ; - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Test/Odd.php b/vendor/twig/twig/lib/Twig/Node/Expression/Test/Odd.php deleted file mode 100644 index 421c19e84..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Test/Odd.php +++ /dev/null @@ -1,32 +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(')') - ; - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Test/Sameas.php b/vendor/twig/twig/lib/Twig/Node/Expression/Test/Sameas.php deleted file mode 100644 index b48905ee4..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Test/Sameas.php +++ /dev/null @@ -1,29 +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(')') - ; - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Unary.php b/vendor/twig/twig/lib/Twig/Node/Expression/Unary.php deleted file mode 100644 index c514388eb..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Unary.php +++ /dev/null @@ -1,30 +0,0 @@ - $node), array(), $lineno); - } - - public function compile(Twig_Compiler $compiler) - { - $compiler->raw('('); - $this->operator($compiler); - $compiler - ->subcompile($this->getNode('node')) - ->raw(')') - ; - } - - abstract public function operator(Twig_Compiler $compiler); -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Neg.php b/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Neg.php deleted file mode 100644 index 2a3937ec3..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Neg.php +++ /dev/null @@ -1,18 +0,0 @@ -raw('-'); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Not.php b/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Not.php deleted file mode 100644 index f94073cfa..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Not.php +++ /dev/null @@ -1,18 +0,0 @@ -raw('!'); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Pos.php b/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Pos.php deleted file mode 100644 index 04edb52a6..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Pos.php +++ /dev/null @@ -1,18 +0,0 @@ -raw('+'); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Flush.php b/vendor/twig/twig/lib/Twig/Node/Flush.php deleted file mode 100644 index 0467ddcef..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Flush.php +++ /dev/null @@ -1,36 +0,0 @@ - - */ -class Twig_Node_Flush extends Twig_Node -{ - public function __construct($lineno, $tag) - { - parent::__construct(array(), array(), $lineno, $tag); - } - - /** - * Compiles the node to PHP. - * - * @param Twig_Compiler A Twig_Compiler instance - */ - public function compile(Twig_Compiler $compiler) - { - $compiler - ->addDebugInfo($this) - ->write("flush();\n") - ; - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/For.php b/vendor/twig/twig/lib/Twig/Node/For.php deleted file mode 100644 index d1ff371da..000000000 --- a/vendor/twig/twig/lib/Twig/Node/For.php +++ /dev/null @@ -1,112 +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); - } - - parent::__construct(array('key_target' => $keyTarget, 'value_target' => $valueTarget, 'seq' => $seq, 'body' => $body, 'else' => $else), array('with_loop' => true, 'ifexpr' => null !== $ifexpr), $lineno, $tag); - } - - /** - * Compiles the node to PHP. - * - * @param Twig_Compiler A Twig_Compiler instance - */ - public function compile(Twig_Compiler $compiler) - { - $compiler - ->addDebugInfo($this) - // the (array) cast bypasses a PHP 5.2.6 bug - ->write("\$context['_parent'] = (array) \$context;\n") - ->write("\$context['_seq'] = twig_ensure_traversable(") - ->subcompile($this->getNode('seq')) - ->raw(");\n") - ; - - if (null !== $this->getNode('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', null !== $this->getNode('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 (null !== $this->getNode('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"); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/ForLoop.php b/vendor/twig/twig/lib/Twig/Node/ForLoop.php deleted file mode 100644 index b8841583d..000000000 --- a/vendor/twig/twig/lib/Twig/Node/ForLoop.php +++ /dev/null @@ -1,55 +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); - } - - /** - * Compiles the node to PHP. - * - * @param Twig_Compiler A Twig_Compiler instance - */ - 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") - ; - } - } - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/If.php b/vendor/twig/twig/lib/Twig/Node/If.php deleted file mode 100644 index b42d10755..000000000 --- a/vendor/twig/twig/lib/Twig/Node/If.php +++ /dev/null @@ -1,66 +0,0 @@ - - */ -class Twig_Node_If extends Twig_Node -{ - public function __construct(Twig_NodeInterface $tests, Twig_NodeInterface $else = null, $lineno, $tag = null) - { - parent::__construct(array('tests' => $tests, 'else' => $else), array(), $lineno, $tag); - } - - /** - * Compiles the node to PHP. - * - * @param Twig_Compiler A Twig_Compiler instance - */ - 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') && null !== $this->getNode('else')) { - $compiler - ->outdent() - ->write("} else {\n") - ->indent() - ->subcompile($this->getNode('else')) - ; - } - - $compiler - ->outdent() - ->write("}\n"); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Import.php b/vendor/twig/twig/lib/Twig/Node/Import.php deleted file mode 100644 index 99efc0911..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Import.php +++ /dev/null @@ -1,50 +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); - } - - /** - * Compiles the node to PHP. - * - * @param Twig_Compiler A Twig_Compiler instance - */ - 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->env->loadTemplate(') - ->subcompile($this->getNode('expr')) - ->raw(")") - ; - } - - $compiler->raw(";\n"); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Include.php b/vendor/twig/twig/lib/Twig/Node/Include.php deleted file mode 100644 index 860aedfe2..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Include.php +++ /dev/null @@ -1,99 +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) - { - parent::__construct(array('expr' => $expr, 'variables' => $variables), array('only' => (bool) $only, 'ignore_missing' => (bool) $ignoreMissing), $lineno, $tag); - } - - /** - * Compiles the node to PHP. - * - * @param Twig_Compiler A Twig_Compiler instance - */ - 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) - { - if ($this->getNode('expr') instanceof Twig_Node_Expression_Constant) { - $compiler - ->write("\$this->env->loadTemplate(") - ->subcompile($this->getNode('expr')) - ->raw(")") - ; - } else { - $compiler - ->write("\$template = \$this->env->resolveTemplate(") - ->subcompile($this->getNode('expr')) - ->raw(");\n") - ->write('$template') - ; - } - } - - protected function addTemplateArguments(Twig_Compiler $compiler) - { - if (false === $this->getAttribute('only')) { - if (null === $this->getNode('variables')) { - $compiler->raw('$context'); - } else { - $compiler - ->raw('array_merge($context, ') - ->subcompile($this->getNode('variables')) - ->raw(')') - ; - } - } else { - if (null === $this->getNode('variables')) { - $compiler->raw('array()'); - } else { - $compiler->subcompile($this->getNode('variables')); - } - } - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Macro.php b/vendor/twig/twig/lib/Twig/Node/Macro.php deleted file mode 100644 index 89910618b..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Macro.php +++ /dev/null @@ -1,96 +0,0 @@ - - */ -class Twig_Node_Macro extends Twig_Node -{ - public function __construct($name, Twig_NodeInterface $body, Twig_NodeInterface $arguments, $lineno, $tag = null) - { - parent::__construct(array('body' => $body, 'arguments' => $arguments), array('name' => $name), $lineno, $tag); - } - - /** - * Compiles the node to PHP. - * - * @param Twig_Compiler A Twig_Compiler instance - */ - 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(', '); - } - } - - $compiler - ->raw(")\n") - ->write("{\n") - ->indent() - ; - - if (!count($this->getNode('arguments'))) { - $compiler->write("\$context = \$this->env->getGlobals();\n\n"); - } else { - $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 - ->outdent() - ->write("));\n\n") - ; - } - - $compiler - ->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("}\n\n") - ->write("return ('' === \$tmp = ob_get_clean()) ? '' : new Twig_Markup(\$tmp, \$this->env->getCharset());\n") - ->outdent() - ->write("}\n\n") - ; - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Module.php b/vendor/twig/twig/lib/Twig/Node/Module.php deleted file mode 100644 index 3f8017572..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Module.php +++ /dev/null @@ -1,383 +0,0 @@ - - */ -class Twig_Node_Module extends Twig_Node -{ - public function __construct(Twig_NodeInterface $body, Twig_Node_Expression $parent = null, Twig_NodeInterface $blocks, Twig_NodeInterface $macros, Twig_NodeInterface $traits, $embeddedTemplates, $filename) - { - // embedded templates are set as attributes so that they are only visited once by the visitors - parent::__construct(array('parent' => $parent, 'body' => $body, 'blocks' => $blocks, 'macros' => $macros, 'traits' => $traits), array('filename' => $filename, 'index' => null, 'embedded_templates' => $embeddedTemplates), 1); - } - - public function setIndex($index) - { - $this->setAttribute('index', $index); - } - - /** - * Compiles the node to PHP. - * - * @param Twig_Compiler A Twig_Compiler instance - */ - 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')) || null === $this->getNode('parent') || $this->getNode('parent') instanceof Twig_Node_Expression_Constant) { - $this->compileConstructor($compiler); - } - - $this->compileGetParent($compiler); - - $this->compileDisplayHeader($compiler); - - $this->compileDisplayBody($compiler); - - $this->compileDisplayFooter($compiler); - - $compiler->subcompile($this->getNode('blocks')); - - $this->compileMacros($compiler); - - $this->compileGetTemplateName($compiler); - - $this->compileIsTraitable($compiler); - - $this->compileDebugInfo($compiler); - - $this->compileClassFooter($compiler); - } - - protected function compileGetParent(Twig_Compiler $compiler) - { - if (null === $this->getNode('parent')) { - return; - } - - $compiler - ->write("protected function doGetParent(array \$context)\n", "{\n") - ->indent() - ->write("return ") - ; - - if ($this->getNode('parent') instanceof Twig_Node_Expression_Constant) { - $compiler->subcompile($this->getNode('parent')); - } else { - $compiler - ->raw("\$this->env->resolveTemplate(") - ->subcompile($this->getNode('parent')) - ->raw(")") - ; - } - - $compiler - ->raw(";\n") - ->outdent() - ->write("}\n\n") - ; - } - - protected function compileDisplayBody(Twig_Compiler $compiler) - { - $compiler->subcompile($this->getNode('body')); - - if (null !== $this->getNode('parent')) { - if ($this->getNode('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"); - } - } - - protected function compileClassHeader(Twig_Compiler $compiler) - { - $compiler - ->write("\n\n") - // if the filename contains */, add a blank to avoid a PHP parse error - ->write("/* ".str_replace('*/', '* /', $this->getAttribute('filename'))." */\n") - ->write('class '.$compiler->getEnvironment()->getTemplateClass($this->getAttribute('filename'), $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() - ->write("parent::__construct(\$env);\n\n") - ; - - // parent - if (null === $this->getNode('parent')) { - $compiler->write("\$this->parent = false;\n\n"); - } elseif ($this->getNode('parent') instanceof Twig_Node_Expression_Constant) { - $compiler - ->write("\$this->parent = \$this->env->loadTemplate(") - ->subcompile($this->getNode('parent')) - ->raw(");\n\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() - ->write("}\n\n"); - ; - } - - protected function compileDisplayHeader(Twig_Compiler $compiler) - { - $compiler - ->write("protected function doDisplay(array \$context, array \$blocks = array())\n", "{\n") - ->indent() - ; - } - - protected function compileDisplayFooter(Twig_Compiler $compiler) - { - $compiler - ->outdent() - ->write("}\n\n") - ; - } - - protected function compileClassFooter(Twig_Compiler $compiler) - { - $compiler - ->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->getAttribute('filename')) - ->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 = null === $this->getNode('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") - ; - } - - protected function compileLoadTemplate(Twig_Compiler $compiler, $node, $var) - { - if ($node instanceof Twig_Node_Expression_Constant) { - $compiler - ->write(sprintf("%s = \$this->env->loadTemplate(", $var)) - ->subcompile($node) - ->raw(");\n") - ; - } else { - $compiler - ->write(sprintf("%s = ", $var)) - ->subcompile($node) - ->raw(";\n") - ->write(sprintf("if (!%s", $var)) - ->raw(" instanceof Twig_Template) {\n") - ->indent() - ->write(sprintf("%s = \$this->env->loadTemplate(%s);\n", $var, $var)) - ->outdent() - ->write("}\n") - ; - } - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Print.php b/vendor/twig/twig/lib/Twig/Node/Print.php deleted file mode 100644 index b0c41d1d9..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Print.php +++ /dev/null @@ -1,39 +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); - } - - /** - * Compiles the node to PHP. - * - * @param Twig_Compiler A Twig_Compiler instance - */ - public function compile(Twig_Compiler $compiler) - { - $compiler - ->addDebugInfo($this) - ->write('echo ') - ->subcompile($this->getNode('expr')) - ->raw(";\n") - ; - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Sandbox.php b/vendor/twig/twig/lib/Twig/Node/Sandbox.php deleted file mode 100644 index 8cf3ed44f..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Sandbox.php +++ /dev/null @@ -1,47 +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); - } - - /** - * Compiles the node to PHP. - * - * @param Twig_Compiler A Twig_Compiler instance - */ - public function compile(Twig_Compiler $compiler) - { - $compiler - ->addDebugInfo($this) - ->write("\$sandbox = \$this->env->getExtension('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") - ; - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/SandboxedModule.php b/vendor/twig/twig/lib/Twig/Node/SandboxedModule.php deleted file mode 100644 index 0de4503ec..000000000 --- a/vendor/twig/twig/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')); - - $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/vendor/twig/twig/lib/Twig/Node/SandboxedPrint.php b/vendor/twig/twig/lib/Twig/Node/SandboxedPrint.php deleted file mode 100644 index 73dfaa963..000000000 --- a/vendor/twig/twig/lib/Twig/Node/SandboxedPrint.php +++ /dev/null @@ -1,59 +0,0 @@ - - */ -class Twig_Node_SandboxedPrint extends Twig_Node_Print -{ - public function __construct(Twig_Node_Expression $expr, $lineno, $tag = null) - { - parent::__construct($expr, $lineno, $tag); - } - - /** - * Compiles the node to PHP. - * - * @param Twig_Compiler A Twig_Compiler instance - */ - public function compile(Twig_Compiler $compiler) - { - $compiler - ->addDebugInfo($this) - ->write('echo $this->env->getExtension(\'sandbox\')->ensureToStringAllowed(') - ->subcompile($this->getNode('expr')) - ->raw(");\n") - ; - } - - /** - * Removes node filters. - * - * This is mostly needed when another visitor adds filters (like the escaper one). - * - * @param Twig_Node $node A Node - */ - protected function removeNodeFilter($node) - { - if ($node instanceof Twig_Node_Expression_Filter) { - return $this->removeNodeFilter($node->getNode('node')); - } - - return $node; - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Set.php b/vendor/twig/twig/lib/Twig/Node/Set.php deleted file mode 100644 index 4c9c16ce2..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Set.php +++ /dev/null @@ -1,101 +0,0 @@ - - */ -class Twig_Node_Set extends Twig_Node -{ - 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->getLine())); - $this->setAttribute('capture', false); - } - } - } - - /** - * Compiles the node to PHP. - * - * @param Twig_Compiler A Twig_Compiler instance - */ - 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"); - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/SetTemp.php b/vendor/twig/twig/lib/Twig/Node/SetTemp.php deleted file mode 100644 index 3bdd1cb74..000000000 --- a/vendor/twig/twig/lib/Twig/Node/SetTemp.php +++ /dev/null @@ -1,35 +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") - ; - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Spaceless.php b/vendor/twig/twig/lib/Twig/Node/Spaceless.php deleted file mode 100644 index 7555fa0f1..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Spaceless.php +++ /dev/null @@ -1,40 +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); - } - - /** - * Compiles the node to PHP. - * - * @param Twig_Compiler A Twig_Compiler instance - */ - 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") - ; - } -} diff --git a/vendor/twig/twig/lib/Twig/Node/Text.php b/vendor/twig/twig/lib/Twig/Node/Text.php deleted file mode 100644 index 21bdcea14..000000000 --- a/vendor/twig/twig/lib/Twig/Node/Text.php +++ /dev/null @@ -1,39 +0,0 @@ - - */ -class Twig_Node_Text extends Twig_Node implements Twig_NodeOutputInterface -{ - public function __construct($data, $lineno) - { - parent::__construct(array(), array('data' => $data), $lineno); - } - - /** - * Compiles the node to PHP. - * - * @param Twig_Compiler A Twig_Compiler instance - */ - public function compile(Twig_Compiler $compiler) - { - $compiler - ->addDebugInfo($this) - ->write('echo ') - ->string($this->getAttribute('data')) - ->raw(";\n") - ; - } -} diff --git a/vendor/twig/twig/lib/Twig/NodeInterface.php b/vendor/twig/twig/lib/Twig/NodeInterface.php deleted file mode 100644 index 43afd0df0..000000000 --- a/vendor/twig/twig/lib/Twig/NodeInterface.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * @deprecated since 1.12 (to be removed in 3.0) - */ -interface Twig_NodeInterface extends Countable, IteratorAggregate -{ - /** - * Compiles the node to PHP. - * - * @param Twig_Compiler A Twig_Compiler instance - */ - public function compile(Twig_Compiler $compiler); - - public function getLine(); - - public function getNodeTag(); -} diff --git a/vendor/twig/twig/lib/Twig/NodeOutputInterface.php b/vendor/twig/twig/lib/Twig/NodeOutputInterface.php deleted file mode 100644 index 22172c09d..000000000 --- a/vendor/twig/twig/lib/Twig/NodeOutputInterface.php +++ /dev/null @@ -1,19 +0,0 @@ - - */ -interface Twig_NodeOutputInterface -{ -} diff --git a/vendor/twig/twig/lib/Twig/NodeTraverser.php b/vendor/twig/twig/lib/Twig/NodeTraverser.php deleted file mode 100644 index 8178a55c0..000000000 --- a/vendor/twig/twig/lib/Twig/NodeTraverser.php +++ /dev/null @@ -1,88 +0,0 @@ - - */ -class Twig_NodeTraverser -{ - protected $env; - protected $visitors; - - /** - * Constructor. - * - * @param Twig_Environment $env A Twig_Environment instance - * @param Twig_NodeVisitorInterface[] $visitors An array of Twig_NodeVisitorInterface instances - */ - public function __construct(Twig_Environment $env, array $visitors = array()) - { - $this->env = $env; - $this->visitors = array(); - foreach ($visitors as $visitor) { - $this->addVisitor($visitor); - } - } - - /** - * Adds a visitor. - * - * @param Twig_NodeVisitorInterface $visitor A Twig_NodeVisitorInterface instance - */ - 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. - * - * @param Twig_NodeInterface $node A Twig_NodeInterface instance - */ - 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 !== $n = $this->traverseForVisitor($visitor, $n)) { - $node->setNode($k, $n); - } else { - $node->removeNode($k); - } - } - - return $visitor->leaveNode($node, $this->env); - } -} diff --git a/vendor/twig/twig/lib/Twig/NodeVisitor/Escaper.php b/vendor/twig/twig/lib/Twig/NodeVisitor/Escaper.php deleted file mode 100644 index cc4b3d717..000000000 --- a/vendor/twig/twig/lib/Twig/NodeVisitor/Escaper.php +++ /dev/null @@ -1,167 +0,0 @@ - - */ -class Twig_NodeVisitor_Escaper implements Twig_NodeVisitorInterface -{ - 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(); - } - - /** - * Called before child nodes are visited. - * - * @param Twig_NodeInterface $node The node to visit - * @param Twig_Environment $env The Twig environment instance - * - * @return Twig_NodeInterface The modified node - */ - public function enterNode(Twig_NodeInterface $node, Twig_Environment $env) - { - if ($node instanceof Twig_Node_Module) { - if ($env->hasExtension('escaper') && $defaultStrategy = $env->getExtension('escaper')->getDefaultStrategy($node->getAttribute('filename'))) { - $this->defaultStrategy = $defaultStrategy; - } - $this->safeVars = 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; - } - - /** - * Called after child nodes are visited. - * - * @param Twig_NodeInterface $node The node to visit - * @param Twig_Environment $env The Twig environment instance - * - * @return Twig_NodeInterface The modified node - */ - public function leaveNode(Twig_NodeInterface $node, Twig_Environment $env) - { - if ($node instanceof Twig_Node_Module) { - $this->defaultStrategy = false; - $this->safeVars = 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->getLine() - ); - } - - 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->getLine(); - $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); - } - - /** - * {@inheritdoc} - */ - public function getPriority() - { - return 0; - } -} diff --git a/vendor/twig/twig/lib/Twig/NodeVisitor/Optimizer.php b/vendor/twig/twig/lib/Twig/NodeVisitor/Optimizer.php deleted file mode 100644 index 06f69dbe3..000000000 --- a/vendor/twig/twig/lib/Twig/NodeVisitor/Optimizer.php +++ /dev/null @@ -1,246 +0,0 @@ - - */ -class Twig_NodeVisitor_Optimizer implements Twig_NodeVisitorInterface -{ - 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 $optimizers; - protected $prependedNodes = array(); - protected $inABody = false; - - /** - * Constructor. - * - * @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; - } - - /** - * {@inheritdoc} - */ - public function enterNode(Twig_NodeInterface $node, Twig_Environment $env) - { - if (self::OPTIMIZE_FOR === (self::OPTIMIZE_FOR & $this->optimizers)) { - $this->enterOptimizeFor($node, $env); - } - - if (!version_compare(phpversion(), '5.4.0RC1', '>=') && self::OPTIMIZE_VAR_ACCESS === (self::OPTIMIZE_VAR_ACCESS & $this->optimizers) && !$env->isStrictVariables() && !$env->hasExtension('sandbox')) { - if ($this->inABody) { - if (!$node instanceof Twig_Node_Expression) { - if (get_class($node) !== 'Twig_Node') { - array_unshift($this->prependedNodes, array()); - } - } else { - $node = $this->optimizeVariables($node, $env); - } - } elseif ($node instanceof Twig_Node_Body) { - $this->inABody = true; - } - } - - return $node; - } - - /** - * {@inheritdoc} - */ - public function leaveNode(Twig_NodeInterface $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('sandbox')) { - if ($node instanceof Twig_Node_Body) { - $this->inABody = false; - } elseif ($this->inABody) { - if (!$expression && get_class($node) !== 'Twig_Node' && $prependedNodes = array_shift($this->prependedNodes)) { - $nodes = array(); - foreach (array_unique($prependedNodes) as $name) { - $nodes[] = new Twig_Node_SetTemp($name, $node->getLine()); - } - - $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->getLine()); - } - - return $node; - } - - /** - * Optimizes print nodes. - * - * It replaces: - * - * * "echo $this->render(Parent)Block()" with "$this->display(Parent)Block()" - * - * @param Twig_NodeInterface $node A Node - * @param Twig_Environment $env The current Twig environment - */ - protected function optimizePrintNode(Twig_NodeInterface $node, Twig_Environment $env) - { - if (!$node instanceof Twig_Node_Print) { - return $node; - } - - if ( - $node->getNode('expr') instanceof Twig_Node_Expression_BlockReference || - $node->getNode('expr') instanceof Twig_Node_Expression_Parent - ) { - $node->getNode('expr')->setAttribute('output', true); - - return $node->getNode('expr'); - } - - return $node; - } - - /** - * Removes "raw" filters. - * - * @param Twig_NodeInterface $node A Node - * @param Twig_Environment $env The current Twig environment - */ - 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. - * - * @param Twig_NodeInterface $node A Node - * @param Twig_Environment $env The current Twig environment - */ - 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); - } 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')) { - $this->addLoopToCurrent(); - } - - // 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(); - } - - // 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. - * - * @param Twig_NodeInterface $node A Node - * @param Twig_Environment $env The current Twig environment - */ - protected function leaveOptimizeFor(Twig_NodeInterface $node, Twig_Environment $env) - { - if ($node instanceof Twig_Node_For) { - array_shift($this->loops); - } - } - - protected function addLoopToCurrent() - { - $this->loops[0]->setAttribute('with_loop', true); - } - - protected function addLoopToAll() - { - foreach ($this->loops as $loop) { - $loop->setAttribute('with_loop', true); - } - } - - /** - * {@inheritdoc} - */ - public function getPriority() - { - return 255; - } -} diff --git a/vendor/twig/twig/lib/Twig/NodeVisitor/SafeAnalysis.php b/vendor/twig/twig/lib/Twig/NodeVisitor/SafeAnalysis.php deleted file mode 100644 index a5d06de2c..000000000 --- a/vendor/twig/twig/lib/Twig/NodeVisitor/SafeAnalysis.php +++ /dev/null @@ -1,139 +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, - ); - } - - public function enterNode(Twig_NodeInterface $node, Twig_Environment $env) - { - return $node; - } - - public function leaveNode(Twig_NodeInterface $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); - } - - /** - * {@inheritdoc} - */ - public function getPriority() - { - return 0; - } -} diff --git a/vendor/twig/twig/lib/Twig/NodeVisitor/Sandbox.php b/vendor/twig/twig/lib/Twig/NodeVisitor/Sandbox.php deleted file mode 100644 index fb27045ba..000000000 --- a/vendor/twig/twig/lib/Twig/NodeVisitor/Sandbox.php +++ /dev/null @@ -1,92 +0,0 @@ - - */ -class Twig_NodeVisitor_Sandbox implements Twig_NodeVisitorInterface -{ - protected $inAModule = false; - protected $tags; - protected $filters; - protected $functions; - - /** - * Called before child nodes are visited. - * - * @param Twig_NodeInterface $node The node to visit - * @param Twig_Environment $env The Twig environment instance - * - * @return Twig_NodeInterface The modified node - */ - public function enterNode(Twig_NodeInterface $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()) { - $this->tags[] = $node->getNodeTag(); - } - - // look for filters - if ($node instanceof Twig_Node_Expression_Filter) { - $this->filters[] = $node->getNode('filter')->getAttribute('value'); - } - - // look for functions - if ($node instanceof Twig_Node_Expression_Function) { - $this->functions[] = $node->getAttribute('name'); - } - - // wrap print to check __toString() calls - if ($node instanceof Twig_Node_Print) { - return new Twig_Node_SandboxedPrint($node->getNode('expr'), $node->getLine(), $node->getNodeTag()); - } - } - - return $node; - } - - /** - * Called after child nodes are visited. - * - * @param Twig_NodeInterface $node The node to visit - * @param Twig_Environment $env The Twig environment instance - * - * @return Twig_NodeInterface The modified node - */ - public function leaveNode(Twig_NodeInterface $node, Twig_Environment $env) - { - if ($node instanceof Twig_Node_Module) { - $this->inAModule = false; - - return new Twig_Node_SandboxedModule($node, array_unique($this->filters), array_unique($this->tags), array_unique($this->functions)); - } - - return $node; - } - - /** - * {@inheritdoc} - */ - public function getPriority() - { - return 0; - } -} diff --git a/vendor/twig/twig/lib/Twig/NodeVisitorInterface.php b/vendor/twig/twig/lib/Twig/NodeVisitorInterface.php deleted file mode 100644 index 608adedb0..000000000 --- a/vendor/twig/twig/lib/Twig/NodeVisitorInterface.php +++ /dev/null @@ -1,47 +0,0 @@ - - */ -interface Twig_NodeVisitorInterface -{ - /** - * Called before child nodes are visited. - * - * @param Twig_NodeInterface $node The node to visit - * @param Twig_Environment $env The Twig environment instance - * - * @return Twig_NodeInterface The modified node - */ - public function enterNode(Twig_NodeInterface $node, Twig_Environment $env); - - /** - * Called after child nodes are visited. - * - * @param Twig_NodeInterface $node The node to visit - * @param Twig_Environment $env The Twig environment instance - * - * @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(); -} diff --git a/vendor/twig/twig/lib/Twig/Parser.php b/vendor/twig/twig/lib/Twig/Parser.php deleted file mode 100644 index 549ce2bdf..000000000 --- a/vendor/twig/twig/lib/Twig/Parser.php +++ /dev/null @@ -1,390 +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(); - - /** - * Constructor. - * - * @param Twig_Environment $env A Twig_Environment instance - */ - public function __construct(Twig_Environment $env) - { - $this->env = $env; - } - - public function getEnvironment() - { - return $this->env; - } - - public function getVarName() - { - return sprintf('__internal_%s', hash('sha256', uniqid(mt_rand(), true), false)); - } - - public function getFilename() - { - return $this->stream->getFilename(); - } - - /** - * {@inheritdoc} - */ - public function parse(Twig_TokenStream $stream, $test = null, $dropNeedle = false) - { - // push all variables into the stack to keep the current state of the parser - $vars = get_object_vars($this); - unset($vars['stack'], $vars['env'], $vars['handlers'], $vars['visitors'], $vars['expressionParser']); - $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->getUnaryOperators(), $this->env->getBinaryOperators()); - } - - $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(); - - try { - $body = $this->subparse($test, $dropNeedle); - - if (null !== $this->parent) { - if (null === $body = $this->filterBodyNodes($body)) { - $body = new Twig_Node(); - } - } - } catch (Twig_Error_Syntax $e) { - if (!$e->getTemplateFile()) { - $e->setTemplateFile($this->getFilename()); - } - - 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, $this->getFilename()); - - $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 ($token->getType() !== Twig_Token::NAME_TYPE) { - throw new Twig_Error_Syntax('A block must start with a tag name', $token->getLine(), $this->getFilename()); - } - - 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) { - $error = sprintf('Unexpected tag name "%s"', $token->getValue()); - if (is_array($test) && isset($test[0]) && $test[0] instanceof Twig_TokenParserInterface) { - $error .= sprintf(' (expecting closing tag for the "%s" tag defined near line %s)', $test[0]->getTag(), $lineno); - } - - throw new Twig_Error_Syntax($error, $token->getLine(), $this->getFilename()); - } - - $message = sprintf('Unknown tag name "%s"', $token->getValue()); - if ($alternatives = $this->env->computeAlternatives($token->getValue(), array_keys($this->env->getTags()))) { - $message = sprintf('%s. Did you mean "%s"', $message, implode('", "', $alternatives)); - } - - throw new Twig_Error_Syntax($message, $token->getLine(), $this->getFilename()); - } - - $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.', 0, $this->getFilename()); - } - } - - if (1 === count($rv)) { - return $rv[0]; - } - - return new Twig_Node($rv, array(), $lineno); - } - - public function addHandler($name, $class) - { - $this->handlers[$name] = $class; - } - - public function addNodeVisitor(Twig_NodeVisitorInterface $visitor) - { - $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->getLine()); - } - - public function hasMacro($name) - { - return isset($this->macros[$name]); - } - - public function setMacro($name, Twig_Node_Macro $node) - { - if (null === $this->reservedMacroNames) { - $this->reservedMacroNames = array(); - $r = new ReflectionClass($this->env->getBaseTemplateClass()); - foreach ($r->getMethods() as $method) { - $this->reservedMacroNames[] = $method->getName(); - } - } - - if (in_array($name, $this->reservedMacroNames)) { - throw new Twig_Error_Syntax(sprintf('"%s" cannot be used as a macro name as it is a reserved keyword', $name), $node->getLine(), $this->getFilename()); - } - - $this->macros[$name] = $node; - } - - 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); - } - - /** - * Gets the expression parser. - * - * @return Twig_ExpressionParser The expression parser - */ - public function getExpressionParser() - { - return $this->expressionParser; - } - - public function getParent() - { - return $this->parent; - } - - public function setParent($parent) - { - $this->parent = $parent; - } - - /** - * Gets the token stream. - * - * @return Twig_TokenStream The token stream - */ - public function getStream() - { - return $this->stream; - } - - /** - * Gets the current token. - * - * @return Twig_Token The current 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 have a body but a byte order mark (BOM) has been detected; it must be removed.', $node->getLine(), $this->getFilename()); - } - - throw new Twig_Error_Syntax('A template that extends another one cannot have a body.', $node->getLine(), $this->getFilename()); - } - - // bypass "set" nodes as they "capture" the output - if ($node instanceof Twig_Node_Set) { - 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; - } -} diff --git a/vendor/twig/twig/lib/Twig/ParserInterface.php b/vendor/twig/twig/lib/Twig/ParserInterface.php deleted file mode 100644 index 8e7cc0a85..000000000 --- a/vendor/twig/twig/lib/Twig/ParserInterface.php +++ /dev/null @@ -1,31 +0,0 @@ - - * - * @deprecated since 1.12 (to be removed in 3.0) - */ -interface Twig_ParserInterface -{ - /** - * Converts a token stream to a node tree. - * - * @param Twig_TokenStream $stream A token stream instance - * - * @return Twig_Node_Module A node tree - * - * @throws Twig_Error_Syntax When the token stream is syntactically or semantically wrong - */ - public function parse(Twig_TokenStream $stream); -} diff --git a/vendor/twig/twig/lib/Twig/Sandbox/SecurityError.php b/vendor/twig/twig/lib/Twig/Sandbox/SecurityError.php deleted file mode 100644 index 015bfaea2..000000000 --- a/vendor/twig/twig/lib/Twig/Sandbox/SecurityError.php +++ /dev/null @@ -1,19 +0,0 @@ - - */ -class Twig_Sandbox_SecurityError extends Twig_Error -{ -} diff --git a/vendor/twig/twig/lib/Twig/Sandbox/SecurityPolicy.php b/vendor/twig/twig/lib/Twig/Sandbox/SecurityPolicy.php deleted file mode 100644 index 66ee23320..000000000 --- a/vendor/twig/twig/lib/Twig/Sandbox/SecurityPolicy.php +++ /dev/null @@ -1,119 +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_SecurityError(sprintf('Tag "%s" is not allowed.', $tag)); - } - } - - foreach ($filters as $filter) { - if (!in_array($filter, $this->allowedFilters)) { - throw new Twig_Sandbox_SecurityError(sprintf('Filter "%s" is not allowed.', $filter)); - } - } - - foreach ($functions as $function) { - if (!in_array($function, $this->allowedFunctions)) { - throw new Twig_Sandbox_SecurityError(sprintf('Function "%s" is not allowed.', $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) { - throw new Twig_Sandbox_SecurityError(sprintf('Calling "%s" method on a "%s" object is not allowed.', $method, get_class($obj))); - } - } - - 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) { - throw new Twig_Sandbox_SecurityError(sprintf('Calling "%s" property on a "%s" object is not allowed.', $property, get_class($obj))); - } - } -} diff --git a/vendor/twig/twig/lib/Twig/Sandbox/SecurityPolicyInterface.php b/vendor/twig/twig/lib/Twig/Sandbox/SecurityPolicyInterface.php deleted file mode 100644 index 6ab48e3cc..000000000 --- a/vendor/twig/twig/lib/Twig/Sandbox/SecurityPolicyInterface.php +++ /dev/null @@ -1,24 +0,0 @@ - - */ -interface Twig_Sandbox_SecurityPolicyInterface -{ - public function checkSecurity($tags, $filters, $functions); - - public function checkMethodAllowed($obj, $method); - - public function checkPropertyAllowed($obj, $method); -} diff --git a/vendor/twig/twig/lib/Twig/SimpleFilter.php b/vendor/twig/twig/lib/Twig/SimpleFilter.php deleted file mode 100644 index d35c56334..000000000 --- a/vendor/twig/twig/lib/Twig/SimpleFilter.php +++ /dev/null @@ -1,94 +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_safe' => null, - 'is_safe_callback' => null, - 'pre_escape' => null, - 'preserves_safety' => null, - 'node_class' => 'Twig_Node_Expression_Filter', - ), $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']; - } -} diff --git a/vendor/twig/twig/lib/Twig/SimpleFunction.php b/vendor/twig/twig/lib/Twig/SimpleFunction.php deleted file mode 100644 index 8ef6aca2f..000000000 --- a/vendor/twig/twig/lib/Twig/SimpleFunction.php +++ /dev/null @@ -1,84 +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_safe' => null, - 'is_safe_callback' => null, - 'node_class' => 'Twig_Node_Expression_Function', - ), $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(); - } -} diff --git a/vendor/twig/twig/lib/Twig/SimpleTest.php b/vendor/twig/twig/lib/Twig/SimpleTest.php deleted file mode 100644 index 225459c9f..000000000 --- a/vendor/twig/twig/lib/Twig/SimpleTest.php +++ /dev/null @@ -1,46 +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( - 'node_class' => 'Twig_Node_Expression_Test', - ), $options); - } - - public function getName() - { - return $this->name; - } - - public function getCallable() - { - return $this->callable; - } - - public function getNodeClass() - { - return $this->options['node_class']; - } -} diff --git a/vendor/twig/twig/lib/Twig/Template.php b/vendor/twig/twig/lib/Twig/Template.php deleted file mode 100644 index 1e23e8b4f..000000000 --- a/vendor/twig/twig/lib/Twig/Template.php +++ /dev/null @@ -1,485 +0,0 @@ - - */ -abstract class Twig_Template implements Twig_TemplateInterface -{ - protected static $cache = array(); - - protected $parent; - protected $parents; - protected $env; - protected $blocks; - protected $traits; - - /** - * Constructor. - * - * @param Twig_Environment $env A Twig_Environment instance - */ - public function __construct(Twig_Environment $env) - { - $this->env = $env; - $this->blocks = array(); - $this->traits = array(); - } - - /** - * Returns the template name. - * - * @return string The template name - */ - abstract public function getTemplateName(); - - /** - * {@inheritdoc} - */ - public function getEnvironment() - { - return $this->env; - } - - /** - * Returns the parent template. - * - * This method is for internal use only and should never be called - * directly. - * - * @return Twig_TemplateInterface|false The parent template or false if there is no parent - */ - public function getParent(array $context) - { - if (null !== $this->parent) { - return $this->parent; - } - - $parent = $this->doGetParent($context); - if (false === $parent) { - return false; - } elseif ($parent instanceof Twig_Template) { - $name = $parent->getTemplateName(); - $this->parents[$name] = $parent; - $parent = $name; - } elseif (!isset($this->parents[$parent])) { - $this->parents[$parent] = $this->env->loadTemplate($parent); - } - - 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 - */ - 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->getTemplateName()); - } - } - - /** - * 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 - */ - 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; - } - - if (null !== $template) { - try { - $template->$block($context, $blocks); - } catch (Twig_Error $e) { - 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->getTemplateName(), $e); - } - } elseif (false !== $parent = $this->getParent($context)) { - $parent->displayBlock($name, $context, array_merge($this->blocks, $blocks), false); - } - } - - /** - * 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 - */ - 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 - */ - 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. - * - * This method is for internal use only and should never be called - * directly. - * - * This method does only return blocks defined in the current template - * or defined in "used" traits. - * - * It does not return blocks from parent templates as the parent - * template name can be dynamic, which is only known based on the - * current context. - * - * @param string $name The block name - * - * @return bool true if the block exists, false otherwise - */ - public function hasBlock($name) - { - return isset($this->blocks[(string) $name]); - } - - /** - * Returns all block names. - * - * This method is for internal use only and should never be called - * directly. - * - * @return array An array of block names - * - * @see hasBlock - */ - public function getBlockNames() - { - return array_keys($this->blocks); - } - - /** - * Returns all blocks. - * - * This method is for internal use only and should never be called - * directly. - * - * @return array An array of blocks - * - * @see hasBlock - */ - public function getBlocks() - { - return $this->blocks; - } - - /** - * {@inheritdoc} - */ - public function display(array $context, array $blocks = array()) - { - $this->displayWithErrorHandling($this->env->mergeGlobals($context), array_merge($this->blocks, $blocks)); - } - - /** - * {@inheritdoc} - */ - 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; - } - - return ob_get_clean(); - } - - protected function displayWithErrorHandling(array $context, array $blocks = array()) - { - try { - $this->doDisplay($context, $blocks); - } catch (Twig_Error $e) { - if (!$e->getTemplateFile()) { - $e->setTemplateFile($this->getTemplateName()); - } - - // 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->getTemplateName(), $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 The content of the context variable - * - * @throws Twig_Error_Runtime if the variable does not exist and Twig is running in strict mode - */ - 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->getTemplateName()); - } - - 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 - */ - protected function getAttribute($object, $item, array $arguments = array(), $type = Twig_Template::ANY_CALL, $isDefinedTest = false, $ignoreStrictCheck = false) - { - // array - if (Twig_Template::METHOD_CALL !== $type) { - $arrayItem = is_bool($item) || is_float($item) ? (int) $item : $item; - - if ((is_array($object) && array_key_exists($arrayItem, $object)) - || ($object instanceof ArrayAccess && isset($object[$arrayItem])) - ) { - if ($isDefinedTest) { - return true; - } - - return $object[$arrayItem]; - } - - if (Twig_Template::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)) { - $message = sprintf('Key "%s" for array with keys "%s" does not exist', $arrayItem, implode(', ', array_keys($object))); - } elseif (Twig_Template::ARRAY_CALL === $type) { - $message = sprintf('Impossible to access a key ("%s") on a %s variable ("%s")', $item, gettype($object), $object); - } 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->getTemplateName()); - } - } - - if (!is_object($object)) { - if ($isDefinedTest) { - return false; - } - - if ($ignoreStrictCheck || !$this->env->isStrictVariables()) { - return; - } - - throw new Twig_Error_Runtime(sprintf('Impossible to invoke a method ("%s") on a %s variable ("%s")', $item, gettype($object), $object), -1, $this->getTemplateName()); - } - - // object property - if (Twig_Template::METHOD_CALL !== $type) { - if (isset($object->$item) || array_key_exists((string) $item, $object)) { - if ($isDefinedTest) { - return true; - } - - if ($this->env->hasExtension('sandbox')) { - $this->env->getExtension('sandbox')->checkPropertyAllowed($object, $item); - } - - return $object->$item; - } - } - - $class = get_class($object); - - // object method - if (!isset(self::$cache[$class]['methods'])) { - self::$cache[$class]['methods'] = array_change_key_case(array_flip(get_class_methods($object))); - } - - $call = false; - $lcItem = strtolower($item); - if (isset(self::$cache[$class]['methods'][$lcItem])) { - $method = (string) $item; - } elseif (isset(self::$cache[$class]['methods']['get'.$lcItem])) { - $method = 'get'.$item; - } elseif (isset(self::$cache[$class]['methods']['is'.$lcItem])) { - $method = 'is'.$item; - } elseif (isset(self::$cache[$class]['methods']['__call'])) { - $method = (string) $item; - $call = true; - } else { - if ($isDefinedTest) { - return false; - } - - if ($ignoreStrictCheck || !$this->env->isStrictVariables()) { - return; - } - - throw new Twig_Error_Runtime(sprintf('Method "%s" for object "%s" does not exist', $item, get_class($object)), -1, $this->getTemplateName()); - } - - if ($isDefinedTest) { - return true; - } - - if ($this->env->hasExtension('sandbox')) { - $this->env->getExtension('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 { - $ret = call_user_func_array(array($object, $method), $arguments); - } catch (BadMethodCallException $e) { - if ($call && ($ignoreStrictCheck || !$this->env->isStrictVariables())) { - return; - } - throw $e; - } - - // useful when calling a template method from a template - // this is not supported but unfortunately heavily used in the Symfony profiler - if ($object instanceof Twig_TemplateInterface) { - return $ret === '' ? '' : new Twig_Markup($ret, $this->env->getCharset()); - } - - return $ret; - } - - /** - * This method is only useful when testing Twig. Do not use it. - */ - public static function clearCache() - { - self::$cache = array(); - } -} diff --git a/vendor/twig/twig/lib/Twig/TemplateInterface.php b/vendor/twig/twig/lib/Twig/TemplateInterface.php deleted file mode 100644 index d178832eb..000000000 --- a/vendor/twig/twig/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 The current environment - */ - public function getEnvironment(); -} diff --git a/vendor/twig/twig/lib/Twig/Test.php b/vendor/twig/twig/lib/Twig/Test.php deleted file mode 100644 index 3baff8856..000000000 --- a/vendor/twig/twig/lib/Twig/Test.php +++ /dev/null @@ -1,34 +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/vendor/twig/twig/lib/Twig/Test/Function.php b/vendor/twig/twig/lib/Twig/Test/Function.php deleted file mode 100644 index 4be6b9b92..000000000 --- a/vendor/twig/twig/lib/Twig/Test/Function.php +++ /dev/null @@ -1,35 +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/vendor/twig/twig/lib/Twig/Test/IntegrationTestCase.php b/vendor/twig/twig/lib/Twig/Test/IntegrationTestCase.php deleted file mode 100644 index 724f09417..000000000 --- a/vendor/twig/twig/lib/Twig/Test/IntegrationTestCase.php +++ /dev/null @@ -1,154 +0,0 @@ - - * @author Karma Dordrak - */ -abstract class Twig_Test_IntegrationTestCase extends PHPUnit_Framework_TestCase -{ - abstract protected function getExtensions(); - abstract protected function getFixturesDir(); - - /** - * @dataProvider getTests - */ - public function testIntegration($file, $message, $condition, $templates, $exception, $outputs) - { - $this->doIntegrationTest($file, $message, $condition, $templates, $exception, $outputs); - } - - public function getTests() - { - $fixturesDir = realpath($this->getFixturesDir()); - $tests = array(); - - foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($fixturesDir), RecursiveIteratorIterator::LEAVES_ONLY) as $file) { - if (!preg_match('/\.test$/', $file)) { - 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 = $this->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 = $this->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); - } - - return $tests; - } - - protected function doIntegrationTest($file, $message, $condition, $templates, $exception, $outputs) - { - if ($condition) { - eval('$ret = '.$condition.';'); - if (!$ret) { - $this->markTestSkipped($condition); - } - } - - $loader = new Twig_Loader_Array($templates); - - foreach ($outputs as $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->getExtensions() as $extension) { - $twig->addExtension($extension); - } - - try { - $template = $twig->loadTemplate('index.twig'); - } catch (Exception $e) { - if (false !== $exception) { - $this->assertEquals(trim($exception), trim(sprintf('%s: %s', get_class($e), $e->getMessage()))); - - return; - } - - if ($e instanceof Twig_Error_Syntax) { - $e->setTemplateFile($file); - - throw $e; - } - - 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->assertEquals(trim($exception), trim(sprintf('%s: %s', get_class($e), $e->getMessage()))); - - return; - } - - if ($e instanceof Twig_Error_Syntax) { - $e->setTemplateFile($file); - } else { - $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); - $this->assertThat(NULL, new PHPUnit_Framework_Constraint_Exception($class)); - } - - $expected = trim($match[3], "\n "); - - if ($expected != $output) { - echo 'Compiled template that failed:'; - - foreach (array_keys($templates) as $name) { - echo "Template: $name\n"; - $source = $loader->getSource($name); - echo $twig->compile($twig->parse($twig->tokenize($source, $name))); - } - } - $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; - } -} diff --git a/vendor/twig/twig/lib/Twig/Test/Method.php b/vendor/twig/twig/lib/Twig/Test/Method.php deleted file mode 100644 index 17c6c041d..000000000 --- a/vendor/twig/twig/lib/Twig/Test/Method.php +++ /dev/null @@ -1,37 +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', $this->extension->getName(), $this->method); - } -} diff --git a/vendor/twig/twig/lib/Twig/Test/Node.php b/vendor/twig/twig/lib/Twig/Test/Node.php deleted file mode 100644 index c832a57bf..000000000 --- a/vendor/twig/twig/lib/Twig/Test/Node.php +++ /dev/null @@ -1,37 +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/vendor/twig/twig/lib/Twig/Test/NodeTestCase.php b/vendor/twig/twig/lib/Twig/Test/NodeTestCase.php deleted file mode 100644 index b15c85ffd..000000000 --- a/vendor/twig/twig/lib/Twig/Test/NodeTestCase.php +++ /dev/null @@ -1,58 +0,0 @@ -assertNodeCompilation($source, $node, $environment); - } - - public function assertNodeCompilation($source, Twig_Node $node, Twig_Environment $environment = null) - { - $compiler = $this->getCompiler($environment); - $compiler->compile($node); - - $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(); - } - - protected function getVariableGetter($name) - { - if (version_compare(phpversion(), '5.4.0RC1', '>=')) { - return sprintf('(isset($context["%s"]) ? $context["%s"] : null)', $name, $name); - } - - return sprintf('$this->getContext($context, "%s")', $name); - } - - protected function getAttributeGetter() - { - if (function_exists('twig_template_get_attributes')) { - return 'twig_template_get_attributes($this, '; - } - - return '$this->getAttribute('; - } -} diff --git a/vendor/twig/twig/lib/Twig/TestCallableInterface.php b/vendor/twig/twig/lib/Twig/TestCallableInterface.php deleted file mode 100644 index 0db43682d..000000000 --- a/vendor/twig/twig/lib/Twig/TestCallableInterface.php +++ /dev/null @@ -1,21 +0,0 @@ - - * @deprecated since 1.12 (to be removed in 2.0) - */ -interface Twig_TestCallableInterface -{ - public function getCallable(); -} diff --git a/vendor/twig/twig/lib/Twig/TestInterface.php b/vendor/twig/twig/lib/Twig/TestInterface.php deleted file mode 100644 index 30d8a2c4f..000000000 --- a/vendor/twig/twig/lib/Twig/TestInterface.php +++ /dev/null @@ -1,26 +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/vendor/twig/twig/lib/Twig/Token.php b/vendor/twig/twig/lib/Twig/Token.php deleted file mode 100644 index 599f9f565..000000000 --- a/vendor/twig/twig/lib/Twig/Token.php +++ /dev/null @@ -1,216 +0,0 @@ - - */ -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; - - /** - * Constructor. - * - * @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; - } - - /** - * Returns a string representation of the token. - * - * @return string A string representation of the token - */ - 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|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 - ); - } - - /** - * Gets the line. - * - * @return int The source line - */ - public function getLine() - { - return $this->lineno; - } - - /** - * Gets the token type. - * - * @return int The token type - */ - public function getType() - { - return $this->type; - } - - /** - * Gets the token value. - * - * @return string The token value - */ - 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)); - } - } -} diff --git a/vendor/twig/twig/lib/Twig/TokenParser.php b/vendor/twig/twig/lib/Twig/TokenParser.php deleted file mode 100644 index decebd5ee..000000000 --- a/vendor/twig/twig/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 - * - * @param $parser A Twig_Parser instance - */ - public function setParser(Twig_Parser $parser) - { - $this->parser = $parser; - } -} diff --git a/vendor/twig/twig/lib/Twig/TokenParser/AutoEscape.php b/vendor/twig/twig/lib/Twig/TokenParser/AutoEscape.php deleted file mode 100644 index 275602883..000000000 --- a/vendor/twig/twig/lib/Twig/TokenParser/AutoEscape.php +++ /dev/null @@ -1,89 +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 %} - * - */ -class Twig_TokenParser_AutoEscape extends Twig_TokenParser -{ - /** - * Parses a token and returns a node. - * - * @param Twig_Token $token A Twig_Token instance - * - * @return Twig_NodeInterface A Twig_NodeInterface instance - */ - 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 Boolean.', $stream->getCurrent()->getLine(), $stream->getFilename()); - } - $value = $expr->getAttribute('value'); - - $compat = true === $value || false === $value; - - if (true === $value) { - $value = 'html'; - } - - if ($compat && $stream->test(Twig_Token::NAME_TYPE)) { - if (false === $value) { - throw new Twig_Error_Syntax('Unexpected escaping strategy as you set autoescaping to false.', $stream->getCurrent()->getLine(), $stream->getFilename()); - } - - $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'); - } - - /** - * Gets the tag name associated with this token parser. - * - * @return string The tag name - */ - public function getTag() - { - return 'autoescape'; - } -} diff --git a/vendor/twig/twig/lib/Twig/TokenParser/Block.php b/vendor/twig/twig/lib/Twig/TokenParser/Block.php deleted file mode 100644 index 81e6b1cff..000000000 --- a/vendor/twig/twig/lib/Twig/TokenParser/Block.php +++ /dev/null @@ -1,81 +0,0 @@ - - * {% block head %} - * - * {% block title %}{% endblock %} - My Webpage - * {% endblock %} - * - */ -class Twig_TokenParser_Block extends Twig_TokenParser -{ - /** - * Parses a token and returns a node. - * - * @param Twig_Token $token A Twig_Token instance - * - * @return Twig_NodeInterface A Twig_NodeInterface instance - */ - 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 '$name' has already been defined line %d", $this->parser->getBlock($name)->getLine()), $stream->getCurrent()->getLine(), $stream->getFilename()); - } - $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 '$name' (but %s given)", $value), $stream->getCurrent()->getLine(), $stream->getFilename()); - } - } - } 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'); - } - - /** - * Gets the tag name associated with this token parser. - * - * @return string The tag name - */ - public function getTag() - { - return 'block'; - } -} diff --git a/vendor/twig/twig/lib/Twig/TokenParser/Do.php b/vendor/twig/twig/lib/Twig/TokenParser/Do.php deleted file mode 100644 index f50939dd2..000000000 --- a/vendor/twig/twig/lib/Twig/TokenParser/Do.php +++ /dev/null @@ -1,42 +0,0 @@ -parser->getExpressionParser()->parseExpression(); - - $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE); - - return new Twig_Node_Do($expr, $token->getLine(), $this->getTag()); - } - - /** - * Gets the tag name associated with this token parser. - * - * @return string The tag name - */ - public function getTag() - { - return 'do'; - } -} diff --git a/vendor/twig/twig/lib/Twig/TokenParser/Embed.php b/vendor/twig/twig/lib/Twig/TokenParser/Embed.php deleted file mode 100644 index 69cb5f35f..000000000 --- a/vendor/twig/twig/lib/Twig/TokenParser/Embed.php +++ /dev/null @@ -1,66 +0,0 @@ -parser->getStream(); - - $parent = $this->parser->getExpressionParser()->parseExpression(); - - list($variables, $only, $ignoreMissing) = $this->parseArguments(); - - // 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()), - new Twig_Token(Twig_Token::STRING_TYPE, '__parent__', $token->getLine()), - 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 - $module->setNode('parent', $parent); - - $this->parser->embedTemplate($module); - - $stream->expect(Twig_Token::BLOCK_END_TYPE); - - return new Twig_Node_Embed($module->getAttribute('filename'), $module->getAttribute('index'), $variables, $only, $ignoreMissing, $token->getLine(), $this->getTag()); - } - - public function decideBlockEnd(Twig_Token $token) - { - return $token->test('endembed'); - } - - /** - * Gets the tag name associated with this token parser. - * - * @return string The tag name - */ - public function getTag() - { - return 'embed'; - } -} diff --git a/vendor/twig/twig/lib/Twig/TokenParser/Extends.php b/vendor/twig/twig/lib/Twig/TokenParser/Extends.php deleted file mode 100644 index f5ecee214..000000000 --- a/vendor/twig/twig/lib/Twig/TokenParser/Extends.php +++ /dev/null @@ -1,52 +0,0 @@ - - * {% extends "base.html" %} - * - */ -class Twig_TokenParser_Extends extends Twig_TokenParser -{ - /** - * Parses a token and returns a node. - * - * @param Twig_Token $token A Twig_Token instance - * - * @return Twig_NodeInterface A Twig_NodeInterface instance - */ - public function parse(Twig_Token $token) - { - if (!$this->parser->isMainScope()) { - throw new Twig_Error_Syntax('Cannot extend from a block', $token->getLine(), $this->parser->getFilename()); - } - - if (null !== $this->parser->getParent()) { - throw new Twig_Error_Syntax('Multiple extends tags are forbidden', $token->getLine(), $this->parser->getFilename()); - } - $this->parser->setParent($this->parser->getExpressionParser()->parseExpression()); - - $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE); - } - - /** - * Gets the tag name associated with this token parser. - * - * @return string The tag name - */ - public function getTag() - { - return 'extends'; - } -} diff --git a/vendor/twig/twig/lib/Twig/TokenParser/Filter.php b/vendor/twig/twig/lib/Twig/TokenParser/Filter.php deleted file mode 100644 index 2b97475ae..000000000 --- a/vendor/twig/twig/lib/Twig/TokenParser/Filter.php +++ /dev/null @@ -1,61 +0,0 @@ - - * {% filter upper %} - * This text becomes uppercase - * {% endfilter %} - * - */ -class Twig_TokenParser_Filter extends Twig_TokenParser -{ - /** - * Parses a token and returns a node. - * - * @param Twig_Token $token A Twig_Token instance - * - * @return Twig_NodeInterface A Twig_NodeInterface instance - */ - public function parse(Twig_Token $token) - { - $name = $this->parser->getVarName(); - $ref = new Twig_Node_Expression_BlockReference(new Twig_Node_Expression_Constant($name, $token->getLine()), true, $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'); - } - - /** - * Gets the tag name associated with this token parser. - * - * @return string The tag name - */ - public function getTag() - { - return 'filter'; - } -} diff --git a/vendor/twig/twig/lib/Twig/TokenParser/Flush.php b/vendor/twig/twig/lib/Twig/TokenParser/Flush.php deleted file mode 100644 index 4e15e7853..000000000 --- a/vendor/twig/twig/lib/Twig/TokenParser/Flush.php +++ /dev/null @@ -1,42 +0,0 @@ -parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE); - - return new Twig_Node_Flush($token->getLine(), $this->getTag()); - } - - /** - * Gets the tag name associated with this token parser. - * - * @return string The tag name - */ - public function getTag() - { - return 'flush'; - } -} diff --git a/vendor/twig/twig/lib/Twig/TokenParser/For.php b/vendor/twig/twig/lib/Twig/TokenParser/For.php deleted file mode 100644 index 5c07d6395..000000000 --- a/vendor/twig/twig/lib/Twig/TokenParser/For.php +++ /dev/null @@ -1,135 +0,0 @@ - - *
    - * {% for user in users %} - *
  • {{ user.username|e }}
  • - * {% endfor %} - *
- * - */ -class Twig_TokenParser_For extends Twig_TokenParser -{ - /** - * Parses a token and returns a node. - * - * @param Twig_Token $token A Twig_Token instance - * - * @return Twig_NodeInterface A Twig_NodeInterface instance - */ - 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 ($stream->next()->getValue() == 'else') { - $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->getLine()); - $valueTarget = $targets->getNode(1); - $valueTarget = new Twig_Node_Expression_AssignName($valueTarget->getAttribute('name'), $valueTarget->getLine()); - } else { - $keyTarget = new Twig_Node_Expression_AssignName('_key', $lineno); - $valueTarget = $targets->getNode(0); - $valueTarget = new Twig_Node_Expression_AssignName($valueTarget->getAttribute('name'), $valueTarget->getLine()); - } - - 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->getLine(), $stream->getFilename()); - } - - 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->getLine(), $stream->getFilename()); - } - } - - // 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); - } - } - - /** - * Gets the tag name associated with this token parser. - * - * @return string The tag name - */ - public function getTag() - { - return 'for'; - } -} diff --git a/vendor/twig/twig/lib/Twig/TokenParser/From.php b/vendor/twig/twig/lib/Twig/TokenParser/From.php deleted file mode 100644 index dd73f9908..000000000 --- a/vendor/twig/twig/lib/Twig/TokenParser/From.php +++ /dev/null @@ -1,70 +0,0 @@ - - * {% from 'forms.html' import forms %} - * - */ -class Twig_TokenParser_From extends Twig_TokenParser -{ - /** - * Parses a token and returns a node. - * - * @param Twig_Token $token A Twig_Token instance - * - * @return Twig_NodeInterface A Twig_NodeInterface instance - */ - 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) { - $this->parser->addImportedSymbol('function', $alias, 'get'.$name, $node->getNode('var')); - } - - return $node; - } - - /** - * Gets the tag name associated with this token parser. - * - * @return string The tag name - */ - public function getTag() - { - return 'from'; - } -} diff --git a/vendor/twig/twig/lib/Twig/TokenParser/If.php b/vendor/twig/twig/lib/Twig/TokenParser/If.php deleted file mode 100644 index 3d7d1f517..000000000 --- a/vendor/twig/twig/lib/Twig/TokenParser/If.php +++ /dev/null @@ -1,94 +0,0 @@ - - * {% if users %} - *
    - * {% for user in users %} - *
  • {{ user.username|e }}
  • - * {% endfor %} - *
- * {% endif %} - * - */ -class Twig_TokenParser_If extends Twig_TokenParser -{ - /** - * Parses a token and returns a node. - * - * @param Twig_Token $token A Twig_Token instance - * - * @return Twig_NodeInterface A Twig_NodeInterface instance - */ - 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->getFilename()); - } - } - - $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')); - } - - /** - * Gets the tag name associated with this token parser. - * - * @return string The tag name - */ - public function getTag() - { - return 'if'; - } -} diff --git a/vendor/twig/twig/lib/Twig/TokenParser/Import.php b/vendor/twig/twig/lib/Twig/TokenParser/Import.php deleted file mode 100644 index e7050c70c..000000000 --- a/vendor/twig/twig/lib/Twig/TokenParser/Import.php +++ /dev/null @@ -1,49 +0,0 @@ - - * {% import 'forms.html' as forms %} - * - */ -class Twig_TokenParser_Import extends Twig_TokenParser -{ - /** - * Parses a token and returns a node. - * - * @param Twig_Token $token A Twig_Token instance - * - * @return Twig_NodeInterface A Twig_NodeInterface instance - */ - 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()); - } - - /** - * Gets the tag name associated with this token parser. - * - * @return string The tag name - */ - public function getTag() - { - return 'import'; - } -} diff --git a/vendor/twig/twig/lib/Twig/TokenParser/Include.php b/vendor/twig/twig/lib/Twig/TokenParser/Include.php deleted file mode 100644 index 9c3099a68..000000000 --- a/vendor/twig/twig/lib/Twig/TokenParser/Include.php +++ /dev/null @@ -1,75 +0,0 @@ - - * {% include 'header.html' %} - * Body - * {% include 'footer.html' %} - * - */ -class Twig_TokenParser_Include extends Twig_TokenParser -{ - /** - * Parses a token and returns a node. - * - * @param Twig_Token $token A Twig_Token instance - * - * @return Twig_NodeInterface A Twig_NodeInterface instance - */ - 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); - } - - /** - * Gets the tag name associated with this token parser. - * - * @return string The tag name - */ - public function getTag() - { - return 'include'; - } -} diff --git a/vendor/twig/twig/lib/Twig/TokenParser/Macro.php b/vendor/twig/twig/lib/Twig/TokenParser/Macro.php deleted file mode 100644 index 87a299d82..000000000 --- a/vendor/twig/twig/lib/Twig/TokenParser/Macro.php +++ /dev/null @@ -1,68 +0,0 @@ - - * {% macro input(name, value, type, size) %} - * - * {% endmacro %} - * - */ -class Twig_TokenParser_Macro extends Twig_TokenParser -{ - /** - * Parses a token and returns a node. - * - * @param Twig_Token $token A Twig_Token instance - * - * @return Twig_NodeInterface A Twig_NodeInterface instance - */ - 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 '$name' (but %s given)", $value), $stream->getCurrent()->getLine(), $stream->getFilename()); - } - } - $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'); - } - - /** - * Gets the tag name associated with this token parser. - * - * @return string The tag name - */ - public function getTag() - { - return 'macro'; - } -} diff --git a/vendor/twig/twig/lib/Twig/TokenParser/Sandbox.php b/vendor/twig/twig/lib/Twig/TokenParser/Sandbox.php deleted file mode 100644 index 9457325ab..000000000 --- a/vendor/twig/twig/lib/Twig/TokenParser/Sandbox.php +++ /dev/null @@ -1,68 +0,0 @@ - - * {% sandbox %} - * {% include 'user.html' %} - * {% endsandbox %} - * - * - * @see http://www.twig-project.org/doc/api.html#sandbox-extension for details - */ -class Twig_TokenParser_Sandbox extends Twig_TokenParser -{ - /** - * Parses a token and returns a node. - * - * @param Twig_Token $token A Twig_Token instance - * - * @return Twig_NodeInterface A Twig_NodeInterface instance - */ - public function parse(Twig_Token $token) - { - $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); - - // 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->getLine(), $this->parser->getFilename()); - } - } - } - - return new Twig_Node_Sandbox($body, $token->getLine(), $this->getTag()); - } - - public function decideBlockEnd(Twig_Token $token) - { - return $token->test('endsandbox'); - } - - /** - * Gets the tag name associated with this token parser. - * - * @return string The tag name - */ - public function getTag() - { - return 'sandbox'; - } -} diff --git a/vendor/twig/twig/lib/Twig/TokenParser/Set.php b/vendor/twig/twig/lib/Twig/TokenParser/Set.php deleted file mode 100644 index 84f7e94cb..000000000 --- a/vendor/twig/twig/lib/Twig/TokenParser/Set.php +++ /dev/null @@ -1,83 +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 %} - * - */ -class Twig_TokenParser_Set extends Twig_TokenParser -{ - /** - * Parses a token and returns a node. - * - * @param Twig_Token $token A Twig_Token instance - * - * @return Twig_NodeInterface A Twig_NodeInterface instance - */ - 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->getFilename()); - } - } 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->getFilename()); - } - - $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'); - } - - /** - * Gets the tag name associated with this token parser. - * - * @return string The tag name - */ - public function getTag() - { - return 'set'; - } -} diff --git a/vendor/twig/twig/lib/Twig/TokenParser/Spaceless.php b/vendor/twig/twig/lib/Twig/TokenParser/Spaceless.php deleted file mode 100644 index 1e3fa8f3e..000000000 --- a/vendor/twig/twig/lib/Twig/TokenParser/Spaceless.php +++ /dev/null @@ -1,59 +0,0 @@ - - * {% spaceless %} - *
- * foo - *
- * {% endspaceless %} - * - * {# output will be
foo
#} - * - */ -class Twig_TokenParser_Spaceless extends Twig_TokenParser -{ - /** - * Parses a token and returns a node. - * - * @param Twig_Token $token A Twig_Token instance - * - * @return Twig_NodeInterface A Twig_NodeInterface instance - */ - 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'); - } - - /** - * Gets the tag name associated with this token parser. - * - * @return string The tag name - */ - public function getTag() - { - return 'spaceless'; - } -} diff --git a/vendor/twig/twig/lib/Twig/TokenParser/Use.php b/vendor/twig/twig/lib/Twig/TokenParser/Use.php deleted file mode 100644 index 3ea68b1a5..000000000 --- a/vendor/twig/twig/lib/Twig/TokenParser/Use.php +++ /dev/null @@ -1,76 +0,0 @@ - - * {% extends "base.html" %} - * - * {% use "blocks.html" %} - * - * {% block title %}{% endblock %} - * {% block content %}{% endblock %} - * - * - * @see http://www.twig-project.org/doc/templates.html#horizontal-reuse for details. - */ -class Twig_TokenParser_Use extends Twig_TokenParser -{ - /** - * Parses a token and returns a node. - * - * @param Twig_Token $token A Twig_Token instance - * - * @return Twig_NodeInterface A Twig_NodeInterface instance - */ - 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->getFilename()); - } - - $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)))); - } - - /** - * Gets the tag name associated with this token parser. - * - * @return string The tag name - */ - public function getTag() - { - return 'use'; - } -} diff --git a/vendor/twig/twig/lib/Twig/TokenParserBroker.php b/vendor/twig/twig/lib/Twig/TokenParserBroker.php deleted file mode 100644 index ec3fba674..000000000 --- a/vendor/twig/twig/lib/Twig/TokenParserBroker.php +++ /dev/null @@ -1,136 +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(); - - /** - * Constructor. - * - * @param array|Traversable $parsers A Traversable of Twig_TokenParserInterface instances - * @param array|Traversable $brokers A Traversable of Twig_TokenParserBrokerInterface instances - */ - public function __construct($parsers = array(), $brokers = array()) - { - 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; - } - } - - /** - * Adds a TokenParser. - * - * @param Twig_TokenParserInterface $parser A Twig_TokenParserInterface instance - */ - public function addTokenParser(Twig_TokenParserInterface $parser) - { - $this->parsers[$parser->getTag()] = $parser; - } - - /** - * Removes a TokenParser. - * - * @param Twig_TokenParserInterface $parser A Twig_TokenParserInterface instance - */ - public function removeTokenParser(Twig_TokenParserInterface $parser) - { - $name = $parser->getTag(); - if (isset($this->parsers[$name]) && $parser === $this->parsers[$name]) { - unset($this->parsers[$name]); - } - } - - /** - * Adds a TokenParserBroker. - * - * @param Twig_TokenParserBroker $broker A Twig_TokenParserBroker instance - */ - public function addTokenParserBroker(Twig_TokenParserBroker $broker) - { - $this->brokers[] = $broker; - } - - /** - * Removes a TokenParserBroker. - * - * @param Twig_TokenParserBroker $broker A Twig_TokenParserBroker instance - */ - public function removeTokenParserBroker(Twig_TokenParserBroker $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/vendor/twig/twig/lib/Twig/TokenParserBrokerInterface.php b/vendor/twig/twig/lib/Twig/TokenParserBrokerInterface.php deleted file mode 100644 index 3f006e339..000000000 --- a/vendor/twig/twig/lib/Twig/TokenParserBrokerInterface.php +++ /dev/null @@ -1,45 +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 null|Twig_TokenParserInterface 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. - * - * @param Twig_ParserInterface $parser A Twig_ParserInterface interface - */ - 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/vendor/twig/twig/lib/Twig/TokenParserInterface.php b/vendor/twig/twig/lib/Twig/TokenParserInterface.php deleted file mode 100644 index 31e8d5d5e..000000000 --- a/vendor/twig/twig/lib/Twig/TokenParserInterface.php +++ /dev/null @@ -1,43 +0,0 @@ - - */ -interface Twig_TokenParserInterface -{ - /** - * Sets the parser associated with this token parser - * - * @param $parser A Twig_Parser instance - */ - public function setParser(Twig_Parser $parser); - - /** - * Parses a token and returns a node. - * - * @param Twig_Token $token A Twig_Token instance - * - * @return Twig_NodeInterface A Twig_NodeInterface instance - * - * @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(); -} diff --git a/vendor/twig/twig/lib/Twig/TokenStream.php b/vendor/twig/twig/lib/Twig/TokenStream.php deleted file mode 100644 index 44440daed..000000000 --- a/vendor/twig/twig/lib/Twig/TokenStream.php +++ /dev/null @@ -1,156 +0,0 @@ - - */ -class Twig_TokenStream -{ - protected $tokens; - protected $current; - protected $filename; - - /** - * Constructor. - * - * @param array $tokens An array of tokens - * @param string $filename The name of the filename which tokens are associated with - */ - public function __construct(array $tokens, $filename = null) - { - $this->tokens = $tokens; - $this->current = 0; - $this->filename = $filename; - } - - /** - * Returns a string representation of the token stream. - * - * @return string - */ - 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->filename); - } - - 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->filename - ); - } - $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->filename); - } - - 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 $this->tokens[$this->current]->getType() === Twig_Token::EOF_TYPE; - } - - /** - * Gets the current token - * - * @return Twig_Token - */ - public function getCurrent() - { - return $this->tokens[$this->current]; - } - - /** - * Gets the filename associated with this stream - * - * @return string - */ - public function getFilename() - { - return $this->filename; - } -} From 4c9e02d64813e7ee382bf155aae9614682acc0f9 Mon Sep 17 00:00:00 2001 From: Djamil Legato Date: Fri, 5 Sep 2014 12:58:06 -0700 Subject: [PATCH 14/56] Ignoring vendor folder --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index d5d22b7a6..05b9e7986 100755 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ # Composer composer.lock +.composer +vendor # Sass .sass-cache From c7ece89fea09d37503ff8ebdc55a4de6f7bec73e Mon Sep 17 00:00:00 2001 From: Djamil Legato Date: Fri, 5 Sep 2014 12:58:15 -0700 Subject: [PATCH 15/56] Including compohser.phar --- bin/composer.phar | Bin 0 -> 1017753 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100755 bin/composer.phar diff --git a/bin/composer.phar b/bin/composer.phar new file mode 100755 index 0000000000000000000000000000000000000000..1e631a9a687025896a0d79c5f95bf76ac4c4dfc1 GIT binary patch literal 1017753 zcmeFa3w)$mQ8&E2EVpoz<+3O!&xFi&XE*80>@K*QxosxN>|}Rl5|Yd;yE8+!)9EC= z)9DV~oteqr1O?=xzN`XrQ4v-V1w}vwUzLjjtA41+MNyHf@Cv9P0;0a)_y1SbInT8_ zon%&h{l59Zp7irPr%s(Zb?Q{rsZ-~vJBHSpjiLEUZKzy38>}v`_Ut{t{|;T=6I>q5 zE?1htVx?LRP_7mmt)RXbjMi6H>&nVlo_i6i6F`Tjk@f&Gu{`P=$M7d`U<7hUw2i!Qq80T(?I|8
    W~rN4oa|GpRh=f|Vgy`hOo{9S9- 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

    E(tRw~#4}HMbtP|0= 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

    plIOdV;Vh7B~VY3)AQE9Nz9-q{<6_IPE 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 z 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

    Xg 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 literal 0 HcmV?d00001 From d05c049d4c7ff4f0f73fd397d7593f293eb53516 Mon Sep 17 00:00:00 2001 From: Djamil Legato Date: Fri, 5 Sep 2014 12:58:36 -0700 Subject: [PATCH 16/56] Autorun composer install when running the grav cli --- bin/grav | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/bin/grav b/bin/grav index 79015cea1..998b90afc 100755 --- a/bin/grav +++ b/bin/grav @@ -5,6 +5,13 @@ if (version_compare($ver = PHP_VERSION, $req = '5.4.0', '<')) { exit(sprintf("You are running PHP %s, but Grav needs at least PHP %s to run.\n", $ver, $req)); } +if (!file_exists(__DIR__ . '/../vendor')){ + // Before we can even start, we need to run composer first + echo "Preparing to install vendor dependencies...\n\n"; + echo system('php bin/composer.phar --working-dir="'.__DIR__.'/../" --no-interaction install -o'); + echo "\n\n"; +} + use Symfony\Component\Console\Application; require_once(__DIR__ . '/../vendor/autoload.php'); From 123c75ae2ddd61e02fc1387fef8c681bd72fb1b8 Mon Sep 17 00:00:00 2001 From: Djamil Legato Date: Fri, 5 Sep 2014 12:58:56 -0700 Subject: [PATCH 17/56] Changed command suggestion to run for installing the dependencies --- index.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/index.php b/index.php index 8af6d323a..2133f6219 100644 --- a/index.php +++ b/index.php @@ -4,9 +4,10 @@ if (version_compare($ver = PHP_VERSION, $req = '5.4.0', '<')) { exit(sprintf('You are running PHP %s, but Grav needs at least PHP %s to run.', $ver, $req)); } + $autoload = __DIR__ . '/vendor/autoload.php'; if (!is_file($autoload)) { - exit('Please run: composer install -o'); + exit('Please run: bin/grav install'); } use Grav\Common\Grav; From 470bac23bcb8fbfec4ad9abe249f15462a9e7728 Mon Sep 17 00:00:00 2001 From: Djamil Legato Date: Fri, 5 Sep 2014 13:40:35 -0700 Subject: [PATCH 18/56] Removed vendors from the mapping in SetupCommand --- system/src/Grav/Console/SetupCommand.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/system/src/Grav/Console/SetupCommand.php b/system/src/Grav/Console/SetupCommand.php index fcc567a05..8253d4765 100644 --- a/system/src/Grav/Console/SetupCommand.php +++ b/system/src/Grav/Console/SetupCommand.php @@ -31,8 +31,7 @@ class SetupCommand extends Command protected $mappings = array('/index.php' => '/index.php', '/composer.json' => '/composer.json', '/bin' => '/bin', - '/system' => '/system', - '/vendor' => '/vendor' + '/system' => '/system' ); protected $default_file = "---\ntitle: HomePage\n---\n# HomePage\n\nLorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque porttitor eu felis sed ornare. Sed a mauris venenatis, pulvinar velit vel, dictum enim. Phasellus ac rutrum velit. Nunc lorem purus, hendrerit sit amet augue aliquet, iaculis ultricies nisl. Suspendisse tincidunt euismod risus, quis feugiat arcu tincidunt eget. Nulla eros mi, commodo vel ipsum vel, aliquet congue odio. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Pellentesque velit orci, laoreet at adipiscing eu, interdum quis nibh. Nunc a accumsan purus."; From 103abc5f6d665311ecb2912ea14d4ef7a89b1527 Mon Sep 17 00:00:00 2001 From: Jan Chren Date: Fri, 5 Sep 2014 23:11:02 +0200 Subject: [PATCH 19/56] assets attributes implemented --- system/src/Grav/Common/Assets.php | 44 ++++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/system/src/Grav/Common/Assets.php b/system/src/Grav/Common/Assets.php index 78e389767..906b9615f 100644 --- a/system/src/Grav/Common/Assets.php +++ b/system/src/Grav/Common/Assets.php @@ -262,7 +262,7 @@ public function addJs($asset, $priority = 10, $pipeline = true) * * @return string */ - public function css() + public function css($attributes = []) { if( ! $this->css) return null; @@ -271,21 +271,21 @@ public function css() usort($this->css, function ($a, $b) {return $a['priority'] - $b['priority'];}); $this->css = array_reverse($this->css); - + $attributes = $this->attributes(array_merge([ 'type' => 'text/css', 'rel' => 'stylesheet' ], $attributes)); $output = ''; if($this->css_pipeline) { - $output .= ''."\n"; + $output .= ''."\n"; foreach ($this->css_no_pipeline as $file) { - $output .= ''."\n"; + $output .= ''."\n"; } return $output; } foreach($this->css as $file) - $output .= ''."\n"; + $output .= ''."\n"; return $output; } @@ -295,7 +295,7 @@ public function css() * * @return string */ - public function js() + public function js($attributes = []) { if( ! $this->js) return null; @@ -304,22 +304,48 @@ public function js() usort($this->js, function ($a, $b) {return $a['priority'] - $b['priority'];}); $this->js = array_reverse($this->js); + $attributes = $this->attributes(array_merge([ 'type' => 'text/javascript' ], $attributes)); + $output = ''; if($this->js_pipeline) { - $output .= ''."\n"; + $output .= ''."\n"; foreach ($this->js_no_pipeline as $file) { - $output .= ''."\n"; + $output .= ''."\n"; } return $output; } foreach($this->js as $file) - $output .= ''."\n"; + $output .= ''."\n"; return $output; } + /** + * Build an HTML attribute string from an array. + * + * @param array $attributes + * @return string + */ + protected function attributes(array $attributes){ + $html = ''; + + foreach ( $attributes as $key => $value) + { + // For numeric keys we will assume that the key and the value are the same + // as this will convert HTML attributes such as "required" to a correct + // form like required="required" instead of using incorrect numerics. + if (is_numeric($key)) $key = $value; + if (is_array($value)) $value = implode(' ', $value); + + $element = $key.'="'.htmlentities($value, ENT_QUOTES, 'UTF-8', false).'"'; + $html .= ' '.$element; + } + + return $html; + } + /** * Add/replace collection. * From f8fe108db56bd9c5c6346db5017a3b32bfa6f62f Mon Sep 17 00:00:00 2001 From: Jan Chren Date: Fri, 5 Sep 2014 23:19:18 +0200 Subject: [PATCH 20/56] PHPDocs updated --- system/src/Grav/Common/Assets.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/system/src/Grav/Common/Assets.php b/system/src/Grav/Common/Assets.php index 906b9615f..5c3b6cd45 100644 --- a/system/src/Grav/Common/Assets.php +++ b/system/src/Grav/Common/Assets.php @@ -260,6 +260,7 @@ public function addJs($asset, $priority = 10, $pipeline = true) /** * Build the CSS link tags. * + * @param array $attributes * @return string */ public function css($attributes = []) @@ -293,6 +294,7 @@ public function css($attributes = []) /** * Build the JavaScript script tags. * + * @param array $attributes * @return string */ public function js($attributes = []) From d234b8e2128356a5d7c76e7d7048c21a26bd49c2 Mon Sep 17 00:00:00 2001 From: Jan Chren Date: Sat, 6 Sep 2014 00:00:47 +0200 Subject: [PATCH 21/56] reverted back to file-only checks, changed to file_exists() --- system/src/Grav/Common/Config.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/system/src/Grav/Common/Config.php b/system/src/Grav/Common/Config.php index 484ed1763..876b13f40 100644 --- a/system/src/Grav/Common/Config.php +++ b/system/src/Grav/Common/Config.php @@ -232,10 +232,9 @@ protected function build() /** @var \DirectoryIterator $plugin */ foreach ($iterator as $plugin) { $name = $plugin->getBasename(); - $dir = $plugin->getPathname() ; - $file = $dir . DS . $name . YAML_EXT; + $file = $plugin->getPathname() . DS . $name . YAML_EXT; - if (!(is_dir($dir) && is_file($file))) { + if (!file_exists($file)) { continue; } From cb03c7ab0dfd47921ab8e29cdfdfe70b89ff914a Mon Sep 17 00:00:00 2001 From: Jan Chren Date: Sat, 6 Sep 2014 00:46:59 +0200 Subject: [PATCH 22/56] Revert "reverted back to file-only checks, changed to file_exists()" This reverts commit d234b8e2128356a5d7c76e7d7048c21a26bd49c2. --- system/src/Grav/Common/Config.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/system/src/Grav/Common/Config.php b/system/src/Grav/Common/Config.php index 876b13f40..484ed1763 100644 --- a/system/src/Grav/Common/Config.php +++ b/system/src/Grav/Common/Config.php @@ -232,9 +232,10 @@ protected function build() /** @var \DirectoryIterator $plugin */ foreach ($iterator as $plugin) { $name = $plugin->getBasename(); - $file = $plugin->getPathname() . DS . $name . YAML_EXT; + $dir = $plugin->getPathname() ; + $file = $dir . DS . $name . YAML_EXT; - if (!file_exists($file)) { + if (!(is_dir($dir) && is_file($file))) { continue; } From 393c8cab2a47d27caad05ea102ff4c46366533dd Mon Sep 17 00:00:00 2001 From: Jan Chren Date: Sat, 6 Sep 2014 03:09:07 +0200 Subject: [PATCH 23/56] final workaround for PHP bug 52065 --- system/src/Grav/Common/Config.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/system/src/Grav/Common/Config.php b/system/src/Grav/Common/Config.php index 484ed1763..b8a646fe1 100644 --- a/system/src/Grav/Common/Config.php +++ b/system/src/Grav/Common/Config.php @@ -231,13 +231,12 @@ protected function build() /** @var \DirectoryIterator $plugin */ foreach ($iterator as $plugin) { + if ($iterator->isFile() || $iterator->isDot()) continue; + $name = $plugin->getBasename(); - $dir = $plugin->getPathname() ; - $file = $dir . DS . $name . YAML_EXT; + $file = $plugin->getPathname() . DS . $name . YAML_EXT; - if (!(is_dir($dir) && is_file($file))) { - continue; - } + if (!file_exists($file)) continue; $modified = filemtime($file); $plugins["plugins/{$name}"] = $modified; From e2917e36f8dcf007af2e7456d6afc0f896943a1e Mon Sep 17 00:00:00 2001 From: Djamil Legato Date: Fri, 5 Sep 2014 18:51:14 -0700 Subject: [PATCH 24/56] Fixed use of streams. Using YAML_EXT constant for the extension. Changed get and all methods to static --- system/src/Grav/Common/Themes.php | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/system/src/Grav/Common/Themes.php b/system/src/Grav/Common/Themes.php index 132334f68..17d4040f8 100644 --- a/system/src/Grav/Common/Themes.php +++ b/system/src/Grav/Common/Themes.php @@ -1,9 +1,7 @@ grav = $grav; } @@ -29,10 +23,10 @@ public function __construct(Grav $grav) * * @return array|Data[] */ - public function all() + public static function all() { $list = array(); - $iterator = new \DirectoryIterator(THEMES_DIR); + $iterator = new \DirectoryIterator('themes:///'); /** @var \DirectoryIterator $directory */ foreach ($iterator as $directory) { @@ -56,13 +50,13 @@ public function all() * @return Data * @throws \RuntimeException */ - public function get($name) + public static function get($name) { if (!$name) { throw new \RuntimeException('Theme name not provided.'); } - $blueprints = new Blueprints("theme:///{$name}"); + $blueprints = new Data\Blueprints("theme://{$name}"); $blueprint = $blueprints->get('blueprints'); $blueprint->name = $name; @@ -70,17 +64,17 @@ public function get($name) $config = $this->grav['config']; // Find thumbnail. - $thumb = "theme:///{$name}/thumbnail.jpg"; + $thumb = "theme://{$name}/thumbnail.jpg"; if (file_exists($thumb)) { $blueprint->set('thumbnail', $config->get('system.base_url_relative') . "/user/themes/{$name}/thumbnail.jpg"); } // Load default configuration. - $file = Yaml::instance("theme:///{$name}/{$name}.yaml"); - $obj = new Data($file->content(), $blueprint); + $file = File\Yaml::instance("theme://{$name}/{$name}" . YAML_EXT); + $obj = new Data\Data($file->content(), $blueprint); // Override with user configuration. - $file = Yaml::instance("user://config/themes/{$name}.yaml"); + $file = File\Yaml::instance("user://config/themes/{$name}" . YAML_EXT); $obj->merge($file->content()); // Save configuration always to user/config. @@ -139,7 +133,7 @@ public function configure($name = null) { /** @var Config $config */ $config = $this->grav['config']; - $themeConfig = Yaml::instance(THEMES_DIR . "{$name}/{$name}.yaml")->content(); + $themeConfig = File\Yaml::instance("theme://{$name}/{$name}" . YAML_EXT)->content(); $config->merge(['themes' => [$name => $themeConfig]]); From 80d08eace7a0668ec884c16b2c97f619a62e1ae1 Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Fri, 5 Sep 2014 20:52:46 -0600 Subject: [PATCH 25/56] fixes for themes streams and such --- system/src/Grav/Common/Themes.php | 31 +++++++++++++------------------ 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/system/src/Grav/Common/Themes.php b/system/src/Grav/Common/Themes.php index 17d4040f8..6de6b5735 100644 --- a/system/src/Grav/Common/Themes.php +++ b/system/src/Grav/Common/Themes.php @@ -13,9 +13,11 @@ class Themes extends Iterator { protected $grav; + protected $config; public function __construct(Grav $grav) { $this->grav = $grav; + $this->config = $grav['config']; } /** @@ -23,10 +25,10 @@ public function __construct(Grav $grav) { * * @return array|Data[] */ - public static function all() + public function all() { $list = array(); - $iterator = new \DirectoryIterator('themes:///'); + $iterator = new \DirectoryIterator('theme:///'); /** @var \DirectoryIterator $directory */ foreach ($iterator as $directory) { @@ -50,7 +52,7 @@ public static function all() * @return Data * @throws \RuntimeException */ - public static function get($name) + public function get($name) { if (!$name) { throw new \RuntimeException('Theme name not provided.'); @@ -60,13 +62,11 @@ public static function get($name) $blueprint = $blueprints->get('blueprints'); $blueprint->name = $name; - /** @var Config $config */ - $config = $this->grav['config']; - // Find thumbnail. - $thumb = "theme://{$name}/thumbnail.jpg"; + $thumb = "theme:///{$name}/thumbnail.jpg"; + if (file_exists($thumb)) { - $blueprint->set('thumbnail', $config->get('system.base_url_relative') . "/user/themes/{$name}/thumbnail.jpg"); + $blueprint->set('thumbnail', $this->config->get('system.base_url_relative') . "/user/themes/{$name}/thumbnail.jpg"); } // Load default configuration. @@ -85,24 +85,19 @@ public static function get($name) public function current($name = null) { - /** @var Config $config */ - $config = $this->grav['config']; if (!$name) { - $name = $config->get('system.pages.theme'); + $name = $this->config->get('system.pages.theme'); } return $name; } - public function load($name = null) + function load($name = null) { $name = $this->current($name); $grav = $this->grav; - /** @var Config $config */ - $config = $grav['config']; - /** @var ResourceLocator $locator */ $locator = $grav['locator']; @@ -115,13 +110,13 @@ public function load($name = null) $className = '\\Grav\\Theme\\' . ucfirst($name); if (class_exists($className)) { - $class = new $className($grav, $config, $name); + $class = new $className($grav, $this->config, $name); } } } if (empty($class)) { - $class = new Theme($grav, $config, $name); + $class = new Theme($grav, $this->config, $name); } return $class; @@ -131,7 +126,7 @@ public function configure($name = null) { $name = $this->current($name); /** @var Config $config */ - $config = $this->grav['config']; + $config = $this->config; $themeConfig = File\Yaml::instance("theme://{$name}/{$name}" . YAML_EXT)->content(); From 0fec4c003bcf82199252eab2d1aef16041aa9bb2 Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Fri, 5 Sep 2014 22:25:13 -0600 Subject: [PATCH 26/56] getList was returning nothing --- system/src/Grav/Common/Page/Pages.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/src/Grav/Common/Page/Pages.php b/system/src/Grav/Common/Page/Pages.php index 39a201d7a..39aa9d487 100644 --- a/system/src/Grav/Common/Page/Pages.php +++ b/system/src/Grav/Common/Page/Pages.php @@ -300,7 +300,7 @@ public function getList(Page $current = null, $level = 0) $list[$current->route()] = str_repeat('  ', ($level-1)*2) . $current->title(); } - foreach ($current as $next) { + foreach ($current->children() as $next) { $list = array_merge($list, $this->getList($next, $level + 1)); } From 7a38ac0810fd5516150af09a2bdb33f0893dbc6b Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Fri, 5 Sep 2014 22:25:48 -0600 Subject: [PATCH 27/56] override modified only if a non-markdown file was modified --- system/src/Grav/Common/Page/Pages.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/system/src/Grav/Common/Page/Pages.php b/system/src/Grav/Common/Page/Pages.php index 39aa9d487..fb45bc897 100644 --- a/system/src/Grav/Common/Page/Pages.php +++ b/system/src/Grav/Common/Page/Pages.php @@ -426,17 +426,13 @@ protected function recurse($directory = PAGES_DIR, Page &$parent = null) throw new \RuntimeException('Fatal error when creating page instances.'); } - $last_modified = 0; + // set current modified of page + $last_modified = $page->modified(); /** @var \DirectoryIterator $file */ foreach ($iterator as $file) { $name = $file->getFilename(); - $date = $file->getMTime(); - if ($date > $last_modified) { - $last_modified = $date; - } - if ($file->isFile() && Utils::endsWith($name, CONTENT_EXT)) { $page->init($file); @@ -471,12 +467,16 @@ protected function recurse($directory = PAGES_DIR, Page &$parent = null) if ($config->get('system.pages.events.page')) { $this->grav->fireEvent('onFolderProcessed', new Event(['page' => $page])); } + } else { + $date = $file->getMTime(); + if ($date > $last_modified) { + $last_modified = $date; + } } } - // Override the modified and ID so that it takes the latest change - // into account + // Override the modified and ID so that it takes the latest change into account $page->modified($last_modified); $page->id($last_modified.md5($page->filePath())); From 95a806c8f8214e1e73da8a042994250528652647 Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Fri, 5 Sep 2014 22:41:48 -0600 Subject: [PATCH 28/56] removed stray test page --- user/pages/02.test/default.md | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 user/pages/02.test/default.md diff --git a/user/pages/02.test/default.md b/user/pages/02.test/default.md deleted file mode 100644 index 54cb70b34..000000000 --- a/user/pages/02.test/default.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Test ---- - -# Testing From 528f85642fb1d31bca138f601303d714af518506 Mon Sep 17 00:00:00 2001 From: Djamil Legato Date: Fri, 5 Sep 2014 22:39:26 -0700 Subject: [PATCH 29/56] Reverted streams for theme --- system/src/Grav/Common/Themes.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/system/src/Grav/Common/Themes.php b/system/src/Grav/Common/Themes.php index 6de6b5735..215e50dbe 100644 --- a/system/src/Grav/Common/Themes.php +++ b/system/src/Grav/Common/Themes.php @@ -58,7 +58,7 @@ public function get($name) throw new \RuntimeException('Theme name not provided.'); } - $blueprints = new Data\Blueprints("theme://{$name}"); + $blueprints = new Data\Blueprints("theme:///{$name}"); $blueprint = $blueprints->get('blueprints'); $blueprint->name = $name; @@ -70,7 +70,7 @@ public function get($name) } // Load default configuration. - $file = File\Yaml::instance("theme://{$name}/{$name}" . YAML_EXT); + $file = File\Yaml::instance("theme:///{$name}/{$name}" . YAML_EXT); $obj = new Data\Data($file->content(), $blueprint); // Override with user configuration. From 09248f2917316afbf825ca25e92fccd5ba94c67d Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Sat, 6 Sep 2014 13:28:47 -0600 Subject: [PATCH 30/56] Added barDump() to Debugger --- composer.json | 4 ++-- system/src/Grav/Common/Debugger.php | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index 7a2e4cb20..82067afc3 100644 --- a/composer.json +++ b/composer.json @@ -13,8 +13,8 @@ "symfony/console": "~2.5", "symfony/event-dispatcher": "~2.5", "doctrine/cache": "~1.3", - "tracy/tracy": "~2.2", - "gregwar/image": "~2.0", + "tracy/tracy": "2.3.*@dev", + "gregwar/image": "~2.0", "ircmaxell/password-compat": "1.0.*", "mrclay/minify": "dev-master", "donatj/phpuseragentparser": "dev-master", diff --git a/system/src/Grav/Common/Debugger.php b/system/src/Grav/Common/Debugger.php index 3ffbd50b0..93aafee67 100644 --- a/system/src/Grav/Common/Debugger.php +++ b/system/src/Grav/Common/Debugger.php @@ -70,4 +70,9 @@ public static function dump($var) { TracyDebugger::dump($var); } + + public static function barDump($var, $title = NULL, array $options = NULL) + { + TracyDebugger::barDump($var, $title, $options); + } } From 5667f8b0237000a4fa68b033ad6165eef69c3332 Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Sat, 6 Sep 2014 13:29:56 -0600 Subject: [PATCH 31/56] Added shutddown event to flush buffer and set content length (tracy-safe) --- system/src/Grav/Common/Grav.php | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/system/src/Grav/Common/Grav.php b/system/src/Grav/Common/Grav.php index 07d548d75..edf05cd4c 100644 --- a/system/src/Grav/Common/Grav.php +++ b/system/src/Grav/Common/Grav.php @@ -141,12 +141,13 @@ public function process() // Set the header type $this->header(); - echo $this->output; + Debugger::barDump($this['plugins']); - ob_end_flush(); - flush(); + echo $this->output; $this->fireEvent('onOutputRendered'); + + register_shutdown_function([$this, 'shutdown']); } /** @@ -209,4 +210,15 @@ public function fireEvent($eventName, Event $event = null) $events = $this['events']; return $events->dispatch($eventName, $event); } + + /** + * Set the final content length for the page and flush the buffer + * + */ + public function shutdown() + { + header('Content-length: ' . ob_get_length()); + ob_end_flush(); + flush(); + } } From cd5707f2d24ad70df2bace92d1b40e2008738c1a Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Sat, 6 Sep 2014 13:31:34 -0600 Subject: [PATCH 32/56] removed barDump() test :) --- system/src/Grav/Common/Grav.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/system/src/Grav/Common/Grav.php b/system/src/Grav/Common/Grav.php index edf05cd4c..faf71398a 100644 --- a/system/src/Grav/Common/Grav.php +++ b/system/src/Grav/Common/Grav.php @@ -141,8 +141,6 @@ public function process() // Set the header type $this->header(); - Debugger::barDump($this['plugins']); - echo $this->output; $this->fireEvent('onOutputRendered'); From 2a43983ede68602b5e45083ccd9f8864e4a00459 Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Sat, 6 Sep 2014 14:32:21 -0600 Subject: [PATCH 33/56] added onShutdown event that fires after the connection has been closed (background processing) --- system/src/Grav/Common/Grav.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/system/src/Grav/Common/Grav.php b/system/src/Grav/Common/Grav.php index faf71398a..476da4ac1 100644 --- a/system/src/Grav/Common/Grav.php +++ b/system/src/Grav/Common/Grav.php @@ -215,8 +215,18 @@ public function fireEvent($eventName, Event $event = null) */ public function shutdown() { + set_time_limit(0); + ignore_user_abort(true); + header('Content-length: ' . ob_get_length()); + header("Connection: close\r\n"); + ob_end_flush(); + ob_flush(); flush(); + + session_write_close(); + + $this->fireEvent('onShutdown'); } } From 193eda633ce8d3c0abc8342a1ae8393a54121615 Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Sun, 7 Sep 2014 09:00:29 -0600 Subject: [PATCH 34/56] Added an option to disable the shutdown close connection to help with debugging --- system/config/system.yaml | 2 ++ system/src/Grav/Common/Grav.php | 19 ++++++++++--------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/system/config/system.yaml b/system/config/system.yaml index 7529f9b01..bd18a408c 100644 --- a/system/config/system.yaml +++ b/system/config/system.yaml @@ -47,3 +47,5 @@ debugger: log: enabled: true # Enable logging timing: false # Enable timing logging + shutdown: + close_connection: true # Close the connection before calling onShutdown(). disable for debugging diff --git a/system/src/Grav/Common/Grav.php b/system/src/Grav/Common/Grav.php index 476da4ac1..dd787a60e 100644 --- a/system/src/Grav/Common/Grav.php +++ b/system/src/Grav/Common/Grav.php @@ -215,17 +215,18 @@ public function fireEvent($eventName, Event $event = null) */ public function shutdown() { - set_time_limit(0); - ignore_user_abort(true); + if($this['config']->get('system.debugger.shutdown.close_connection')) { + set_time_limit(0); + ignore_user_abort(true); + session_write_close(); - header('Content-length: ' . ob_get_length()); - header("Connection: close\r\n"); + header('Content-length: ' . ob_get_length()); + header("Connection: close\r\n"); - ob_end_flush(); - ob_flush(); - flush(); - - session_write_close(); + ob_end_flush(); + ob_flush(); + flush(); + } $this->fireEvent('onShutdown'); } From fa92ec0141961ccdc7841bba97c16b0f50174a40 Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Sun, 7 Sep 2014 19:57:14 -0600 Subject: [PATCH 35/56] Added method to get user IP address --- system/src/Grav/Common/Uri.php | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/system/src/Grav/Common/Uri.php b/system/src/Grav/Common/Uri.php index bddbcd8cb..ec1c9d88b 100644 --- a/system/src/Grav/Common/Uri.php +++ b/system/src/Grav/Common/Uri.php @@ -298,4 +298,30 @@ public function referrer($default = null, $attributes = null) // Return relative path. return substr($referrer, strlen($root)); } + + /** + * Retrun the IP address of the current user + * + * @return string ip address + */ + public function ip() + { + $ipaddress = ''; + if (getenv('HTTP_CLIENT_IP')) + $ipaddress = getenv('HTTP_CLIENT_IP'); + else if(getenv('HTTP_X_FORWARDED_FOR')) + $ipaddress = getenv('HTTP_X_FORWARDED_FOR'); + else if(getenv('HTTP_X_FORWARDED')) + $ipaddress = getenv('HTTP_X_FORWARDED'); + else if(getenv('HTTP_FORWARDED_FOR')) + $ipaddress = getenv('HTTP_FORWARDED_FOR'); + else if(getenv('HTTP_FORWARDED')) + $ipaddress = getenv('HTTP_FORWARDED'); + else if(getenv('REMOTE_ADDR')) + $ipaddress = getenv('REMOTE_ADDR'); + else + $ipaddress = 'UNKNOWN'; + return $ipaddress; + + } } From 5f03dfa8edf658bd553c0f1fc59c52826e0bafda Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Mon, 8 Sep 2014 09:51:37 +0300 Subject: [PATCH 36/56] Fix url() twig function when Grav isn't installed to root --- system/src/Grav/Common/TwigExtension.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/src/Grav/Common/TwigExtension.php b/system/src/Grav/Common/TwigExtension.php index 82b0cdad3..7cb241bb9 100644 --- a/system/src/Grav/Common/TwigExtension.php +++ b/system/src/Grav/Common/TwigExtension.php @@ -213,6 +213,6 @@ public function urlFunc($input, $domain = false) /** @var Uri $uri */ $uri = $grav['uri']; - return $uri->rootUrl($domain) . $locator->findResource($input, false); + return $uri->rootUrl($domain) .'/'. $locator->findResource($input, false); } } From b50ec3fedd78e75c83a88775c512423c3bb5c9aa Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Mon, 8 Sep 2014 22:18:31 +0300 Subject: [PATCH 37/56] Separate themes from plugins, add themes:// stream and onTask events --- system/config/streams.yaml | 7 ++- system/src/Grav/Common/Grav.php | 20 +++++-- system/src/Grav/Common/Plugins.php | 8 --- system/src/Grav/Common/Themes.php | 86 +++++++++++++++++++++--------- system/src/Grav/Common/Twig.php | 1 + 5 files changed, 82 insertions(+), 40 deletions(-) diff --git a/system/config/streams.yaml b/system/config/streams.yaml index eddcfce7a..cab7a866d 100644 --- a/system/config/streams.yaml +++ b/system/config/streams.yaml @@ -40,8 +40,7 @@ schemes: paths: - user/data - theme: + themes: type: ReadOnlyStream - prefixes: - '/': - - user/themes + paths: + - user/themes diff --git a/system/src/Grav/Common/Grav.php b/system/src/Grav/Common/Grav.php index dd787a60e..2a848fb7d 100644 --- a/system/src/Grav/Common/Grav.php +++ b/system/src/Grav/Common/Grav.php @@ -54,12 +54,17 @@ protected static function load(array $values) $container['grav'] = $container; - $container['events'] = function ($c) { - return new EventDispatcher; - }; $container['uri'] = function ($c) { return new Uri($c); }; + + $container['task'] = function ($c) { + return !empty($_POST['task']) ? $_POST['task'] : $c['uri']->param('task'); + }; + + $container['events'] = function ($c) { + return new EventDispatcher; + }; $container['config'] = function ($c) { return Config::instance($c); }; @@ -122,6 +127,15 @@ public function process() $this->fireEvent('onPluginsInitialized'); + $this['themes']->init(); + + $this->fireEvent('onThemeInitialized'); + + $task = $this['task']; + if ($task) { + $this->fireEvent('onTask.' . $task); + } + $this['assets']->init(); $this->fireEvent('onAssetsInitialized'); diff --git a/system/src/Grav/Common/Plugins.php b/system/src/Grav/Common/Plugins.php index 9f70d8b7c..ec2c3bffe 100644 --- a/system/src/Grav/Common/Plugins.php +++ b/system/src/Grav/Common/Plugins.php @@ -60,14 +60,6 @@ public function init() } } - /** @var Themes $themes */ - $themes = $this->grav['themes']; - $themes->configure(); - $instance = $themes->load(); - if ($instance instanceof EventSubscriberInterface) { - $events->addSubscriber($instance); - } - return $this->items; } diff --git a/system/src/Grav/Common/Themes.php b/system/src/Grav/Common/Themes.php index 215e50dbe..ca5854ecb 100644 --- a/system/src/Grav/Common/Themes.php +++ b/system/src/Grav/Common/Themes.php @@ -1,7 +1,11 @@ grav = $grav; $this->config = $grav['config']; } + public function init() + { + /** @var EventDispatcher $events */ + $events = $this->grav['events']; + + /** @var Themes $themes */ + $themes = $this->grav['themes']; + $themes->configure(); + $instance = $themes->load(); + + if ($instance instanceof EventSubscriberInterface) { + $events->addSubscriber($instance); + } + + $this->grav['theme'] = $instance; + } + /** * Return list of all theme data with their blueprints. * - * @return array|Data[] + * @return array */ public function all() { $list = array(); - $iterator = new \DirectoryIterator('theme:///'); + $iterator = new \DirectoryIterator('themes://'); /** @var \DirectoryIterator $directory */ foreach ($iterator as $directory) { @@ -46,7 +71,7 @@ public function all() } /** - * Get theme or throw exception if it cannot be found. + * Get theme configuration or throw exception if it cannot be found. * * @param string $name * @return Data @@ -58,20 +83,20 @@ public function get($name) throw new \RuntimeException('Theme name not provided.'); } - $blueprints = new Data\Blueprints("theme:///{$name}"); + $blueprints = new Blueprints("themes://{$name}"); $blueprint = $blueprints->get('blueprints'); $blueprint->name = $name; // Find thumbnail. - $thumb = "theme:///{$name}/thumbnail.jpg"; + $thumb = "themes://{$name}/thumbnail.jpg"; if (file_exists($thumb)) { $blueprint->set('thumbnail', $this->config->get('system.base_url_relative') . "/user/themes/{$name}/thumbnail.jpg"); } // Load default configuration. - $file = File\Yaml::instance("theme:///{$name}/{$name}" . YAML_EXT); - $obj = new Data\Data($file->content(), $blueprint); + $file = File\Yaml::instance("themes://{$name}/{$name}" . YAML_EXT); + $obj = new Data($file->content(), $blueprint); // Override with user configuration. $file = File\Yaml::instance("user://config/themes/{$name}" . YAML_EXT); @@ -83,52 +108,64 @@ public function get($name) return $obj; } - public function current($name = null) + /** + * Return name of the current theme. + * + * @return string + */ + public function current() { - - if (!$name) { - $name = $this->config->get('system.pages.theme'); - } - - return $name; + return (string) $this->config->get('system.pages.theme'); } - function load($name = null) + /** + * Load current theme. + * + * @return Theme|object + */ + public function load() { - $name = $this->current($name); + // NOTE: ALL THE LOCAL VARIABLES ARE USED INSIDE INCLUDED FILE, DO NOT REMOVE THEM! $grav = $this->grav; + $config = $this->config; + $name = $this->current(); /** @var ResourceLocator $locator */ $locator = $grav['locator']; - $file = $locator("theme://theme.php") ?: $locator("theme://{$name}.php"); + if ($file) { - // Local variables available in the file: $grav, $config, $name, $path, $file + // Local variables available in the file: $grav, $config, $name, $file $class = include $file; if (!is_object($class)) { $className = '\\Grav\\Theme\\' . ucfirst($name); if (class_exists($className)) { - $class = new $className($grav, $this->config, $name); + $class = new $className($grav, $config, $name); } } } if (empty($class)) { - $class = new Theme($grav, $this->config, $name); + $class = new Theme($grav, $config, $name); } return $class; } - public function configure($name = null) { - $name = $this->current($name); + /** + * Configure and prepare streams for current template. + * + * @throws \InvalidArgumentException + */ + public function configure() { + $name = $this->current(); /** @var Config $config */ $config = $this->config; - $themeConfig = File\Yaml::instance("theme://{$name}/{$name}" . YAML_EXT)->content(); + $themeConfig = File\Yaml::instance("themes://{$name}/{$name}" . YAML_EXT)->content(); $config->merge(['themes' => [$name => $themeConfig]]); @@ -163,7 +200,6 @@ public function configure($name = null) { if (!stream_wrapper_register($scheme, $type)) { throw new \InvalidArgumentException("Stream '{$type}' could not be initialized."); } - } } } diff --git a/system/src/Grav/Common/Twig.php b/system/src/Grav/Common/Twig.php index 0177ba029..2e8d57c7e 100644 --- a/system/src/Grav/Common/Twig.php +++ b/system/src/Grav/Common/Twig.php @@ -103,6 +103,7 @@ public function init() // Set some standard variables for twig $this->twig_vars = array( + 'grav' => $this->grav, 'grav_version' => GRAV_VERSION, 'config' => $config, 'uri' => $this->grav['uri'], From ff3ebb1f17a896ab309b1bf4a47d3c863a835b26 Mon Sep 17 00:00:00 2001 From: Jan Chren Date: Tue, 9 Sep 2014 02:05:19 +0200 Subject: [PATCH 38/56] calculate only once in loops --- system/src/Grav/Common/TwigExtension.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/system/src/Grav/Common/TwigExtension.php b/system/src/Grav/Common/TwigExtension.php index 82b0cdad3..43579020c 100644 --- a/system/src/Grav/Common/TwigExtension.php +++ b/system/src/Grav/Common/TwigExtension.php @@ -126,7 +126,8 @@ public function randomizeFilter($original, $offset = 0) $random = array_slice($original, $offset); shuffle($random); - for ($x=0; $x < sizeof($original); $x++) { + $sizeOf = sizeof($original); + for ($x=0; $x < $sizeOf; $x++) { if ($x < $offset) { $sorted[] = $original[$x]; } else { From 5739e9729f7e0bb5256638e9205562407bf4ab4a Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Wed, 10 Sep 2014 14:45:16 +0300 Subject: [PATCH 39/56] Add stream support into ResourceLocator::addPath() --- system/src/Grav/Component/Filesystem/ResourceLocator.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/system/src/Grav/Component/Filesystem/ResourceLocator.php b/system/src/Grav/Component/Filesystem/ResourceLocator.php index add8762ac..a1cee1664 100644 --- a/system/src/Grav/Component/Filesystem/ResourceLocator.php +++ b/system/src/Grav/Component/Filesystem/ResourceLocator.php @@ -23,7 +23,12 @@ public function addPath($scheme, $prefix, $paths) { $list = []; foreach((array) $paths as $path) { - $list[] = trim($path, '/'); + $path = trim($path, '/'); + if (strstr($path, '://')) { + $list = array_merge($list, $this->find($path, true, false)); + } else { + $list[] = $path; + } } if (isset($this->schemes[$scheme][$prefix])) { From ee623596a8d63c40df727785569cf1c51e2b9d07 Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Wed, 10 Sep 2014 10:05:36 -0600 Subject: [PATCH 40/56] system.yaml updates and synchronization --- system/blueprints/site.yaml | 6 +- system/blueprints/system.yaml | 597 ++++++++++++++++++---------------- system/config/system.yaml | 1 - 3 files changed, 328 insertions(+), 276 deletions(-) diff --git a/system/blueprints/site.yaml b/system/blueprints/site.yaml index 851030504..614137f6f 100644 --- a/system/blueprints/site.yaml +++ b/system/blueprints/site.yaml @@ -1,11 +1,13 @@ -title: Site settings +title: Site validation: strict form: fields: title: type: text - label: Site title + label: Site Title + placeholder: "Site wide title" + help: Default title for your site description: type: textarea diff --git a/system/blueprints/system.yaml b/system/blueprints/system.yaml index 097d67663..e4fd63c16 100644 --- a/system/blueprints/system.yaml +++ b/system/blueprints/system.yaml @@ -1,275 +1,326 @@ -title: Configuration -validation: strict +title: System form: - fields: - basics: - type: section - title: Basics - underline: true - - fields: - title: - type: text - label: Site Title - placeholder: "Site wide title" - help: Default title for your site - - base_url_absolute: - type: text - label: Absolute Base URL - placeholder: "Override Absolute base URL (e.g. http://example.com)" - help: You can provide a base URL to use rather than letting Grav guess what it is - - base_url_relative: - type: text - label: Relative Base URL - placeholder: "Override Relative base URL (e.g. /subdirectory/site)" - help: You can provide a base URL to use rather than letting Grav guess what it is - - pages.dateformat.short: - type: select - label: PHP date format - help: "Set the PHP date format" - default: 'jS M Y' - options: - 'F jS \\a\\t g:ia': "January 1st at 11:59pm" - 'l jS of F g:i A': "Monday 1st of January at 11:59 PM" - 'D, m M Y G:i:s': "Mon, 01 Jan 2014 23:59:00" - 'd-m-y G:i': "01-01-14 23:59" - 'jS M Y': "10th Feb 2014" - - pages.dateformat.long: - type: select - label: Default date format - help: "Set default date format rather than default for |date() filter" - options: - 'F jS \a\t g:ia': "January 1st at 11:59pm" - 'l jS of F g:i A': "Monday 1st of January at 11:59 PM" - 'D, m M Y G:i:s': "Mon, 01 Jan 2014 23:59:00" - 'd-m-y G:i': "01-01-14 23:59" - 'jS M Y': "10th Feb 2014" - - pages.theme: - type: themeselect - label: Default Theme - help: "Set the theme (defaults to 'default')" - - content: - type: section - title: Content - underline: true - - fields: - home.alias: - type: pages - label: Home page - show_all: false - show_modular: false - show_root: false - help: "The page that Grav will use as the default landing page" - - pages.order.by: - type: select - label: Default ordering - options: - default: Default - based on folder name - folder: Folder - based on prefix-less folder name - title: Title - based on title field in header - date: Date - based on date field in header - - pages.order.dir: - type: toggle - label: Ordering direction - default: asc - options: - asc: Ascending - desc: Descending - - pages.list.count: - type: text - label: Item count - help: "Default max pages count" - validate: - type: number - min: 1 - - pages.process: - type: checkboxes - label: Process - default: [markdown: true, twig: true] - options: - markdown: Markdown - twig: Twig - use: keys - - events: - type: section - title: Events - underline: true - - fields: - pages.events.page: - type: toggle - label: Page events - highlight: 1 - options: - 1: Enabled - 0: Disabled - validate: - type: bool - - pages.events.twig: - type: toggle - label: Twig events - highlight: 1 - options: - 1: Enabled - 0: Disabled - validate: - type: bool - - caching: - type: section - title: Caching - underline: true - - fields: - cache.enabled: - type: toggle - label: Caching - highlight: 1 - options: - 1: Enabled - 0: Disabled - validate: - type: bool - - cache.check.pages: - type: toggle - label: Detect changes in pages - help: Be careful changing this setting. If you disable this setting, Grav no longer automatically updates the pages when the underlaying files are changed. - highlight: 1 - default: 1 - options: - 1: Enabled - 0: Disabled - validate: - type: bool - - cache.prefix: - type: text - label: Cache prefix - placeholder: "Derived from base URL (override by entering random string)" - - cache.driver: - type: select - label: Cache driver - options: - auto: Auto detect - file: File - apc: APC - xcache: XCache - memcache: MemCache - memcached: MemCached - wincache: WinCache - - twig: - type: section - title: Twig Templating - underline: true - - fields: - twig.cache: - type: toggle - label: Twig caching - highlight: 1 - options: - 1: Enabled - 0: Disabled - validate: - type: bool - - twig.debug: - type: toggle - label: Twig debug - highlight: 1 - options: - 1: Enabled - 0: Disabled - validate: - type: bool - - twig.auto_reload: - type: toggle - label: Detect changes - highlight: 1 - options: - 1: Enabled - 0: Disabled - validate: - type: bool - - twig.autoescape: - type: toggle - label: Autoescape variables - highlight: 1 - options: - 1: Enabled - 0: Disabled - validate: - type: bool - - debugger: - type: section - title: Debugger - underline: true - - fields: - debugger.enabled: - type: toggle - label: Debugger - highlight: 1 - options: - 1: Enabled - 0: Disabled - validate: - type: bool - - debugger.max_depth: - type: select - label: Detail levels - placeholder: "How many nested levels to display for objects or arrays" - options: - 1: 1 level - 2: 2 levels - 3: 3 levels - 4: 4 levels - 5: 5 levels - 6: 6 levels - 7: 7 levels - 8: 8 levels - 9: 9 levels - 10: 10 levels - validate: - type: number - - debugger.log.enabled: - type: toggle - label: Logging - highlight: 1 - options: - 1: Enabled - 0: Disabled - validate: - type: bool - - debugger.log.timing: - type: toggle - label: Log timings - highlight: 1 - options: - 1: Enabled - 0: Disabled - validate: - type: bool + fields: + + content: + type: section + title: Content + underline: true + + fields: + home.alias: + type: pages + size: medium + label: Home Page + show_all: false + show_modular: false + show_root: false + help: "The page that Grav will use as the default landing page" + + pages.theme: + type: themeselect + size: medium + label: Default Theme + help: "Set the theme (defaults to 'default')" + + pages.markdown_extra: + type: toggle + label: Markdown Extra + highlight: 1 + options: + 1: Enabled + 0: Disabled + validate: + type: bool + + pages.process: + type: checkboxes + label: Process + default: [markdown: true, twig: true] + options: + markdown: Markdown + twig: Twig + use: keys + + pages.dateformat.short: + type: select + label: Short Date Format + help: "Set the short date format" + default: 'jS M Y' + options: + 'F jS \\a\\t g:ia': "January 1st at 11:59pm" + 'l jS of F g:i A': "Monday 1st of January at 11:59 PM" + 'D, m M Y G:i:s': "Mon, 01 Jan 2014 23:59:00" + 'd-m-y G:i': "01-01-14 23:59" + 'jS M Y': "10th Feb 2014" + + pages.dateformat.long: + type: select + label: Long Date Format + help: "Set the long date format" + options: + 'F jS \a\t g:ia': "January 1st at 11:59pm" + 'l jS of F g:i A': "Monday 1st of January at 11:59 PM" + 'D, m M Y G:i:s': "Mon, 01 Jan 2014 23:59:00" + 'd-m-y G:i': "01-01-14 23:59" + 'jS M Y': "10th Feb 2014" + + pages.order.by: + type: select + label: Default Ordering + options: + default: Default - based on folder name + folder: Folder - based on prefix-less folder name + title: Title - based on title field in header + date: Date - based on date field in header + + pages.order.dir: + type: toggle + label: Default Order Direction + default: asc + options: + asc: Ascending + desc: Descending + + pages.list.count: + type: text + label: Default Item Count + help: "Default max pages count" + validate: + type: number + min: 1 + + + + events: + type: section + title: Events + underline: true + + fields: + pages.events.page: + type: toggle + label: Page events + highlight: 1 + options: + 1: Enabled + 0: Disabled + validate: + type: bool + + pages.events.twig: + type: toggle + label: Twig events + highlight: 1 + options: + 1: Enabled + 0: Disabled + validate: + type: bool + + caching: + type: section + title: Caching + underline: true + + fields: + cache.enabled: + type: toggle + label: Caching + highlight: 1 + options: + 1: Enabled + 0: Disabled + validate: + type: bool + + cache.check.method: + type: select + label: Cache Check Method + options: + file: File + folder: Folder + none: None + + cache.driver: + type: select + label: Cache driver + options: + auto: Auto detect + file: File + apc: APC + xcache: XCache + memcache: MemCache + wincache: WinCache + + cache.prefix: + type: text + label: Cache Prefix + placeholder: "Derived from base URL (override by entering random string)" + + twig: + type: section + title: Twig Templating + underline: true + + fields: + twig.cache: + type: toggle + label: Twig caching + highlight: 1 + options: + 1: Enabled + 0: Disabled + validate: + type: bool + + twig.debug: + type: toggle + label: Twig debug + highlight: 1 + options: + 1: Enabled + 0: Disabled + validate: + type: bool + + twig.auto_reload: + type: toggle + label: Detect changes + highlight: 1 + options: + 1: Enabled + 0: Disabled + validate: + type: bool + + twig.autoescape: + type: toggle + label: Autoescape variables + highlight: 1 + options: + 1: Enabled + 0: Disabled + validate: + type: bool + + assets: + type: section + title: Assets + underline: true + + fields: + assets.css_pipeline: + type: toggle + label: CSS Pipeline + highlight: 0 + options: + 1: Enabled + 0: Disabled + + assets.css_minify: + type: toggle + label: CSS Minify + highlight: 1 + options: + 1: Enabled + 0: Disabled + + assets.css_rewrite: + type: toggle + label: CSS Rewrite + highlight: 1 + options: + 1: Enabled + 0: Disabled + + assets.js_pipeline: + type: toggle + label: JavaScript Pipeline + highlight: 0 + options: + 1: Enabled + 0: Disabled + + assets.js_minify: + type: toggle + label: JavaScript Minify + highlight: 1 + options: + 1: Enabled + 0: Disabled + + debugger: + type: section + title: Debugger + underline: true + + fields: + debugger.enabled: + type: toggle + label: Debugger + highlight: 1 + options: + 1: Enabled + 0: Disabled + validate: + type: bool + + debugger.mode: + type: select + label: Mode + options: + detect: Auto-Detect + development: Development + production: Production + + debugger.strict: + type: toggle + label: Strict + highlight: 0 + options: + 1: Enabled + 0: Disabled + validate: + type: bool + + debugger.max_depth: + type: select + label: Detail Level + placeholder: "How many nested levels to display for objects or arrays" + options: + 1: 1 level + 2: 2 levels + 3: 3 levels + 4: 4 levels + 5: 5 levels + 6: 6 levels + 7: 7 levels + 8: 8 levels + 9: 9 levels + 10: 10 levels + validate: + type: number + + debugger.log.enabled: + type: toggle + label: Logging + highlight: 1 + options: + 1: Enabled + 0: Disabled + validate: + type: bool + + debugger.shutdown.close_conection: + type: toggle + label: Shutdown Close Connection + highlight: 1 + options: + 1: Enabled + 0: Disabled + validate: + type: bool + + diff --git a/system/config/system.yaml b/system/config/system.yaml index bd18a408c..d4ab1eba5 100644 --- a/system/config/system.yaml +++ b/system/config/system.yaml @@ -46,6 +46,5 @@ debugger: max_depth: 10 # How many nested levels to display for objects or arrays log: enabled: true # Enable logging - timing: false # Enable timing logging shutdown: close_connection: true # Close the connection before calling onShutdown(). disable for debugging From 3f6901c03648d99375dabdd87550a956edf212a5 Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Wed, 10 Sep 2014 20:40:49 +0300 Subject: [PATCH 41/56] Fail gracefully when theme does not exist --- system/src/Grav/Common/Themes.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/system/src/Grav/Common/Themes.php b/system/src/Grav/Common/Themes.php index ca5854ecb..16e1f7923 100644 --- a/system/src/Grav/Common/Themes.php +++ b/system/src/Grav/Common/Themes.php @@ -132,7 +132,7 @@ public function load() /** @var ResourceLocator $locator */ $locator = $grav['locator']; - $file = $locator("theme://theme.php") ?: $locator("theme://{$name}.php"); + $file = $locator('theme://theme.php') ?: $locator("theme://{$name}.php"); if ($file) { // Local variables available in the file: $grav, $config, $name, $file @@ -145,6 +145,8 @@ public function load() $class = new $className($grav, $config, $name); } } + } elseif (!$locator('theme://')) { + exit("Theme '$name' does not exist, unable to display page."); } if (empty($class)) { From bf39adbda740588376198df9d3d2641cd53aabd8 Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Wed, 10 Sep 2014 14:49:11 -0600 Subject: [PATCH 42/56] Fixes and reformatting of blueprints --- system/blueprints/site.yaml | 108 +++++++++++++++++++++------------- system/blueprints/system.yaml | 86 +++++++++++++++------------ 2 files changed, 114 insertions(+), 80 deletions(-) diff --git a/system/blueprints/site.yaml b/system/blueprints/site.yaml index 614137f6f..33f9aa37b 100644 --- a/system/blueprints/site.yaml +++ b/system/blueprints/site.yaml @@ -1,44 +1,68 @@ title: Site -validation: strict - form: - fields: - title: - type: text - label: Site Title - placeholder: "Site wide title" - help: Default title for your site - - description: - type: textarea - label: Description - - summary.size: - type: text - label: Summary size - validate: - type: int - min: 0 - max: 65536 - - author.name: - type: text - label: Default author - - author.email: - type: text - label: Default email - - taxonomies: - type: text - label: Taxonomy types - validate: - type: commalist - - blog.route: - type: text - label: Blog URL - - routes: - type: array - label: Custom routes + fields: + + content: + type: section + title: Defaults + underline: true + + fields: + title: + type: text + label: Site Title + size: large + placeholder: "Site wide title" + help: Default title for your site + + description: + type: textarea + size: large + label: Description + + author.name: + type: text + size: large + label: Default Author + + author.email: + type: text + size: large + label: Default Email + + taxonomies: + type: text + size: large + label: Taxonomy Types + validate: + type: commalist + + blog: + type: section + title: Blog + underline: true + + fields: + blog.route: + type: text + size: large + label: Blog URL + + summary.size: + type: text + size: x-small + label: Summary Size + validate: + type: int + min: 0 + max: 65536 + + routes: + type: section + title: Routes + underline: true + + fields: + routes: + type: array + label: Custom diff --git a/system/blueprints/system.yaml b/system/blueprints/system.yaml index e4fd63c16..c057040e9 100644 --- a/system/blueprints/system.yaml +++ b/system/blueprints/system.yaml @@ -29,8 +29,8 @@ form: label: Markdown Extra highlight: 1 options: - 1: Enabled - 0: Disabled + 1: Yes + 0: No validate: type: bool @@ -45,6 +45,7 @@ form: pages.dateformat.short: type: select + size: medium label: Short Date Format help: "Set the short date format" default: 'jS M Y' @@ -57,6 +58,7 @@ form: pages.dateformat.long: type: select + size: medium label: Long Date Format help: "Set the long date format" options: @@ -68,6 +70,7 @@ form: pages.order.by: type: select + size: medium label: Default Ordering options: default: Default - based on folder name @@ -78,13 +81,15 @@ form: pages.order.dir: type: toggle label: Default Order Direction - default: asc + highlight: asc + default: desc options: asc: Ascending desc: Descending pages.list.count: type: text + size: x-small label: Default Item Count help: "Default max pages count" validate: @@ -104,8 +109,8 @@ form: label: Page events highlight: 1 options: - 1: Enabled - 0: Disabled + 1: Yes + 0: No validate: type: bool @@ -114,8 +119,8 @@ form: label: Twig events highlight: 1 options: - 1: Enabled - 0: Disabled + 1: Yes + 0: No validate: type: bool @@ -130,13 +135,14 @@ form: label: Caching highlight: 1 options: - 1: Enabled - 0: Disabled + 1: Yes + 0: No validate: type: bool cache.check.method: type: select + size: small label: Cache Check Method options: file: File @@ -145,6 +151,7 @@ form: cache.driver: type: select + size: small label: Cache driver options: auto: Auto detect @@ -156,6 +163,7 @@ form: cache.prefix: type: text + size: x-small label: Cache Prefix placeholder: "Derived from base URL (override by entering random string)" @@ -170,8 +178,8 @@ form: label: Twig caching highlight: 1 options: - 1: Enabled - 0: Disabled + 1: Yes + 0: No validate: type: bool @@ -180,8 +188,8 @@ form: label: Twig debug highlight: 1 options: - 1: Enabled - 0: Disabled + 1: Yes + 0: No validate: type: bool @@ -190,8 +198,8 @@ form: label: Detect changes highlight: 1 options: - 1: Enabled - 0: Disabled + 1: Yes + 0: No validate: type: bool @@ -200,8 +208,8 @@ form: label: Autoescape variables highlight: 1 options: - 1: Enabled - 0: Disabled + 1: Yes + 0: No validate: type: bool @@ -214,42 +222,42 @@ form: assets.css_pipeline: type: toggle label: CSS Pipeline - highlight: 0 + highlight: 1 options: - 1: Enabled - 0: Disabled + 1: Yes + 0: No assets.css_minify: type: toggle label: CSS Minify highlight: 1 options: - 1: Enabled - 0: Disabled + 1: Yes + 0: No assets.css_rewrite: type: toggle label: CSS Rewrite highlight: 1 options: - 1: Enabled - 0: Disabled + 1: Yes + 0: No assets.js_pipeline: type: toggle label: JavaScript Pipeline - highlight: 0 + highlight: 01 options: - 1: Enabled - 0: Disabled + 1: Yes + 0: No assets.js_minify: type: toggle label: JavaScript Minify highlight: 1 options: - 1: Enabled - 0: Disabled + 1: Yes + 0: No debugger: type: section @@ -262,13 +270,14 @@ form: label: Debugger highlight: 1 options: - 1: Enabled - 0: Disabled + 1: Yes + 0: No validate: type: bool debugger.mode: type: select + size: small label: Mode options: detect: Auto-Detect @@ -278,15 +287,16 @@ form: debugger.strict: type: toggle label: Strict - highlight: 0 + highlight: 1 options: - 1: Enabled - 0: Disabled + 1: Yes + 0: No validate: type: bool debugger.max_depth: type: select + size: small label: Detail Level placeholder: "How many nested levels to display for objects or arrays" options: @@ -308,8 +318,8 @@ form: label: Logging highlight: 1 options: - 1: Enabled - 0: Disabled + 1: Yes + 0: No validate: type: bool @@ -318,8 +328,8 @@ form: label: Shutdown Close Connection highlight: 1 options: - 1: Enabled - 0: Disabled + 1: Yes + 0: No validate: type: bool From 059189ec775e3f56fc67af650e09b4917b27bd3c Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Thu, 11 Sep 2014 15:32:18 -0600 Subject: [PATCH 43/56] Fancy selectize support --- system/blueprints/site.yaml | 6 ++++-- system/blueprints/system.yaml | 9 +++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/system/blueprints/site.yaml b/system/blueprints/site.yaml index 33f9aa37b..1410e1a1f 100644 --- a/system/blueprints/site.yaml +++ b/system/blueprints/site.yaml @@ -32,10 +32,12 @@ form: taxonomies: type: text - size: large label: Taxonomy Types + classes: fancy validate: - type: commalist + type: commalist + + blog: type: section diff --git a/system/blueprints/system.yaml b/system/blueprints/system.yaml index c057040e9..277a6b5ff 100644 --- a/system/blueprints/system.yaml +++ b/system/blueprints/system.yaml @@ -12,6 +12,7 @@ form: home.alias: type: pages size: medium + classes: fancy label: Home Page show_all: false show_modular: false @@ -20,6 +21,7 @@ form: pages.theme: type: themeselect + classes: fancy size: medium label: Default Theme help: "Set the theme (defaults to 'default')" @@ -46,6 +48,7 @@ form: pages.dateformat.short: type: select size: medium + classes: fancy label: Short Date Format help: "Set the short date format" default: 'jS M Y' @@ -59,6 +62,7 @@ form: pages.dateformat.long: type: select size: medium + classes: fancy label: Long Date Format help: "Set the long date format" options: @@ -71,6 +75,7 @@ form: pages.order.by: type: select size: medium + classes: fancy label: Default Ordering options: default: Default - based on folder name @@ -143,6 +148,7 @@ form: cache.check.method: type: select size: small + classes: fancy label: Cache Check Method options: file: File @@ -152,6 +158,7 @@ form: cache.driver: type: select size: small + classes: fancy label: Cache driver options: auto: Auto detect @@ -278,6 +285,7 @@ form: debugger.mode: type: select size: small + classes: fancy label: Mode options: detect: Auto-Detect @@ -297,6 +305,7 @@ form: debugger.max_depth: type: select size: small + classes: fancy label: Detail Level placeholder: "How many nested levels to display for objects or arrays" options: From 978dc571bbd8a1b13c2530c03c7ce38857431eb7 Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Thu, 11 Sep 2014 15:32:44 -0600 Subject: [PATCH 44/56] Fix for menu not highlighting properly --- system/src/Grav/Common/Page/Page.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/system/src/Grav/Common/Page/Page.php b/system/src/Grav/Common/Page/Page.php index b1c97f80c..9c75dfa8d 100644 --- a/system/src/Grav/Common/Page/Page.php +++ b/system/src/Grav/Common/Page/Page.php @@ -204,7 +204,7 @@ public function header($var = null) } if (isset($this->header->markdown_extra)) { $this->markdown_extra = (bool)$this->header->markdown_extra; - } + } if (isset($this->header->taxonomy)) { foreach ($this->header->taxonomy as $taxonomy => $taxitems) { $this->taxonomy[$taxonomy] = (array)$taxitems; @@ -218,7 +218,7 @@ public function header($var = null) $this->process[$process] = $status; } } - + } return $this->header; @@ -1233,7 +1233,8 @@ public function active() public function activeChild() { $uri = self::$grav['uri']; - if (!$this->home() && (strpos($uri->url(), $this->url()) !== false)) { + + if (!$this->home() && (strpos($uri->url(), $this->url()) === 0)) { return true; } return false; From 0276ce94df72e362a90929e79a324fdab7246417 Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Fri, 12 Sep 2014 17:06:35 -0600 Subject: [PATCH 45/56] wrapper for existing modular() method --- system/src/Grav/Common/Page/Page.php | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/system/src/Grav/Common/Page/Page.php b/system/src/Grav/Common/Page/Page.php index 9c75dfa8d..50d93abc7 100644 --- a/system/src/Grav/Common/Page/Page.php +++ b/system/src/Grav/Common/Page/Page.php @@ -187,9 +187,6 @@ public function header($var = null) if (isset($this->header->visible)) { $this->visible = $this->header->visible; } - if (isset($this->header->modular)) { - $this->modular = $this->header->modular; - } if (isset($this->header->order_dir)) { $this->order_dir = trim($this->header->order_dir); } @@ -999,10 +996,7 @@ public function taxonomy($var = null) */ public function modular($var = null) { - if ($var !== null) { - $this->modular = (bool) $var; - } - return $this->modular; + return $this->modularTwig($var); } /** From 6d0539c793b6cae4b58e1d868cb6ee19023eba56 Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Sun, 14 Sep 2014 16:18:19 -0600 Subject: [PATCH 46/56] #55 Skip Minify by default on Windows systems. Can activate with assets.css_minify_windows = true if you have updated your ThreadStackSize in httpd.conf --- system/blueprints/system.yaml | 8 ++++++++ system/config/system.yaml | 1 + system/src/Grav/Common/Assets.php | 14 +++++++++++++- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/system/blueprints/system.yaml b/system/blueprints/system.yaml index 277a6b5ff..0a39fb487 100644 --- a/system/blueprints/system.yaml +++ b/system/blueprints/system.yaml @@ -242,6 +242,14 @@ form: 1: Yes 0: No + assets.css_minify_windows: + type: toggle + label: CSS Minify Windows Override + highlight: 1 + options: + 1: Yes + 0: No + assets.css_rewrite: type: toggle label: CSS Rewrite diff --git a/system/config/system.yaml b/system/config/system.yaml index d4ab1eba5..b0b341a84 100644 --- a/system/config/system.yaml +++ b/system/config/system.yaml @@ -35,6 +35,7 @@ twig: assets: # Configuration for Assets Manager (JS, CSS) css_pipeline: false # The CSS pipeline is the unification of multiple CSS resources into one file css_minify: true # Minify the CSS during pipelining + css_minify_windows: false # Minify Override for Windows platforms. False by default due to ThreadStackSize css_rewrite: true # Rewrite any CSS relative URLs during pipelining js_pipeline: false # The JS pipeline is the unification of multiple JS resources into one file js_minify: true # Minify the JS during pipelining diff --git a/system/src/Grav/Common/Assets.php b/system/src/Grav/Common/Assets.php index 5c3b6cd45..2220cf389 100644 --- a/system/src/Grav/Common/Assets.php +++ b/system/src/Grav/Common/Assets.php @@ -133,6 +133,9 @@ public function config(array $config) if(isset($config['css_minify'])) $this->css_minify = $config['css_minify']; + if(isset($config['css_minify_windows'])) + $this->css_minify_windows = $config['css_minify_windows']; + if(isset($config['css_rewrite'])) $this->css_rewrite = $config['css_rewrite']; @@ -432,10 +435,19 @@ protected function pipeline($css = true) if(file_exists($absolute_path)) return $relative_path . $key; + $css_minify = $this->css_minify; + + // If this is a Windows server, and minify_windows is false (default value) skip the + // minification process because it will cause Apache to die/crash due to insufficient + // ThreadStackSize in httpd.conf - See: https://bugs.php.net/bug.php?id=47689 + if (strtoupper(substr(php_uname('s'), 0, 3)) === 'WIN' && !$this->css_minify_windows) { + $css_minify = false; + } + // Concatenate files if ($css) { $buffer = $this->gatherLinks($this->css, CSS_ASSET); - if ($this->css_minify) { + if ($css_minify) { $min = new \CSSmin(); $buffer = $min->run($buffer); } From d509ed0a34e6376c50e9f64dc44eb20de22750ab Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Sun, 14 Sep 2014 16:20:54 -0600 Subject: [PATCH 47/56] Code tidy #55 --- system/src/Grav/Common/Assets.php | 1 + 1 file changed, 1 insertion(+) diff --git a/system/src/Grav/Common/Assets.php b/system/src/Grav/Common/Assets.php index 2220cf389..bba676c19 100644 --- a/system/src/Grav/Common/Assets.php +++ b/system/src/Grav/Common/Assets.php @@ -71,6 +71,7 @@ class Assets // Default values for pipeline settings protected $css_minify = true; + protected $css_minify_windows = false; protected $css_rewrite = true; protected $js_minify = true; From 16ad95c2055b08c123a3a9c2c485f1bbe5b60ae2 Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Mon, 15 Sep 2014 13:25:35 -0600 Subject: [PATCH 48/56] Updated with more flexible metadata support in pages and site.yaml --- system/blueprints/site.yaml | 16 +++---- system/config/site.yaml | 19 ++++---- system/src/Grav/Common/Data/Metadata.php | 22 +++++++++ system/src/Grav/Common/Page/Page.php | 58 ++++++++++++++++++++++++ system/src/Grav/Common/Twig.php | 4 +- 5 files changed, 99 insertions(+), 20 deletions(-) create mode 100644 system/src/Grav/Common/Data/Metadata.php diff --git a/system/blueprints/site.yaml b/system/blueprints/site.yaml index 1410e1a1f..2358b08bf 100644 --- a/system/blueprints/site.yaml +++ b/system/blueprints/site.yaml @@ -5,7 +5,6 @@ form: content: type: section title: Defaults - underline: true fields: title: @@ -15,11 +14,6 @@ form: placeholder: "Site wide title" help: Default title for your site - description: - type: textarea - size: large - label: Description - author.name: type: text size: large @@ -37,12 +31,15 @@ form: validate: type: commalist - + metadata: + type: array + label: Metadata + placeholder_key: Name + placeholder_value: Content blog: type: section title: Blog - underline: true fields: blog.route: @@ -62,9 +59,10 @@ form: routes: type: section title: Routes - underline: true fields: routes: type: array label: Custom + placeholder_key: /your/alias + placeholder_value: /your/route diff --git a/system/config/site.yaml b/system/config/site.yaml index 08b16c9b1..81822cedd 100644 --- a/system/config/site.yaml +++ b/system/config/site.yaml @@ -1,13 +1,14 @@ -title: Grav # Name of the site +title: Grav # Name of the site author: - name: John Appleseed # Default author name - email: 'john@email.com' # Default author email -taxonomies: [category,tag] # Arbitrary list of taxonomy types + name: John Appleseed # Default author name + email: 'john@email.com' # Default author email +taxonomies: [category,tag] # Arbitrary list of taxonomy types blog: - route: '/blog' # Route to blog -description: 'Grav Site Description' # Site description + route: '/blog' # Route to blog +metadata: + description: 'Grav Site Description' # Site description summary: - size: 300 # Maximum length of summary (characters) + size: 300 # Maximum length of summary (characters) routes: - /something/else: '/blog/sample-3' # Alias for /blog/sample-3 - /another/one/here: '/blog/sample-3' # Another alias for /blog/sample-3 + /something/else: '/blog/sample-3' # Alias for /blog/sample-3 + /another/one/here: '/blog/sample-3' # Another alias for /blog/sample-3 diff --git a/system/src/Grav/Common/Data/Metadata.php b/system/src/Grav/Common/Data/Metadata.php new file mode 100644 index 000000000..fd044d8e2 --- /dev/null +++ b/system/src/Grav/Common/Data/Metadata.php @@ -0,0 +1,22 @@ +name = $name; + } + if ($content) { + $this->content = $content; + } + + } +} diff --git a/system/src/Grav/Common/Page/Page.php b/system/src/Grav/Common/Page/Page.php index 50d93abc7..d541f7f45 100644 --- a/system/src/Grav/Common/Page/Page.php +++ b/system/src/Grav/Common/Page/Page.php @@ -58,6 +58,7 @@ class Page protected $raw_content; protected $pagination; protected $media; + protected $metadata; protected $title; protected $max_count; protected $menu; @@ -109,6 +110,7 @@ public function init($file) $this->modified($file->getMTime()); $this->id($this->modified().md5($this->filePath())); $this->header(); + $this->metadata(); $this->slug(); $this->visible(); $this->modularTwig($this->slug[0] == '_'); @@ -701,6 +703,60 @@ public function process($var = null) return $this->process; } + /** + * Function to merge page metadata tags and build an array of Metadata objects + * that can then be rendered in the page. + */ + public function metadata() + { + // if not metadata yet, process it. + if (null === $this->metadata) { + + $header_tag_http_equivs = ['content-type', 'default-style', 'refresh']; + $this->metadata = array(); + $page_header = $this->header; + + + // Set the Generator tag + $this->metadata['generator'] = new Data\Metadata('generator', 'Grav ' . GRAV_VERSION); + + // Merge any site.metadata settings in with page metadata + $defaults = (array) self::$grav['config']->get('site.metadata'); + if (isset($page_header->metadata)) { + $page_header->metadata = array_merge($defaults, $page_header->metadata); + } else { + $page_header->metadata = $defaults; + } + + // Build an array of meta objects.. + foreach((array)$page_header->metadata as $key => $value) { + + // If this is a property type metadata: "og", "twitter", "facebook" etc + if (is_array($value)) { + foreach ($value as $property => $prop_value) { + $meta = new Data\Metadata(); + $prop_key = $key.":".$property; + $meta->property = $prop_key; + $meta->content = $prop_value; + $this->metadata[$prop_key] = $meta; + } + // If it this is a standard meta data type + } else { + $meta = new Data\Metadata(); + if (in_array($key, $header_tag_http_equivs)) { + $meta->http_equiv = $key; + } else { + $meta->name = $key; + } + $meta->content = $value; + $this->metadata[$key] = $meta; + } + } + } + + return $this->metadata; + } + /** * Gets and Sets the slug for the Page. The slug is used in the URL routing. If not set it uses * the parent folder from the path @@ -1613,4 +1669,6 @@ protected function doRelocation($reorder) $this->_action = null; $this->_original = null; } + + } diff --git a/system/src/Grav/Common/Twig.php b/system/src/Grav/Common/Twig.php index 2e8d57c7e..aae6f2b55 100644 --- a/system/src/Grav/Common/Twig.php +++ b/system/src/Grav/Common/Twig.php @@ -104,7 +104,6 @@ public function init() // Set some standard variables for twig $this->twig_vars = array( 'grav' => $this->grav, - 'grav_version' => GRAV_VERSION, 'config' => $config, 'uri' => $this->grav['uri'], 'base_dir' => rtrim(ROOT_DIR, '/'), @@ -197,10 +196,11 @@ public function processSite($format = null) { // set the page now its been processed $this->grav->fireEvent('onTwigSiteVariables'); - $twig_vars = $this->twig_vars; $pages = $this->grav['pages']; $page = $this->grav['page']; + $twig_vars = $this->twig_vars; + $twig_vars['pages'] = $pages->root(); $twig_vars['page'] = $page; $twig_vars['header'] = $page->header(); From e8e90892aa1cac4a7011e9311c67509241c25330 Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Mon, 15 Sep 2014 14:08:12 -0600 Subject: [PATCH 49/56] minor change of default site description --- system/config/site.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/config/site.yaml b/system/config/site.yaml index 81822cedd..6aae314ca 100644 --- a/system/config/site.yaml +++ b/system/config/site.yaml @@ -6,7 +6,7 @@ taxonomies: [category,tag] # Arbitrary list of taxonomy types blog: route: '/blog' # Route to blog metadata: - description: 'Grav Site Description' # Site description + description: 'My Grav Site' # Site description summary: size: 300 # Maximum length of summary (characters) routes: From 7c160b9b089228e3a917b25c4337972d0bb9379a Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Mon, 15 Sep 2014 14:15:29 -0600 Subject: [PATCH 50/56] updated metadata to be new format --- user/config/site.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/user/config/site.yaml b/user/config/site.yaml index dc52b4484..c45818de4 100644 --- a/user/config/site.yaml +++ b/user/config/site.yaml @@ -2,5 +2,6 @@ title: Grav author: name: Joe Bloggs email: 'joe@test.com' -description: 'Grav is an easy to use, yet powerful, open source flat-file CMS' +metadata: + description: 'Grav is an easy to use, yet powerful, open source flat-file CMS' From 72023fcd4aa5b39fde4c79459916a8ae4e1d7456 Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Mon, 15 Sep 2014 16:36:16 -0600 Subject: [PATCH 51/56] added a comment to class --- system/src/Grav/Common/Data/Metadata.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/system/src/Grav/Common/Data/Metadata.php b/system/src/Grav/Common/Data/Metadata.php index fd044d8e2..906c900c6 100644 --- a/system/src/Grav/Common/Data/Metadata.php +++ b/system/src/Grav/Common/Data/Metadata.php @@ -1,6 +1,12 @@ Date: Mon, 15 Sep 2014 16:47:09 -0600 Subject: [PATCH 52/56] changed metadata var name --- system/src/Grav/Common/Page/Page.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/system/src/Grav/Common/Page/Page.php b/system/src/Grav/Common/Page/Page.php index d541f7f45..77b61760d 100644 --- a/system/src/Grav/Common/Page/Page.php +++ b/system/src/Grav/Common/Page/Page.php @@ -58,7 +58,7 @@ class Page protected $raw_content; protected $pagination; protected $media; - protected $metadata; + protected $metadata_entries; protected $title; protected $max_count; protected $menu; @@ -713,12 +713,12 @@ public function metadata() if (null === $this->metadata) { $header_tag_http_equivs = ['content-type', 'default-style', 'refresh']; - $this->metadata = array(); + $this->metadata_entries = array(); $page_header = $this->header; // Set the Generator tag - $this->metadata['generator'] = new Data\Metadata('generator', 'Grav ' . GRAV_VERSION); + $this->metadata_entries['generator'] = new Data\Metadata('generator', 'Grav ' . GRAV_VERSION); // Merge any site.metadata settings in with page metadata $defaults = (array) self::$grav['config']->get('site.metadata'); @@ -738,7 +738,7 @@ public function metadata() $prop_key = $key.":".$property; $meta->property = $prop_key; $meta->content = $prop_value; - $this->metadata[$prop_key] = $meta; + $this->metadata_entries[$prop_key] = $meta; } // If it this is a standard meta data type } else { @@ -749,12 +749,12 @@ public function metadata() $meta->name = $key; } $meta->content = $value; - $this->metadata[$key] = $meta; + $this->metadata_entries[$key] = $meta; } } } - return $this->metadata; + return $this->metadata_entries; } /** From 6a3f6b9be2359d3638d1d1bae74a9e4859cea5a4 Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Mon, 15 Sep 2014 16:50:39 -0600 Subject: [PATCH 53/56] missed one --- system/src/Grav/Common/Page/Page.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/src/Grav/Common/Page/Page.php b/system/src/Grav/Common/Page/Page.php index 77b61760d..ead267c89 100644 --- a/system/src/Grav/Common/Page/Page.php +++ b/system/src/Grav/Common/Page/Page.php @@ -710,7 +710,7 @@ public function process($var = null) public function metadata() { // if not metadata yet, process it. - if (null === $this->metadata) { + if (null === $this->metadata_entries) { $header_tag_http_equivs = ['content-type', 'default-style', 'refresh']; $this->metadata_entries = array(); From 5b2aa6ead90cdc289e5c9dbcaceafd272f7e914e Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Mon, 15 Sep 2014 17:25:10 -0600 Subject: [PATCH 54/56] reverted naming --- system/src/Grav/Common/Page/Page.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/system/src/Grav/Common/Page/Page.php b/system/src/Grav/Common/Page/Page.php index ead267c89..d541f7f45 100644 --- a/system/src/Grav/Common/Page/Page.php +++ b/system/src/Grav/Common/Page/Page.php @@ -58,7 +58,7 @@ class Page protected $raw_content; protected $pagination; protected $media; - protected $metadata_entries; + protected $metadata; protected $title; protected $max_count; protected $menu; @@ -710,15 +710,15 @@ public function process($var = null) public function metadata() { // if not metadata yet, process it. - if (null === $this->metadata_entries) { + if (null === $this->metadata) { $header_tag_http_equivs = ['content-type', 'default-style', 'refresh']; - $this->metadata_entries = array(); + $this->metadata = array(); $page_header = $this->header; // Set the Generator tag - $this->metadata_entries['generator'] = new Data\Metadata('generator', 'Grav ' . GRAV_VERSION); + $this->metadata['generator'] = new Data\Metadata('generator', 'Grav ' . GRAV_VERSION); // Merge any site.metadata settings in with page metadata $defaults = (array) self::$grav['config']->get('site.metadata'); @@ -738,7 +738,7 @@ public function metadata() $prop_key = $key.":".$property; $meta->property = $prop_key; $meta->content = $prop_value; - $this->metadata_entries[$prop_key] = $meta; + $this->metadata[$prop_key] = $meta; } // If it this is a standard meta data type } else { @@ -749,12 +749,12 @@ public function metadata() $meta->name = $key; } $meta->content = $value; - $this->metadata_entries[$key] = $meta; + $this->metadata[$key] = $meta; } } } - return $this->metadata_entries; + return $this->metadata; } /** From c50cba64bb36f2cfdd73b9e13be9f21a8115f3dd Mon Sep 17 00:00:00 2001 From: Andy Miller Date: Mon, 15 Sep 2014 17:46:55 -0600 Subject: [PATCH 55/56] Went to simplified array rather than metadata object --- system/src/Grav/Common/Data/Metadata.php | 28 ------------------------ system/src/Grav/Common/Page/Page.php | 14 ++++-------- 2 files changed, 4 insertions(+), 38 deletions(-) delete mode 100644 system/src/Grav/Common/Data/Metadata.php diff --git a/system/src/Grav/Common/Data/Metadata.php b/system/src/Grav/Common/Data/Metadata.php deleted file mode 100644 index 906c900c6..000000000 --- a/system/src/Grav/Common/Data/Metadata.php +++ /dev/null @@ -1,28 +0,0 @@ -name = $name; - } - if ($content) { - $this->content = $content; - } - - } -} diff --git a/system/src/Grav/Common/Page/Page.php b/system/src/Grav/Common/Page/Page.php index d541f7f45..e36d7a72b 100644 --- a/system/src/Grav/Common/Page/Page.php +++ b/system/src/Grav/Common/Page/Page.php @@ -718,7 +718,7 @@ public function metadata() // Set the Generator tag - $this->metadata['generator'] = new Data\Metadata('generator', 'Grav ' . GRAV_VERSION); + $this->metadata['generator'] = array('name'=>'generator', 'content'=>'Grav ' . GRAV_VERSION); // Merge any site.metadata settings in with page metadata $defaults = (array) self::$grav['config']->get('site.metadata'); @@ -734,22 +734,16 @@ public function metadata() // If this is a property type metadata: "og", "twitter", "facebook" etc if (is_array($value)) { foreach ($value as $property => $prop_value) { - $meta = new Data\Metadata(); $prop_key = $key.":".$property; - $meta->property = $prop_key; - $meta->content = $prop_value; - $this->metadata[$prop_key] = $meta; + $this->metadata[$prop_key] = array('property'=>$prop_key, 'content'=>$prop_value); } // If it this is a standard meta data type } else { - $meta = new Data\Metadata(); if (in_array($key, $header_tag_http_equivs)) { - $meta->http_equiv = $key; + $this->metadata[$key] = array('http_equiv'=>$key, 'content'=>$value); } else { - $meta->name = $key; + $this->metadata[$key] = array('name'=>$key, 'content'=>$value); } - $meta->content = $value; - $this->metadata[$key] = $meta; } } } From 2f3f4a11376a5ed3e28b7909c23b24c20aacc52e Mon Sep 17 00:00:00 2001 From: Djamil Legato Date: Mon, 15 Sep 2014 17:08:27 -0700 Subject: [PATCH 56/56] Preparing for release v0.9.2 --- VERSION | 2 +- system/defines.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index f374f6662..2003b639c 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.9.1 +0.9.2 diff --git a/system/defines.php b/system/defines.php index c5d554682..482a7fa0c 100644 --- a/system/defines.php +++ b/system/defines.php @@ -2,7 +2,7 @@ // Some standard defines define('GRAV', true); -define('GRAV_VERSION', '0.9.1'); +define('GRAV_VERSION', '0.9.2'); define('DS', '/'); // Directories and Paths