twig implementation
45
inc/3rdparty/Twig/Extensions/Autoloader.php
vendored
@ -1,45 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of Twig.
|
|
||||||
*
|
|
||||||
* (c) 2009 Fabien Potencier
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Autoloads Twig Extensions classes.
|
|
||||||
*
|
|
||||||
* @package twig
|
|
||||||
* @author Fabien Potencier <fabien.potencier@symfony-project.com>
|
|
||||||
*/
|
|
||||||
class Twig_Extensions_Autoloader
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Registers Twig_Extensions_Autoloader as an SPL autoloader.
|
|
||||||
*/
|
|
||||||
static public function register()
|
|
||||||
{
|
|
||||||
spl_autoload_register(array(new self, 'autoload'));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handles autoloading of classes.
|
|
||||||
*
|
|
||||||
* @param string $class A class name.
|
|
||||||
*
|
|
||||||
* @return boolean Returns true if the class has been loaded
|
|
||||||
*/
|
|
||||||
static public function autoload($class)
|
|
||||||
{
|
|
||||||
if (0 !== strpos($class, 'Twig_Extensions')) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (file_exists($file = dirname(__FILE__).'/../../'.str_replace('_', '/', $class).'.php')) {
|
|
||||||
require $file;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
34
inc/3rdparty/Twig/Extensions/Extension/Debug.php
vendored
@ -1,34 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of Twig.
|
|
||||||
*
|
|
||||||
* (c) 2010 Fabien Potencier
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
class Twig_Extensions_Extension_Debug extends Twig_Extension
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Returns the token parser instance to add to the existing list.
|
|
||||||
*
|
|
||||||
* @return array An array of Twig_TokenParser instances
|
|
||||||
*/
|
|
||||||
public function getTokenParsers()
|
|
||||||
{
|
|
||||||
return array(
|
|
||||||
new Twig_Extensions_TokenParser_Debug(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the name of the extension.
|
|
||||||
*
|
|
||||||
* @return string The extension name
|
|
||||||
*/
|
|
||||||
public function getName()
|
|
||||||
{
|
|
||||||
return 'debug';
|
|
||||||
}
|
|
||||||
}
|
|
44
inc/3rdparty/Twig/Extensions/Extension/I18n.php
vendored
@ -1,44 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of Twig.
|
|
||||||
*
|
|
||||||
* (c) 2010 Fabien Potencier
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
class Twig_Extensions_Extension_I18n extends Twig_Extension
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* 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_Extensions_TokenParser_Trans());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns a list of filters to add to the existing list.
|
|
||||||
*
|
|
||||||
* @return array An array of filters
|
|
||||||
*/
|
|
||||||
public function getFilters()
|
|
||||||
{
|
|
||||||
return array(
|
|
||||||
'trans' => new Twig_Filter_Function('gettext'),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the name of the extension.
|
|
||||||
*
|
|
||||||
* @return string The extension name
|
|
||||||
*/
|
|
||||||
public function getName()
|
|
||||||
{
|
|
||||||
return 'i18n';
|
|
||||||
}
|
|
||||||
}
|
|
66
inc/3rdparty/Twig/Extensions/Extension/Intl.php
vendored
@ -1,66 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of Twig.
|
|
||||||
*
|
|
||||||
* (c) 2010 Fabien Potencier
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
class Twig_Extensions_Extension_Intl extends Twig_Extension
|
|
||||||
{
|
|
||||||
public function __construct()
|
|
||||||
{
|
|
||||||
if (!class_exists('IntlDateFormatter')) {
|
|
||||||
throw new RuntimeException('The intl extension is needed to use intl-based filters.');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns a list of filters to add to the existing list.
|
|
||||||
*
|
|
||||||
* @return array An array of filters
|
|
||||||
*/
|
|
||||||
public function getFilters()
|
|
||||||
{
|
|
||||||
return array(
|
|
||||||
'localizeddate' => new Twig_Filter_Function('twig_localized_date_filter', array('needs_environment' => true)),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the name of the extension.
|
|
||||||
*
|
|
||||||
* @return string The extension name
|
|
||||||
*/
|
|
||||||
public function getName()
|
|
||||||
{
|
|
||||||
return 'intl';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function twig_localized_date_filter(Twig_Environment $env, $date, $dateFormat = 'medium', $timeFormat = 'medium', $locale = null, $timezone = null, $format = null)
|
|
||||||
{
|
|
||||||
$date = twig_date_converter($env, $date, $timezone);
|
|
||||||
|
|
||||||
$formatValues = array(
|
|
||||||
'none' => IntlDateFormatter::NONE,
|
|
||||||
'short' => IntlDateFormatter::SHORT,
|
|
||||||
'medium' => IntlDateFormatter::MEDIUM,
|
|
||||||
'long' => IntlDateFormatter::LONG,
|
|
||||||
'full' => IntlDateFormatter::FULL,
|
|
||||||
);
|
|
||||||
|
|
||||||
$formatter = IntlDateFormatter::create(
|
|
||||||
$locale !== null ? $locale : Locale::getDefault(),
|
|
||||||
$formatValues[$dateFormat],
|
|
||||||
$formatValues[$timeFormat],
|
|
||||||
$date->getTimezone()->getName(),
|
|
||||||
IntlDateFormatter::GREGORIAN,
|
|
||||||
$format
|
|
||||||
);
|
|
||||||
|
|
||||||
return $formatter->format($date->getTimestamp());
|
|
||||||
}
|
|
109
inc/3rdparty/Twig/Extensions/Extension/Text.php
vendored
@ -1,109 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This file is part of Twig.
|
|
||||||
*
|
|
||||||
* (c) 2009 Fabien Potencier
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*
|
|
||||||
* @author Henrik Bjornskov <hb@peytz.dk>
|
|
||||||
* @package Twig
|
|
||||||
* @subpackage Twig-extensions
|
|
||||||
*/
|
|
||||||
class Twig_Extensions_Extension_Text extends Twig_Extension
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Returns a list of filters.
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function getFilters()
|
|
||||||
{
|
|
||||||
$filters = array(
|
|
||||||
'truncate' => new Twig_Filter_Function('twig_truncate_filter', array('needs_environment' => true)),
|
|
||||||
'wordwrap' => new Twig_Filter_Function('twig_wordwrap_filter', array('needs_environment' => true)),
|
|
||||||
);
|
|
||||||
|
|
||||||
if (version_compare(Twig_Environment::VERSION, '1.5.0-DEV', '<')) {
|
|
||||||
$filters['nl2br'] = new Twig_Filter_Function('twig_nl2br_filter', array('pre_escape' => 'html', 'is_safe' => array('html')));
|
|
||||||
}
|
|
||||||
|
|
||||||
return $filters;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Name of this extension
|
|
||||||
*
|
|
||||||
* @return string
|
|
||||||
*/
|
|
||||||
public function getName()
|
|
||||||
{
|
|
||||||
return 'Text';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function twig_nl2br_filter($value, $sep = '<br />')
|
|
||||||
{
|
|
||||||
return str_replace("\n", $sep."\n", $value);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (function_exists('mb_get_info')) {
|
|
||||||
function twig_truncate_filter(Twig_Environment $env, $value, $length = 30, $preserve = false, $separator = '...')
|
|
||||||
{
|
|
||||||
if (mb_strlen($value, $env->getCharset()) > $length) {
|
|
||||||
if ($preserve) {
|
|
||||||
if (false !== ($breakpoint = mb_strpos($value, ' ', $length, $env->getCharset()))) {
|
|
||||||
$length = $breakpoint;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return rtrim(mb_substr($value, 0, $length, $env->getCharset())) . $separator;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
|
|
||||||
function twig_wordwrap_filter(Twig_Environment $env, $value, $length = 80, $separator = "\n", $preserve = false)
|
|
||||||
{
|
|
||||||
$sentences = array();
|
|
||||||
|
|
||||||
$previous = mb_regex_encoding();
|
|
||||||
mb_regex_encoding($env->getCharset());
|
|
||||||
|
|
||||||
$pieces = mb_split($separator, $value);
|
|
||||||
mb_regex_encoding($previous);
|
|
||||||
|
|
||||||
foreach ($pieces as $piece) {
|
|
||||||
while(!$preserve && mb_strlen($piece, $env->getCharset()) > $length) {
|
|
||||||
$sentences[] = mb_substr($piece, 0, $length, $env->getCharset());
|
|
||||||
$piece = mb_substr($piece, $length, 2048, $env->getCharset());
|
|
||||||
}
|
|
||||||
|
|
||||||
$sentences[] = $piece;
|
|
||||||
}
|
|
||||||
|
|
||||||
return implode($separator, $sentences);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
function twig_truncate_filter(Twig_Environment $env, $value, $length = 30, $preserve = false, $separator = '...')
|
|
||||||
{
|
|
||||||
if (strlen($value) > $length) {
|
|
||||||
if ($preserve) {
|
|
||||||
if (false !== ($breakpoint = strpos($value, ' ', $length))) {
|
|
||||||
$length = $breakpoint;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return rtrim(substr($value, 0, $length)) . $separator;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
|
|
||||||
function twig_wordwrap_filter(Twig_Environment $env, $value, $length = 80, $separator = "\n", $preserve = false)
|
|
||||||
{
|
|
||||||
return wordwrap($value, $length, $separator, !$preserve);
|
|
||||||
}
|
|
||||||
}
|
|
30
inc/3rdparty/Twig/Extensions/Grammar.php
vendored
@ -1,30 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of Twig.
|
|
||||||
*
|
|
||||||
* (c) 2010 Fabien Potencier
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
abstract class Twig_Extensions_Grammar implements Twig_Extensions_GrammarInterface
|
|
||||||
{
|
|
||||||
protected $name;
|
|
||||||
protected $parser;
|
|
||||||
|
|
||||||
public function __construct($name)
|
|
||||||
{
|
|
||||||
$this->name = $name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function setParser(Twig_ParserInterface $parser)
|
|
||||||
{
|
|
||||||
$this->parser = $parser;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getName()
|
|
||||||
{
|
|
||||||
return $this->name;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,22 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of Twig.
|
|
||||||
*
|
|
||||||
* (c) 2010 Fabien Potencier
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
class Twig_Extensions_Grammar_Arguments extends Twig_Extensions_Grammar
|
|
||||||
{
|
|
||||||
public function __toString()
|
|
||||||
{
|
|
||||||
return sprintf('<%s:arguments>', $this->name);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function parse(Twig_Token $token)
|
|
||||||
{
|
|
||||||
return $this->parser->getExpressionParser()->parseArguments();
|
|
||||||
}
|
|
||||||
}
|
|
22
inc/3rdparty/Twig/Extensions/Grammar/Array.php
vendored
@ -1,22 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of Twig.
|
|
||||||
*
|
|
||||||
* (c) 2010 Fabien Potencier
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
class Twig_Extensions_Grammar_Array extends Twig_Extensions_Grammar
|
|
||||||
{
|
|
||||||
public function __toString()
|
|
||||||
{
|
|
||||||
return sprintf('<%s:array>', $this->name);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function parse(Twig_Token $token)
|
|
||||||
{
|
|
||||||
return $this->parser->getExpressionParser()->parseArrayExpression();
|
|
||||||
}
|
|
||||||
}
|
|
39
inc/3rdparty/Twig/Extensions/Grammar/Body.php
vendored
@ -1,39 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of Twig.
|
|
||||||
*
|
|
||||||
* (c) 2010 Fabien Potencier
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
class Twig_Extensions_Grammar_Body extends Twig_Extensions_Grammar
|
|
||||||
{
|
|
||||||
protected $end;
|
|
||||||
|
|
||||||
public function __construct($name, $end = null)
|
|
||||||
{
|
|
||||||
parent::__construct($name);
|
|
||||||
|
|
||||||
$this->end = null === $end ? 'end'.$name : $end;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function __toString()
|
|
||||||
{
|
|
||||||
return sprintf('<%s:body>', $this->name);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function parse(Twig_Token $token)
|
|
||||||
{
|
|
||||||
$stream = $this->parser->getStream();
|
|
||||||
$stream->expect(Twig_Token::BLOCK_END_TYPE);
|
|
||||||
|
|
||||||
return $this->parser->subparse(array($this, 'decideBlockEnd'), true);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function decideBlockEnd(Twig_Token $token)
|
|
||||||
{
|
|
||||||
return $token->test($this->end);
|
|
||||||
}
|
|
||||||
}
|
|
24
inc/3rdparty/Twig/Extensions/Grammar/Boolean.php
vendored
@ -1,24 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of Twig.
|
|
||||||
*
|
|
||||||
* (c) 2010 Fabien Potencier
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
class Twig_Extensions_Grammar_Boolean extends Twig_Extensions_Grammar
|
|
||||||
{
|
|
||||||
public function __toString()
|
|
||||||
{
|
|
||||||
return sprintf('<%s:boolean>', $this->name);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function parse(Twig_Token $token)
|
|
||||||
{
|
|
||||||
$this->parser->getStream()->expect(Twig_Token::NAME_TYPE, array('true', 'false'));
|
|
||||||
|
|
||||||
return new Twig_Node_Expression_Constant('true' === $token->getValue() ? true : false, $token->getLine());
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,37 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of Twig.
|
|
||||||
*
|
|
||||||
* (c) 2010 Fabien Potencier
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
class Twig_Extensions_Grammar_Constant extends Twig_Extensions_Grammar
|
|
||||||
{
|
|
||||||
protected $type;
|
|
||||||
|
|
||||||
public function __construct($name, $type = null)
|
|
||||||
{
|
|
||||||
$this->name = $name;
|
|
||||||
$this->type = null === $type ? Twig_Token::NAME_TYPE : $type;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function __toString()
|
|
||||||
{
|
|
||||||
return $this->name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function parse(Twig_Token $token)
|
|
||||||
{
|
|
||||||
$this->parser->getStream()->expect($this->type, $this->name);
|
|
||||||
|
|
||||||
return $this->name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getType()
|
|
||||||
{
|
|
||||||
return $this->type;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,22 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of Twig.
|
|
||||||
*
|
|
||||||
* (c) 2010 Fabien Potencier
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
class Twig_Extensions_Grammar_Expression extends Twig_Extensions_Grammar
|
|
||||||
{
|
|
||||||
public function __toString()
|
|
||||||
{
|
|
||||||
return sprintf('<%s>', $this->name);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function parse(Twig_Token $token)
|
|
||||||
{
|
|
||||||
return $this->parser->getExpressionParser()->parseExpression();
|
|
||||||
}
|
|
||||||
}
|
|
22
inc/3rdparty/Twig/Extensions/Grammar/Hash.php
vendored
@ -1,22 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of Twig.
|
|
||||||
*
|
|
||||||
* (c) 2010 Fabien Potencier
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
class Twig_Extensions_Grammar_Hash extends Twig_Extensions_Grammar
|
|
||||||
{
|
|
||||||
public function __toString()
|
|
||||||
{
|
|
||||||
return sprintf('<%s:hash>', $this->name);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function parse(Twig_Token $token)
|
|
||||||
{
|
|
||||||
return $this->parser->getExpressionParser()->parseHashExpression();
|
|
||||||
}
|
|
||||||
}
|
|
24
inc/3rdparty/Twig/Extensions/Grammar/Number.php
vendored
@ -1,24 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of Twig.
|
|
||||||
*
|
|
||||||
* (c) 2010 Fabien Potencier
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
class Twig_Extensions_Grammar_Number extends Twig_Extensions_Grammar
|
|
||||||
{
|
|
||||||
public function __toString()
|
|
||||||
{
|
|
||||||
return sprintf('<%s:number>', $this->name);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function parse(Twig_Token $token)
|
|
||||||
{
|
|
||||||
$this->parser->getStream()->expect(Twig_Token::NUMBER_TYPE);
|
|
||||||
|
|
||||||
return new Twig_Node_Expression_Constant($token->getValue(), $token->getLine());
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,69 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of Twig.
|
|
||||||
*
|
|
||||||
* (c) 2010 Fabien Potencier
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
class Twig_Extensions_Grammar_Optional extends Twig_Extensions_Grammar
|
|
||||||
{
|
|
||||||
protected $grammar;
|
|
||||||
|
|
||||||
public function __construct()
|
|
||||||
{
|
|
||||||
$this->grammar = array();
|
|
||||||
foreach (func_get_args() as $grammar) {
|
|
||||||
$this->addGrammar($grammar);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function __toString()
|
|
||||||
{
|
|
||||||
$repr = array();
|
|
||||||
foreach ($this->grammar as $grammar) {
|
|
||||||
$repr[] = (string) $grammar;
|
|
||||||
}
|
|
||||||
|
|
||||||
return sprintf('[%s]', implode(' ', $repr));
|
|
||||||
}
|
|
||||||
|
|
||||||
public function addGrammar(Twig_Extensions_GrammarInterface $grammar)
|
|
||||||
{
|
|
||||||
$this->grammar[] = $grammar;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function parse(Twig_Token $token)
|
|
||||||
{
|
|
||||||
// test if we have the optional element before consuming it
|
|
||||||
if ($this->grammar[0] instanceof Twig_Extensions_Grammar_Constant) {
|
|
||||||
if (!$this->parser->getStream()->test($this->grammar[0]->getType(), $this->grammar[0]->getName())) {
|
|
||||||
return array();
|
|
||||||
}
|
|
||||||
} elseif ($this->grammar[0] instanceof Twig_Extensions_Grammar_Name) {
|
|
||||||
if (!$this->parser->getStream()->test(Twig_Token::NAME_TYPE)) {
|
|
||||||
return array();
|
|
||||||
}
|
|
||||||
} elseif ($this->parser->getStream()->test(Twig_Token::BLOCK_END_TYPE)) {
|
|
||||||
// if this is not a Constant or a Name, it must be the last element of the tag
|
|
||||||
|
|
||||||
return array();
|
|
||||||
}
|
|
||||||
|
|
||||||
$elements = array();
|
|
||||||
foreach ($this->grammar as $grammar) {
|
|
||||||
$grammar->setParser($this->parser);
|
|
||||||
|
|
||||||
$element = $grammar->parse($token);
|
|
||||||
if (is_array($element)) {
|
|
||||||
$elements = array_merge($elements, $element);
|
|
||||||
} else {
|
|
||||||
$elements[$grammar->getName()] = $element;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $elements;
|
|
||||||
}
|
|
||||||
}
|
|
24
inc/3rdparty/Twig/Extensions/Grammar/Switch.php
vendored
@ -1,24 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of Twig.
|
|
||||||
*
|
|
||||||
* (c) 2010 Fabien Potencier
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
class Twig_Extensions_Grammar_Switch extends Twig_Extensions_Grammar
|
|
||||||
{
|
|
||||||
public function __toString()
|
|
||||||
{
|
|
||||||
return sprintf('<%s:switch>', $this->name);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function parse(Twig_Token $token)
|
|
||||||
{
|
|
||||||
$this->parser->getStream()->expect(Twig_Token::NAME_TYPE, $this->name);
|
|
||||||
|
|
||||||
return new Twig_Node_Expression_Constant(true, $token->getLine());
|
|
||||||
}
|
|
||||||
}
|
|
56
inc/3rdparty/Twig/Extensions/Grammar/Tag.php
vendored
@ -1,56 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of Twig.
|
|
||||||
*
|
|
||||||
* (c) 2010 Fabien Potencier
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
class Twig_Extensions_Grammar_Tag extends Twig_Extensions_Grammar
|
|
||||||
{
|
|
||||||
protected $grammar;
|
|
||||||
|
|
||||||
public function __construct()
|
|
||||||
{
|
|
||||||
$this->grammar = array();
|
|
||||||
foreach (func_get_args() as $grammar) {
|
|
||||||
$this->addGrammar($grammar);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function __toString()
|
|
||||||
{
|
|
||||||
$repr = array();
|
|
||||||
foreach ($this->grammar as $grammar) {
|
|
||||||
$repr[] = (string) $grammar;
|
|
||||||
}
|
|
||||||
|
|
||||||
return implode(' ', $repr);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function addGrammar(Twig_Extensions_GrammarInterface $grammar)
|
|
||||||
{
|
|
||||||
$this->grammar[] = $grammar;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function parse(Twig_Token $token)
|
|
||||||
{
|
|
||||||
$elements = array();
|
|
||||||
foreach ($this->grammar as $grammar) {
|
|
||||||
$grammar->setParser($this->parser);
|
|
||||||
|
|
||||||
$element = $grammar->parse($token);
|
|
||||||
if (is_array($element)) {
|
|
||||||
$elements = array_merge($elements, $element);
|
|
||||||
} else {
|
|
||||||
$elements[$grammar->getName()] = $element;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
|
|
||||||
|
|
||||||
return $elements;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,18 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of Twig.
|
|
||||||
*
|
|
||||||
* (c) 2010 Fabien Potencier
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
interface Twig_Extensions_GrammarInterface
|
|
||||||
{
|
|
||||||
function setParser(Twig_ParserInterface $parser);
|
|
||||||
|
|
||||||
function parse(Twig_Token $token);
|
|
||||||
|
|
||||||
function getName();
|
|
||||||
}
|
|
69
inc/3rdparty/Twig/Extensions/Node/Debug.php
vendored
@ -1,69 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of Twig.
|
|
||||||
*
|
|
||||||
* (c) 2010 Fabien Potencier
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents a debug node.
|
|
||||||
*
|
|
||||||
* @package twig
|
|
||||||
* @subpackage Twig-extensions
|
|
||||||
* @author Fabien Potencier <fabien.potencier@symfony-project.com>
|
|
||||||
* @version SVN: $Id$
|
|
||||||
*/
|
|
||||||
class Twig_Extensions_Node_Debug extends Twig_Node
|
|
||||||
{
|
|
||||||
public function __construct(Twig_Node_Expression $expr = null, $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);
|
|
||||||
|
|
||||||
$compiler
|
|
||||||
->write("if (\$this->env->isDebug()) {\n")
|
|
||||||
->indent()
|
|
||||||
;
|
|
||||||
|
|
||||||
if (null === $this->getNode('expr')) {
|
|
||||||
// remove embedded templates (macros) from the context
|
|
||||||
$compiler
|
|
||||||
->write("\$vars = array();\n")
|
|
||||||
->write("foreach (\$context as \$key => \$value) {\n")
|
|
||||||
->indent()
|
|
||||||
->write("if (!\$value instanceof Twig_Template) {\n")
|
|
||||||
->indent()
|
|
||||||
->write("\$vars[\$key] = \$value;\n")
|
|
||||||
->outdent()
|
|
||||||
->write("}\n")
|
|
||||||
->outdent()
|
|
||||||
->write("}\n")
|
|
||||||
->write("var_dump(\$vars);\n")
|
|
||||||
;
|
|
||||||
} else {
|
|
||||||
$compiler
|
|
||||||
->write("var_dump(")
|
|
||||||
->subcompile($this->getNode('expr'))
|
|
||||||
->raw(");\n")
|
|
||||||
;
|
|
||||||
}
|
|
||||||
|
|
||||||
$compiler
|
|
||||||
->outdent()
|
|
||||||
->write("}\n")
|
|
||||||
;
|
|
||||||
}
|
|
||||||
}
|
|
133
inc/3rdparty/Twig/Extensions/Node/Trans.php
vendored
@ -1,133 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of Twig.
|
|
||||||
*
|
|
||||||
* (c) 2010 Fabien Potencier
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents a trans node.
|
|
||||||
*
|
|
||||||
* @package twig
|
|
||||||
* @author Fabien Potencier <fabien.potencier@symfony-project.com>
|
|
||||||
*/
|
|
||||||
class Twig_Extensions_Node_Trans extends Twig_Node
|
|
||||||
{
|
|
||||||
public function __construct(Twig_NodeInterface $body, Twig_NodeInterface $plural = null, Twig_Node_Expression $count = null, $lineno, $tag = null)
|
|
||||||
{
|
|
||||||
parent::__construct(array('count' => $count, 'body' => $body, 'plural' => $plural), array(), $lineno, $tag);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Compiles the node to PHP.
|
|
||||||
*
|
|
||||||
* @param Twig_Compiler A Twig_Compiler instance
|
|
||||||
*/
|
|
||||||
public function compile(Twig_Compiler $compiler)
|
|
||||||
{
|
|
||||||
$compiler->addDebugInfo($this);
|
|
||||||
|
|
||||||
list($msg, $vars) = $this->compileString($this->getNode('body'));
|
|
||||||
|
|
||||||
if (null !== $this->getNode('plural')) {
|
|
||||||
list($msg1, $vars1) = $this->compileString($this->getNode('plural'));
|
|
||||||
|
|
||||||
$vars = array_merge($vars, $vars1);
|
|
||||||
}
|
|
||||||
|
|
||||||
$function = null === $this->getNode('plural') ? 'gettext' : 'ngettext';
|
|
||||||
|
|
||||||
if ($vars) {
|
|
||||||
$compiler
|
|
||||||
->write('echo strtr('.$function.'(')
|
|
||||||
->subcompile($msg)
|
|
||||||
;
|
|
||||||
|
|
||||||
if (null !== $this->getNode('plural')) {
|
|
||||||
$compiler
|
|
||||||
->raw(', ')
|
|
||||||
->subcompile($msg1)
|
|
||||||
->raw(', abs(')
|
|
||||||
->subcompile($this->getNode('count'))
|
|
||||||
->raw(')')
|
|
||||||
;
|
|
||||||
}
|
|
||||||
|
|
||||||
$compiler->raw('), array(');
|
|
||||||
|
|
||||||
foreach ($vars as $var) {
|
|
||||||
if ('count' === $var->getAttribute('name')) {
|
|
||||||
$compiler
|
|
||||||
->string('%count%')
|
|
||||||
->raw(' => abs(')
|
|
||||||
->subcompile($this->getNode('count'))
|
|
||||||
->raw('), ')
|
|
||||||
;
|
|
||||||
} else {
|
|
||||||
$compiler
|
|
||||||
->string('%'.$var->getAttribute('name').'%')
|
|
||||||
->raw(' => ')
|
|
||||||
->subcompile($var)
|
|
||||||
->raw(', ')
|
|
||||||
;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$compiler->raw("));\n");
|
|
||||||
} else {
|
|
||||||
$compiler
|
|
||||||
->write('echo '.$function.'(')
|
|
||||||
->subcompile($msg)
|
|
||||||
;
|
|
||||||
|
|
||||||
if (null !== $this->getNode('plural')) {
|
|
||||||
$compiler
|
|
||||||
->raw(', ')
|
|
||||||
->subcompile($msg1)
|
|
||||||
->raw(', abs(')
|
|
||||||
->subcompile($this->getNode('count'))
|
|
||||||
->raw(')')
|
|
||||||
;
|
|
||||||
}
|
|
||||||
|
|
||||||
$compiler->raw(");\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function compileString(Twig_NodeInterface $body)
|
|
||||||
{
|
|
||||||
if ($body instanceof Twig_Node_Expression_Name || $body instanceof Twig_Node_Expression_Constant || $body instanceof Twig_Node_Expression_TempName) {
|
|
||||||
return array($body, array());
|
|
||||||
}
|
|
||||||
|
|
||||||
$vars = array();
|
|
||||||
if (count($body)) {
|
|
||||||
$msg = '';
|
|
||||||
|
|
||||||
foreach ($body as $node) {
|
|
||||||
if (get_class($node) === 'Twig_Node' && $node->getNode(0) instanceof Twig_Node_SetTemp) {
|
|
||||||
$node = $node->getNode(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($node instanceof Twig_Node_Print) {
|
|
||||||
$n = $node->getNode('expr');
|
|
||||||
while ($n instanceof Twig_Node_Expression_Filter) {
|
|
||||||
$n = $n->getNode('node');
|
|
||||||
}
|
|
||||||
$msg .= sprintf('%%%s%%', $n->getAttribute('name'));
|
|
||||||
$vars[] = new Twig_Node_Expression_Name($n->getAttribute('name'), $n->getLine());
|
|
||||||
} else {
|
|
||||||
$msg .= $node->getAttribute('data');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$msg = $body->getAttribute('data');
|
|
||||||
}
|
|
||||||
|
|
||||||
return array(new Twig_Node(array(new Twig_Node_Expression_Constant(trim($msg), $body->getLine()))), $vars);
|
|
||||||
}
|
|
||||||
}
|
|
132
inc/3rdparty/Twig/Extensions/SimpleTokenParser.php
vendored
@ -1,132 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of Twig.
|
|
||||||
*
|
|
||||||
* (c) 2010 Fabien Potencier
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
abstract class Twig_Extensions_SimpleTokenParser 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)
|
|
||||||
{
|
|
||||||
$grammar = $this->getGrammar();
|
|
||||||
if (!is_object($grammar)) {
|
|
||||||
$grammar = self::parseGrammar($grammar);
|
|
||||||
}
|
|
||||||
|
|
||||||
$grammar->setParser($this->parser);
|
|
||||||
$values = $grammar->parse($token);
|
|
||||||
|
|
||||||
return $this->getNode($values, $token->getLine());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the grammar as an object or as a string.
|
|
||||||
*
|
|
||||||
* @return string|Twig_Extensions_Grammar A Twig_Extensions_Grammar instance or a string
|
|
||||||
*/
|
|
||||||
abstract protected function getGrammar();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the nodes based on the parsed values.
|
|
||||||
*
|
|
||||||
* @param array $values An array of values
|
|
||||||
* @param integer $line The parser line
|
|
||||||
*/
|
|
||||||
abstract protected function getNode(array $values, $line);
|
|
||||||
|
|
||||||
protected function getAttribute($node, $attribute, $arguments = array(), $type = Twig_Node_Expression_GetAttr::TYPE_ANY, $line = -1)
|
|
||||||
{
|
|
||||||
return new Twig_Node_Expression_GetAttr(
|
|
||||||
$node instanceof Twig_NodeInterface ? $node : new Twig_Node_Expression_Name($node, $line),
|
|
||||||
$attribute instanceof Twig_NodeInterface ? $attribute : new Twig_Node_Expression_Constant($attribute, $line),
|
|
||||||
$arguments instanceof Twig_NodeInterface ? $arguments : new Twig_Node($arguments),
|
|
||||||
$type,
|
|
||||||
$line
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function call($node, $attribute, $arguments = array(), $line = -1)
|
|
||||||
{
|
|
||||||
return $this->getAttribute($node, $attribute, $arguments, Twig_Node_Expression_GetAttr::TYPE_METHOD, $line);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function markAsSafe(Twig_NodeInterface $node, $line = -1)
|
|
||||||
{
|
|
||||||
return new Twig_Node_Expression_Filter(
|
|
||||||
$node,
|
|
||||||
new Twig_Node_Expression_Constant('raw', $line),
|
|
||||||
new Twig_Node(),
|
|
||||||
$line
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function output(Twig_NodeInterface $node, $line = -1)
|
|
||||||
{
|
|
||||||
return new Twig_Node_Print($node, $line);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function getNodeValues(array $values)
|
|
||||||
{
|
|
||||||
$nodes = array();
|
|
||||||
foreach ($values as $value) {
|
|
||||||
if ($value instanceof Twig_NodeInterface) {
|
|
||||||
$nodes[] = $value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $nodes;
|
|
||||||
}
|
|
||||||
|
|
||||||
static public function parseGrammar($str, $main = true)
|
|
||||||
{
|
|
||||||
static $cursor;
|
|
||||||
|
|
||||||
if (true === $main) {
|
|
||||||
$cursor = 0;
|
|
||||||
$grammar = new Twig_Extensions_Grammar_Tag();
|
|
||||||
} else {
|
|
||||||
$grammar = new Twig_Extensions_Grammar_Optional();
|
|
||||||
}
|
|
||||||
|
|
||||||
while ($cursor < strlen($str)) {
|
|
||||||
if (preg_match('/\s+/A', $str, $match, null, $cursor)) {
|
|
||||||
$cursor += strlen($match[0]);
|
|
||||||
} elseif (preg_match('/<(\w+)(?:\:(\w+))?>/A', $str, $match, null, $cursor)) {
|
|
||||||
$class = sprintf('Twig_Extensions_Grammar_%s', ucfirst(isset($match[2]) ? $match[2] : 'Expression'));
|
|
||||||
if (!class_exists($class)) {
|
|
||||||
throw new Twig_Error_Runtime(sprintf('Unable to understand "%s" in grammar (%s class does not exist)', $match[0], $class));
|
|
||||||
}
|
|
||||||
$grammar->addGrammar(new $class($match[1]));
|
|
||||||
$cursor += strlen($match[0]);
|
|
||||||
} elseif (preg_match('/\w+/A', $str, $match, null, $cursor)) {
|
|
||||||
$grammar->addGrammar(new Twig_Extensions_Grammar_Constant($match[0]));
|
|
||||||
$cursor += strlen($match[0]);
|
|
||||||
} elseif (preg_match('/,/A', $str, $match, null, $cursor)) {
|
|
||||||
$grammar->addGrammar(new Twig_Extensions_Grammar_Constant($match[0], Twig_Token::PUNCTUATION_TYPE));
|
|
||||||
$cursor += strlen($match[0]);
|
|
||||||
} elseif (preg_match('/\[/A', $str, $match, null, $cursor)) {
|
|
||||||
$cursor += strlen($match[0]);
|
|
||||||
$grammar->addGrammar(self::parseGrammar($str, false));
|
|
||||||
} elseif (true !== $main && preg_match('/\]/A', $str, $match, null, $cursor)) {
|
|
||||||
$cursor += strlen($match[0]);
|
|
||||||
|
|
||||||
return $grammar;
|
|
||||||
} else {
|
|
||||||
throw new Twig_Error_Runtime(sprintf('Unable to parse grammar "%s" near "...%s..."', $str, substr($str, $cursor, 10)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $grammar;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,42 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of Twig.
|
|
||||||
*
|
|
||||||
* (c) 2009-2010 Fabien Potencier
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
class Twig_Extensions_TokenParser_Debug 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 = null;
|
|
||||||
if (!$this->parser->getStream()->test(Twig_Token::BLOCK_END_TYPE)) {
|
|
||||||
$expr = $this->parser->getExpressionParser()->parseExpression();
|
|
||||||
}
|
|
||||||
$this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
|
|
||||||
|
|
||||||
return new Twig_Extensions_Node_Debug($expr, $lineno, $this->getTag());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the tag name associated with this token parser.
|
|
||||||
*
|
|
||||||
* @param string The tag name
|
|
||||||
*/
|
|
||||||
public function getTag()
|
|
||||||
{
|
|
||||||
return 'debug';
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,80 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of Twig.
|
|
||||||
*
|
|
||||||
* (c) 2010 Fabien Potencier
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
class Twig_Extensions_TokenParser_Trans 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();
|
|
||||||
$count = null;
|
|
||||||
$plural = null;
|
|
||||||
|
|
||||||
if (!$stream->test(Twig_Token::BLOCK_END_TYPE)) {
|
|
||||||
$body = $this->parser->getExpressionParser()->parseExpression();
|
|
||||||
} else {
|
|
||||||
$stream->expect(Twig_Token::BLOCK_END_TYPE);
|
|
||||||
$body = $this->parser->subparse(array($this, 'decideForFork'));
|
|
||||||
if ('plural' === $stream->next()->getValue()) {
|
|
||||||
$count = $this->parser->getExpressionParser()->parseExpression();
|
|
||||||
$stream->expect(Twig_Token::BLOCK_END_TYPE);
|
|
||||||
$plural = $this->parser->subparse(array($this, 'decideForEnd'), true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$stream->expect(Twig_Token::BLOCK_END_TYPE);
|
|
||||||
|
|
||||||
$this->checkTransString($body, $lineno);
|
|
||||||
|
|
||||||
return new Twig_Extensions_Node_Trans($body, $plural, $count, $lineno, $this->getTag());
|
|
||||||
}
|
|
||||||
|
|
||||||
public function decideForFork(Twig_Token $token)
|
|
||||||
{
|
|
||||||
return $token->test(array('plural', 'endtrans'));
|
|
||||||
}
|
|
||||||
|
|
||||||
public function decideForEnd(Twig_Token $token)
|
|
||||||
{
|
|
||||||
return $token->test('endtrans');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the tag name associated with this token parser.
|
|
||||||
*
|
|
||||||
* @param string The tag name
|
|
||||||
*/
|
|
||||||
public function getTag()
|
|
||||||
{
|
|
||||||
return 'trans';
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function checkTransString(Twig_NodeInterface $body, $lineno)
|
|
||||||
{
|
|
||||||
foreach ($body as $i => $node) {
|
|
||||||
if (
|
|
||||||
$node instanceof Twig_Node_Text
|
|
||||||
||
|
|
||||||
($node instanceof Twig_Node_Print && $node->getNode('expr') instanceof Twig_Node_Expression_Name)
|
|
||||||
) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new Twig_Error_Syntax(sprintf('The text to be translated with "trans" can only contain references to simple variables'), $lineno);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
95
inc/3rdparty/Twig/Gettext/Extractor.php
vendored
@ -1,95 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This file is part of the Twig Gettext utility.
|
|
||||||
*
|
|
||||||
* (c) Саша Стаменковић <umpirsky@gmail.com>
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Twig\Gettext;
|
|
||||||
|
|
||||||
use Symfony\Component\Filesystem\Filesystem;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Extracts translations from twig templates.
|
|
||||||
*
|
|
||||||
* @author Саша Стаменковић <umpirsky@gmail.com>
|
|
||||||
*/
|
|
||||||
class Extractor
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @var \Twig_Environment
|
|
||||||
*/
|
|
||||||
protected $environment;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Template cached file names.
|
|
||||||
*
|
|
||||||
* @var string[]
|
|
||||||
*/
|
|
||||||
protected $templates;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gettext parameters.
|
|
||||||
*
|
|
||||||
* @var string[]
|
|
||||||
*/
|
|
||||||
protected $parameters;
|
|
||||||
|
|
||||||
public function __construct(\Twig_Environment $environment)
|
|
||||||
{
|
|
||||||
$this->environment = $environment;
|
|
||||||
$this->reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function reset()
|
|
||||||
{
|
|
||||||
$this->templates = array();
|
|
||||||
$this->parameters = array();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function addTemplate($path)
|
|
||||||
{
|
|
||||||
$this->environment->loadTemplate($path);
|
|
||||||
$this->templates[] = $this->environment->getCacheFilename($path);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function addGettextParameter($parameter)
|
|
||||||
{
|
|
||||||
$this->parameters[] = $parameter;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function setGettextParameters(array $parameters)
|
|
||||||
{
|
|
||||||
$this->parameters = $parameters;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function extract()
|
|
||||||
{
|
|
||||||
$command = 'xgettext';
|
|
||||||
$command .= ' '.join(' ', $this->parameters);
|
|
||||||
$command .= ' '.join(' ', $this->templates);
|
|
||||||
|
|
||||||
$error = 0;
|
|
||||||
$output = system($command, $error);
|
|
||||||
if (0 !== $error) {
|
|
||||||
throw new \RuntimeException(sprintf(
|
|
||||||
'Gettext command "%s" failed with error code %s and output: %s',
|
|
||||||
$command,
|
|
||||||
$error,
|
|
||||||
$output
|
|
||||||
));
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function __destruct()
|
|
||||||
{
|
|
||||||
$filesystem = new Filesystem();
|
|
||||||
$filesystem->remove($this->environment->getCache());
|
|
||||||
}
|
|
||||||
}
|
|
58
inc/3rdparty/Twig/Gettext/Loader/Filesystem.php
vendored
@ -1,58 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This file is part of the Twig Gettext utility.
|
|
||||||
*
|
|
||||||
* (c) Саша Стаменковић <umpirsky@gmail.com>
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Twig\Gettext\Loader;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Loads template from the filesystem.
|
|
||||||
*
|
|
||||||
* @author Саша Стаменковић <umpirsky@gmail.com>
|
|
||||||
*/
|
|
||||||
class Filesystem extends \Twig_Loader_Filesystem
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Hacked find template to allow loading templates by absolute path.
|
|
||||||
*
|
|
||||||
* @param string $name template name or absolute path
|
|
||||||
*/
|
|
||||||
protected function findTemplate($name)
|
|
||||||
{
|
|
||||||
// normalize name
|
|
||||||
$name = preg_replace('#/{2,}#', '/', strtr($name, '\\', '/'));
|
|
||||||
|
|
||||||
if (isset($this->cache[$name])) {
|
|
||||||
return $this->cache[$name];
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->validateName($name);
|
|
||||||
|
|
||||||
$namespace = '__main__';
|
|
||||||
if (isset($name[0]) && '@' == $name[0]) {
|
|
||||||
if (false === $pos = strpos($name, '/')) {
|
|
||||||
throw new \InvalidArgumentException(sprintf('Malformed namespaced template name "%s" (expecting "@namespace/template_name").', $name));
|
|
||||||
}
|
|
||||||
|
|
||||||
$namespace = substr($name, 1, $pos - 1);
|
|
||||||
|
|
||||||
$name = substr($name, $pos + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!isset($this->paths[$namespace])) {
|
|
||||||
throw new \Twig_Error_Loader(sprintf('There are no registered paths for namespace "%s".', $namespace));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (is_file($name)) {
|
|
||||||
return $this->cache[$name] = $name;
|
|
||||||
}
|
|
||||||
|
|
||||||
return __DIR__.'/../Test/Fixtures/twig/empty.twig';
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,39 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This file is part of the Twig Gettext utility.
|
|
||||||
*
|
|
||||||
* (c) Саша Стаменковић <umpirsky@gmail.com>
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Twig\Gettext\Routing\Generator;
|
|
||||||
|
|
||||||
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
|
|
||||||
use Symfony\Component\Routing\RequestContext;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Dummy url generator.
|
|
||||||
*
|
|
||||||
* @author Саша Стаменковић <umpirsky@gmail.com>
|
|
||||||
*/
|
|
||||||
class UrlGenerator implements UrlGeneratorInterface
|
|
||||||
{
|
|
||||||
protected $context;
|
|
||||||
|
|
||||||
public function generate($name, $parameters = array(), $absolute = false)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getContext()
|
|
||||||
{
|
|
||||||
return $this->context;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function setContext(RequestContext $context)
|
|
||||||
{
|
|
||||||
$this->context = $context;
|
|
||||||
}
|
|
||||||
}
|
|
123
inc/3rdparty/Twig/Gettext/Test/ExtractorTest.php
vendored
@ -1,123 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This file is part of the Twig Gettext utility.
|
|
||||||
*
|
|
||||||
* (c) Саша Стаменковић <umpirsky@gmail.com>
|
|
||||||
*
|
|
||||||
* For the full copyright and license information, please view the LICENSE
|
|
||||||
* file that was distributed with this source code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace Twig\Gettext\Test;
|
|
||||||
|
|
||||||
use Twig\Gettext\Extractor;
|
|
||||||
use Twig\Gettext\Loader\Filesystem;
|
|
||||||
use Symfony\Component\Translation\Loader\PoFileLoader;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Саша Стаменковић <umpirsky@gmail.com>
|
|
||||||
*/
|
|
||||||
class ExtractorTest extends \PHPUnit_Framework_TestCase
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* @var \Twig_Environment
|
|
||||||
*/
|
|
||||||
protected $twig;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var PoFileLoader
|
|
||||||
*/
|
|
||||||
protected $loader;
|
|
||||||
|
|
||||||
protected function setUp()
|
|
||||||
{
|
|
||||||
$this->twig = new \Twig_Environment(new Filesystem('/'), array(
|
|
||||||
'cache' => '/tmp/cache/'.uniqid(),
|
|
||||||
'auto_reload' => true
|
|
||||||
));
|
|
||||||
$this->twig->addExtension(new \Twig_Extensions_Extension_I18n());
|
|
||||||
|
|
||||||
$this->loader = new PoFileLoader();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @dataProvider testExtractDataProvider
|
|
||||||
*/
|
|
||||||
public function testExtract(array $templates, array $parameters, array $messages)
|
|
||||||
{
|
|
||||||
$extractor = new Extractor($this->twig);
|
|
||||||
|
|
||||||
foreach ($templates as $template) {
|
|
||||||
$extractor->addTemplate($template);
|
|
||||||
}
|
|
||||||
foreach ($parameters as $parameter) {
|
|
||||||
$extractor->addGettextParameter($parameter);
|
|
||||||
}
|
|
||||||
|
|
||||||
$extractor->extract();
|
|
||||||
|
|
||||||
$catalog = $this->loader->load($this->getPotFile(), null);
|
|
||||||
|
|
||||||
foreach ($messages as $message) {
|
|
||||||
$this->assertTrue(
|
|
||||||
$catalog->has($message),
|
|
||||||
sprintf('Message "%s" not found in catalog.', $message)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testExtractDataProvider()
|
|
||||||
{
|
|
||||||
return array(
|
|
||||||
array(
|
|
||||||
array(
|
|
||||||
__DIR__.'/Fixtures/twig/singular.twig',
|
|
||||||
__DIR__.'/Fixtures/twig/plural.twig',
|
|
||||||
),
|
|
||||||
$this->getGettextParameters(),
|
|
||||||
array(
|
|
||||||
'Hello %name%!',
|
|
||||||
'Hello World!',
|
|
||||||
'Hey %name%, I have one apple.',
|
|
||||||
'Hey %name%, I have %count% apples.',
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testExtractNoTranslations()
|
|
||||||
{
|
|
||||||
$extractor = new Extractor($this->twig);
|
|
||||||
|
|
||||||
$extractor->addTemplate(__DIR__.'/Fixtures/twig/empty.twig');
|
|
||||||
$extractor->setGettextParameters($this->getGettextParameters());
|
|
||||||
|
|
||||||
$extractor->extract();
|
|
||||||
|
|
||||||
$catalog = $this->loader->load($this->getPotFile(), null);
|
|
||||||
|
|
||||||
$this->assertEmpty($catalog->all('messages'));
|
|
||||||
}
|
|
||||||
|
|
||||||
private function getPotFile()
|
|
||||||
{
|
|
||||||
return __DIR__.'/Fixtures/messages.pot';
|
|
||||||
}
|
|
||||||
|
|
||||||
private function getGettextParameters()
|
|
||||||
{
|
|
||||||
return array(
|
|
||||||
'--force-po',
|
|
||||||
'-o',
|
|
||||||
$this->getPotFile(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function tearDown()
|
|
||||||
{
|
|
||||||
if (file_exists($this->getPotFile())) {
|
|
||||||
unlink($this->getPotFile());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1 +0,0 @@
|
|||||||
Nothing to translate here.
|
|
@ -1,5 +0,0 @@
|
|||||||
{% trans %}
|
|
||||||
Hey {{ name }}, I have one apple.
|
|
||||||
{% plural apple_count %}
|
|
||||||
Hey {{ name }}, I have {{ count }} apples.
|
|
||||||
{% endtrans %}
|
|
@ -1,9 +0,0 @@
|
|||||||
{% trans "Hello World!" %}
|
|
||||||
|
|
||||||
{% trans %}
|
|
||||||
Hello World!
|
|
||||||
{% endtrans %}
|
|
||||||
|
|
||||||
{% trans %}
|
|
||||||
Hello {{ name }}!
|
|
||||||
{% endtrans %}
|
|
@ -24,15 +24,14 @@ define ('LANG', 'fr_FR.UTF8');
|
|||||||
$storage_type = 'sqlite'; # sqlite, file
|
$storage_type = 'sqlite'; # sqlite, file
|
||||||
|
|
||||||
# /!\ Be careful if you change the lines below /!\
|
# /!\ Be careful if you change the lines below /!\
|
||||||
|
|
||||||
require_once 'poche/pocheTools.class.php';
|
require_once 'poche/pocheTools.class.php';
|
||||||
require_once 'poche/pocheCore.php';
|
require_once 'poche/pocheCore.php';
|
||||||
require_once '3rdparty/Readability.php';
|
require_once '3rdparty/Readability.php';
|
||||||
require_once '3rdparty/Encoding.php';
|
require_once '3rdparty/Encoding.php';
|
||||||
require_once '3rdparty/Session.class.php';
|
require_once '3rdparty/Session.class.php';
|
||||||
require_once '3rdparty/Twig/Autoloader.php';
|
|
||||||
require_once 'store/store.class.php';
|
require_once 'store/store.class.php';
|
||||||
require_once 'store/' . $storage_type . '.class.php';
|
require_once 'store/' . $storage_type . '.class.php';
|
||||||
|
require_once './vendor/autoload.php';
|
||||||
|
|
||||||
if (DOWNLOAD_PICTURES) {
|
if (DOWNLOAD_PICTURES) {
|
||||||
require_once 'poche/pochePicture.php';
|
require_once 'poche/pochePicture.php';
|
||||||
@ -45,7 +44,7 @@ bindtextdomain(LANG, LOCALE);
|
|||||||
textdomain(LANG);
|
textdomain(LANG);
|
||||||
|
|
||||||
# template engine
|
# template engine
|
||||||
Twig_Autoloader::register();
|
// Twig_Autoloader::register();
|
||||||
$loader = new Twig_Loader_Filesystem(TPL);
|
$loader = new Twig_Loader_Filesystem(TPL);
|
||||||
$twig = new Twig_Environment($loader, array(
|
$twig = new Twig_Environment($loader, array(
|
||||||
'cache' => CACHE,
|
'cache' => CACHE,
|
||||||
|
40
index.php
@ -10,64 +10,68 @@
|
|||||||
|
|
||||||
include dirname(__FILE__).'/inc/config.php';
|
include dirname(__FILE__).'/inc/config.php';
|
||||||
|
|
||||||
$errors = array();
|
$notices = array();
|
||||||
|
|
||||||
# XSRF protection with token
|
# XSRF protection with token
|
||||||
if (!empty($_POST)) {
|
// if (!empty($_POST)) {
|
||||||
if (!Session::isToken($_POST['token'])) {
|
// if (!Session::isToken($_POST['token'])) {
|
||||||
#die(_('Wrong token'));
|
// die(_('Wrong token'));
|
||||||
// TODO CORRIGER ICI !!!
|
// // TODO remettre le test
|
||||||
}
|
// }
|
||||||
unset($_SESSION['tokens']);
|
// unset($_SESSION['tokens']);
|
||||||
}
|
// }
|
||||||
|
|
||||||
$referer = empty($_SERVER['HTTP_REFERER']) ? '' : $_SERVER['HTTP_REFERER'];
|
$referer = empty($_SERVER['HTTP_REFERER']) ? '' : $_SERVER['HTTP_REFERER'];
|
||||||
|
|
||||||
if (isset($_GET['login'])) {
|
if (isset($_GET['login'])) {
|
||||||
|
# hello you
|
||||||
if (!empty($_POST['login']) && !empty($_POST['password'])) {
|
if (!empty($_POST['login']) && !empty($_POST['password'])) {
|
||||||
if (Session::login($_SESSION['login'], $_SESSION['pass'], $_POST['login'], encode_string($_POST['password'] . $_POST['login']))) {
|
if (Session::login($_SESSION['login'], $_SESSION['pass'], $_POST['login'], encode_string($_POST['password'] . $_POST['login']))) {
|
||||||
pocheTools::logm('login successful');
|
pocheTools::logm('login successful');
|
||||||
$errors[]['value'] = _('login successful');
|
$pocheTools[]['value'] = _('login successful');
|
||||||
|
|
||||||
if (!empty($_POST['longlastingsession'])) {
|
if (!empty($_POST['longlastingsession'])) {
|
||||||
$_SESSION['longlastingsession'] = 31536000;
|
$_SESSION['longlastingsession'] = 31536000;
|
||||||
$_SESSION['expires_on'] = time() + $_SESSION['longlastingsession'];
|
$_SESSION['expires_on'] = time() + $_SESSION['longlastingsession'];
|
||||||
session_set_cookie_params($_SESSION['longlastingsession']);
|
session_set_cookie_params($_SESSION['longlastingsession']);
|
||||||
} else {
|
} else {
|
||||||
session_set_cookie_params(0); // when browser closes
|
session_set_cookie_params(0);
|
||||||
}
|
}
|
||||||
session_regenerate_id(true);
|
session_regenerate_id(true);
|
||||||
pocheTools::redirect($referer);
|
pocheTools::redirect($referer);
|
||||||
}
|
}
|
||||||
pocheTools::logm('login failed');
|
pocheTools::logm('login failed');
|
||||||
$errors[]['value'] = _('Login failed !');
|
$notices[]['value'] = _('Login failed !');
|
||||||
|
pocheTools::redirect();
|
||||||
} else {
|
} else {
|
||||||
pocheTools::logm('login failed');
|
pocheTools::logm('login failed');
|
||||||
|
pocheTools::redirect();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
elseif (isset($_GET['logout'])) {
|
elseif (isset($_GET['logout'])) {
|
||||||
|
# see you soon !
|
||||||
pocheTools::logm('logout');
|
pocheTools::logm('logout');
|
||||||
Session::logout();
|
Session::logout();
|
||||||
pocheTools::redirect();
|
pocheTools::redirect();
|
||||||
}
|
}
|
||||||
elseif (isset($_GET['config'])) {
|
elseif (isset($_GET['config'])) {
|
||||||
|
# Update password
|
||||||
if (isset($_POST['password']) && isset($_POST['password_repeat'])) {
|
if (isset($_POST['password']) && isset($_POST['password_repeat'])) {
|
||||||
if ($_POST['password'] == $_POST['password_repeat'] && $_POST['password'] != "") {
|
if ($_POST['password'] == $_POST['password_repeat'] && $_POST['password'] != "") {
|
||||||
pocheTools::logm('password updated');
|
|
||||||
if (!MODE_DEMO) {
|
if (!MODE_DEMO) {
|
||||||
|
pocheTools::logm('password updated');
|
||||||
$store->updatePassword(encode_string($_POST['password'] . $_SESSION['login']));
|
$store->updatePassword(encode_string($_POST['password'] . $_SESSION['login']));
|
||||||
#your password has been updated
|
Session::logout();
|
||||||
|
pocheTools::redirect();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
#in demo mode, you can\'t update password
|
pocheTools::logm('in demo mode, you can\'t do this');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
#your password can\'t be empty and you have to repeat it in the second field
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# Traitement des paramètres et déclenchement des actions
|
# Aaaaaaand action !
|
||||||
$view = (isset ($_REQUEST['view'])) ? htmlentities($_REQUEST['view']) : 'home';
|
$view = (isset ($_REQUEST['view'])) ? htmlentities($_REQUEST['view']) : 'home';
|
||||||
$full_head = (isset ($_REQUEST['full_head'])) ? htmlentities($_REQUEST['full_head']) : 'yes';
|
$full_head = (isset ($_REQUEST['full_head'])) ? htmlentities($_REQUEST['full_head']) : 'yes';
|
||||||
$action = (isset ($_REQUEST['action'])) ? htmlentities($_REQUEST['action']) : '';
|
$action = (isset ($_REQUEST['action'])) ? htmlentities($_REQUEST['action']) : '';
|
||||||
@ -82,7 +86,7 @@ $tpl_vars = array(
|
|||||||
'demo' => MODE_DEMO,
|
'demo' => MODE_DEMO,
|
||||||
'title' => _('poche, a read it later open source system'),
|
'title' => _('poche, a read it later open source system'),
|
||||||
'token' => Session::getToken(),
|
'token' => Session::getToken(),
|
||||||
'errors' => $errors,
|
'notices' => $notices,
|
||||||
);
|
);
|
||||||
|
|
||||||
if (Session::isLogged()) {
|
if (Session::isLogged()) {
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
<link rel="shortcut icon" type="image/x-icon" href="./img/favicon.ico" />
|
<link rel="shortcut icon" type="image/x-icon" href="./tpl/img/favicon.ico" />
|
||||||
<link rel="apple-touch-icon-precomposed" sizes="144x144" href="./img/apple-touch-icon-144x144-precomposed.png">
|
<link rel="apple-touch-icon-precomposed" sizes="144x144" href="./tpl/img/apple-touch-icon-144x144-precomposed.png">
|
||||||
<link rel="apple-touch-icon-precomposed" sizes="72x72" href="./img/apple-touch-icon-72x72-precomposed.png">
|
<link rel="apple-touch-icon-precomposed" sizes="72x72" href="./tpl/img/apple-touch-icon-72x72-precomposed.png">
|
||||||
<link rel="apple-touch-icon-precomposed" href="./img/apple-touch-icon-precomposed.png">
|
<link rel="apple-touch-icon-precomposed" href="./tpl/img/apple-touch-icon-precomposed.png">
|
||||||
<link rel="stylesheet" href="./css/knacss.css" media="all">
|
<link rel="stylesheet" href="./tpl/css/knacss.css" media="all">
|
||||||
<link rel="stylesheet" href="./css/style.css" media="all">
|
<link rel="stylesheet" href="./tpl/css/style.css" media="all">
|
||||||
<!-- Light Theme -->
|
<!-- Light Theme -->
|
||||||
<link rel="stylesheet" href="./css/style-light.css" media="all" title="light-style">
|
<link rel="stylesheet" href="./tpl/css/style-light.css" media="all" title="light-style">
|
||||||
<!-- Dark Theme -->
|
<!-- Dark Theme -->
|
||||||
<link rel="alternate stylesheet" href="./css/style-dark.css" media="all" title="dark-style">
|
<link rel="alternate stylesheet" href="./tpl/css/style-dark.css" media="all" title="dark-style">
|
@ -1,3 +1,3 @@
|
|||||||
<header>
|
<header>
|
||||||
<h1><a href="./"><img src="./img/logo.png" alt="logo poche" /></a>poche</h1>
|
<h1><a href="./"><img src="./tpl/img/logo.png" alt="logo poche" /></a>poche</h1>
|
||||||
</header>
|
</header>
|
@ -12,30 +12,30 @@
|
|||||||
{% endblock %}
|
{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div id="content">
|
<div id="content">
|
||||||
<h2>Bookmarklet</h2>
|
<h2>{% trans "Bookmarklet" %}</h2>
|
||||||
<p>Thanks to the bookmarklet, you will be able to easily add a link to your poche. If you don't know how use a bookmarklet, <a href="http://support.mozilla.org/en-US/kb/bookmarklets-perform-common-web-page-tasks">have a look here</a>.</p>
|
<p>{% trans "Thanks to the bookmarklet, you will be able to easily add a link to your poche." %} {% trans "Have a look to this documentation:" %} <a href="http://inthepoche.com/?pages/Documentation" target="_blank">http://inthepoche.com/?pages/Documentation</a>.</p>
|
||||||
<p>Drag & drop this link to your bookmarks bar and have fun with poche.</p>
|
<p>{% trans "Drag & drop this link to your bookmarks bar and have fun with poche." %}</p>
|
||||||
<p><a ondragend="this.click();" style="cursor: move; border: 1px dashed grey; background: white;" title="i am a bookmarklet, use me !" href="javascript:if(top['bookmarklet-url@inthepoche.com']){top['bookmarklet-url@inthepoche.com'];}else{(function(){var%20url%20=%20location.href%20||%20url;window.open('{$poche_url}?action=add&url='%20+%20btoa(url),'_self');})();void(0);}">poche it !</a></p>
|
<p><a ondragend="this.click();" style="cursor: move; border: 1px dashed grey; background: white;" title="i am a bookmarklet, use me !" href="javascript:if(top['bookmarklet-url@inthepoche.com']){top['bookmarklet-url@inthepoche.com'];}else{(function(){var%20url%20=%20location.href%20||%20url;window.open('{$poche_url}?action=add&url='%20+%20btoa(url),'_self');})();void(0);}">{% trans "poche it!" %}</a></p>
|
||||||
|
|
||||||
<h2>Password</h2>
|
<h2>{% trans "Change your password" %}</h2>
|
||||||
<form method="post" action="?config" name="loginform">
|
<form method="post" action="?config" name="loginform">
|
||||||
<fieldset class="w500p">
|
<fieldset class="w500p">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<label class="col w150p" for="password">New password</label>
|
<label class="col w150p" for="password">{% trans "New password" %}</label>
|
||||||
<input class="col" type="password" id="password" name="password" placeholder="Password" tabindex="2">
|
<input class="col" type="password" id="password" name="password" placeholder="{% trans "Password" %}" tabindex="2">
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<label class="col w150p" for="password_repeat">Repeat your new password</label>
|
<label class="col w150p" for="password_repeat">{% trans "Repeat your new password" %}</label>
|
||||||
<input class="col" type="password" id="password_repeat" name="password_repeat" placeholder="Password" tabindex="3">
|
<input class="col" type="password" id="password_repeat" name="password_repeat" placeholder="{% trans "Password" %}" tabindex="3">
|
||||||
</div>
|
</div>
|
||||||
<div class="row mts txtcenter">
|
<div class="row mts txtcenter">
|
||||||
<button class="bouton" type="submit" tabindex="4">Update</button>
|
<button class="bouton" type="submit" tabindex="4">{% trans "Update" %}</button>
|
||||||
</div>
|
</div>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
<input type="hidden" name="returnurl" value="<?php echo htmlspecialchars($referer);?>">
|
<input type="hidden" name="returnurl" value="{{ referer }}">
|
||||||
<input type="hidden" name="token" value="<?php echo Session::getToken(); ?>">
|
<input type="hidden" name="token" value="{{ token }}">
|
||||||
</form>
|
</form>
|
||||||
<h2>Export</h2>
|
<h2>{% trans "Export your poche datas" %}</h2>
|
||||||
<p><a href="?view=export" target="_blank">Click here</a> to export your poche datas.</p>
|
<p><a href="?view=export" target="_blank">{% trans "Click here" %}</a> {% trans "to export your poche datas." %}</p>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
@ -1,21 +0,0 @@
|
|||||||
<div id="content">
|
|
||||||
{loop="entries"}
|
|
||||||
<div id="entry-{$value.id}" class="entrie mb2">
|
|
||||||
<span class="content">
|
|
||||||
<h2 class="h6-like">
|
|
||||||
<a href="index.php?&view=view&id={$value.id}">{$value.title}</a>
|
|
||||||
</h2>
|
|
||||||
<div class="tools">
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<a title="toggle mark as read" class="tool archive {if="$value.is_read == '0'"}archive-off{/if}" onclick="toggle_archive(this, {$value.id})"><span></span></a></li>
|
|
||||||
<li><a title="toggle favorite" class="tool fav {if="$value.is_fav == '0'"}fav-off{/if}" onclick="toggle_favorite(this, {$value.id})"><span></span></a></li>
|
|
||||||
<li><form method="post" onsubmit="return confirm('Are you sure?')" style="display: inline;"><input type="hidden" name="token" id="token" value="<?php echo Session::getToken(); ?>" /><input type="hidden" id="action" name="action" value="delete" /><input type="hidden" id="view" name="view" value="{$view}" /><input type="hidden" id="id" name="id" value="{$value.id}" /><input type="submit" class="delete" title="toggle delete" /></form>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<div class="url">{$value.url}</div>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
{/loop}
|
|
||||||
</div>
|
|
@ -11,10 +11,19 @@
|
|||||||
{% endblock %}
|
{% endblock %}
|
||||||
{% block precontent %}
|
{% block precontent %}
|
||||||
<ul id="sort">
|
<ul id="sort">
|
||||||
<li><img src="img/up.png" onclick="sort_links('{{ view }}', 'ia');" title="{% trans "by date asc" %}" /> {% trans "by date" %} <img src="img/down.png" onclick="sort_links('{{ view }}', 'id');" title="{% trans "by date desc" %}" /></li>
|
<li><img src="./tpl/img/up.png" onclick="sort_links('{{ view }}', 'ia');" title="{% trans "by date asc" %}" /> {% trans "by date" %} <img src="./tpl/img/down.png" onclick="sort_links('{{ view }}', 'id');" title="{% trans "by date desc" %}" /></li>
|
||||||
<li><img src="img/up.png" onclick="sort_links('{{ view }}', 'ta');" title="{% trans "by title asc" %}" /> {% trans "by title" %} <img src="img/down.png" onclick="sort_links('{{ view }}', 'td');" title="{% trans "by title desc" %}" /></li>
|
<li><img src="./tpl/img/up.png" onclick="sort_links('{{ view }}', 'ta');" title="{% trans "by title asc" %}" /> {% trans "by title" %} <img src="./tpl/img/down.png" onclick="sort_links('{{ view }}', 'td');" title="{% trans "by title desc" %}" /></li>
|
||||||
</ul>
|
</ul>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
{% block notices %}
|
||||||
|
<div class="messages">
|
||||||
|
<ul>
|
||||||
|
{% for notice in notices %}
|
||||||
|
<li>{{ notice.value|e }}</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div id="content">
|
<div id="content">
|
||||||
{% for entry in entries %}
|
{% for entry in entries %}
|
||||||
@ -28,7 +37,7 @@
|
|||||||
<li>
|
<li>
|
||||||
<a title="{% trans "toggle mark as read" %}" class="tool archive {% if entry.is_read == 0 %}archive-off{% endif %}" onclick="toggle_archive(this, {{ entry.id|e }})"><span></span></a></li>
|
<a title="{% trans "toggle mark as read" %}" class="tool archive {% if entry.is_read == 0 %}archive-off{% endif %}" onclick="toggle_archive(this, {{ entry.id|e }})"><span></span></a></li>
|
||||||
<li><a title="{% trans "toggle favorite" %}" class="tool fav {% if entry.is_fav == 0 %}fav-off{% endif %}" onclick="toggle_favorite(this, {{ entry.id|e }})"><span></span></a></li>
|
<li><a title="{% trans "toggle favorite" %}" class="tool fav {% if entry.is_fav == 0 %}fav-off{% endif %}" onclick="toggle_favorite(this, {{ entry.id|e }})"><span></span></a></li>
|
||||||
<li><form method="post" onsubmit="return confirm('{% trans "are you sure?" %}')" style="display: inline;"><input type="hidden" name="token" id="token" value="{{ token }}" /><input type="hidden" id="action" name="action" value="delete" /><input type="hidden" id="view" name="view" value="{{ view }}" /><input type="hidden" id="id" name="id" value="{{ entry.id|e }}" /><input type="submit" class="delete" title="{% trans "toggle delete" %}" /></form>
|
<li><form method="post" style="display: inline;"><input type="hidden" name="token" id="token" value="{{ token }}" /><input type="hidden" id="action" name="action" value="delete" /><input type="hidden" id="view" name="view" value="{{ view }}" /><input type="hidden" id="id" name="id" value="{{ entry.id|e }}" /><input type="submit" class="delete" title="{% trans "toggle delete" %}" /></form>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
@ -40,9 +49,9 @@
|
|||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block js %}
|
{% block js %}
|
||||||
<script type="text/javascript" src="js/jquery-1.9.1.min.js"></script>
|
<script type="text/javascript" src="./tpl/js/jquery-1.9.1.min.js"></script>
|
||||||
<script type="text/javascript" src="js/poche.js"></script>
|
<script type="text/javascript" src="./tpl/js/poche.js"></script>
|
||||||
<script type="text/javascript" src="js/jquery.masonry.min.js"></script>
|
<script type="text/javascript" src="./tpl/js/jquery.masonry.min.js"></script>
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
$( window ).load( function()
|
$( window ).load( function()
|
||||||
{
|
{
|
||||||
|
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 7.2 KiB |
Before Width: | Height: | Size: 6.0 KiB After Width: | Height: | Size: 6.0 KiB |
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 5.7 KiB |
Before Width: | Height: | Size: 267 B After Width: | Height: | Size: 267 B |
Before Width: | Height: | Size: 221 B After Width: | Height: | Size: 221 B |
Before Width: | Height: | Size: 223 B After Width: | Height: | Size: 223 B |
Before Width: | Height: | Size: 786 B After Width: | Height: | Size: 786 B |
Before Width: | Height: | Size: 265 B After Width: | Height: | Size: 265 B |
Before Width: | Height: | Size: 330 B After Width: | Height: | Size: 330 B |
Before Width: | Height: | Size: 277 B After Width: | Height: | Size: 277 B |
Before Width: | Height: | Size: 225 B After Width: | Height: | Size: 225 B |
Before Width: | Height: | Size: 216 B After Width: | Height: | Size: 216 B |
Before Width: | Height: | Size: 346 B After Width: | Height: | Size: 346 B |
Before Width: | Height: | Size: 277 B After Width: | Height: | Size: 277 B |
Before Width: | Height: | Size: 235 B After Width: | Height: | Size: 235 B |
Before Width: | Height: | Size: 252 B After Width: | Height: | Size: 252 B |
Before Width: | Height: | Size: 314 B After Width: | Height: | Size: 314 B |
Before Width: | Height: | Size: 281 B After Width: | Height: | Size: 281 B |
Before Width: | Height: | Size: 911 B After Width: | Height: | Size: 911 B |
Before Width: | Height: | Size: 662 B After Width: | Height: | Size: 662 B |
Before Width: | Height: | Size: 655 B After Width: | Height: | Size: 655 B |
Before Width: | Height: | Size: 786 B After Width: | Height: | Size: 786 B |
Before Width: | Height: | Size: 537 B After Width: | Height: | Size: 537 B |
Before Width: | Height: | Size: 666 B After Width: | Height: | Size: 666 B |
Before Width: | Height: | Size: 212 B After Width: | Height: | Size: 212 B |
@ -1,11 +1,11 @@
|
|||||||
{% extends "layout.twig" %}
|
{% extends "layout.twig" %}
|
||||||
|
|
||||||
{% block title %}{% trans "login to your poche" %}{% endblock %}
|
{% block title %}{% trans "login to your poche" %}{% endblock %}
|
||||||
{% block messages %}
|
{% block notices %}
|
||||||
<div class="messages">
|
<div class="messages">
|
||||||
<ul>
|
<ul>
|
||||||
{% for error in errors %}
|
{% for notice in notices %}
|
||||||
<li>{{ error.value|e }}</li>
|
<li>{{ notice.value|e }}</li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
@ -28,7 +28,7 @@
|
|||||||
<label class="col w150p">{% trans "Stay signed in" %}</label>
|
<label class="col w150p">{% trans "Stay signed in" %}</label>
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<input type="checkbox" name="longlastingsession" tabindex="3">
|
<input type="checkbox" name="longlastingsession" tabindex="3">
|
||||||
<small class="inbl">(Do not check on public computers)</small>
|
<small class="inbl">{% trans "(Do not check on public computers)" %}</small>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row mts txtcenter">
|
<div class="row mts txtcenter">
|
||||||
|
7
vendor/autoload.php
vendored
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// autoload.php generated by Composer
|
||||||
|
|
||||||
|
require_once __DIR__ . '/composer' . '/autoload_real.php';
|
||||||
|
|
||||||
|
return ComposerAutoloaderInit1c7743925d207055d2ad189b1f10a029::getLoader();
|
1
vendor/bin/twig-gettext-extractor
vendored
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
../umpirsky/twig-gettext-extractor/twig-gettext-extractor
|
246
vendor/composer/ClassLoader.php
vendored
Normal file
@ -0,0 +1,246 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of Composer.
|
||||||
|
*
|
||||||
|
* (c) Nils Adermann <naderman@naderman.de>
|
||||||
|
* Jordi Boggiano <j.boggiano@seld.be>
|
||||||
|
*
|
||||||
|
* 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 <fabien@symfony.com>
|
||||||
|
* @author Jordi Boggiano <j.boggiano@seld.be>
|
||||||
|
*/
|
||||||
|
class ClassLoader
|
||||||
|
{
|
||||||
|
private $prefixes = array();
|
||||||
|
private $fallbackDirs = array();
|
||||||
|
private $useIncludePath = false;
|
||||||
|
private $classMap = array();
|
||||||
|
|
||||||
|
public function getPrefixes()
|
||||||
|
{
|
||||||
|
return call_user_func_array('array_merge', $this->prefixes);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getFallbackDirs()
|
||||||
|
{
|
||||||
|
return $this->fallbackDirs;
|
||||||
|
}
|
||||||
|
|
||||||
|
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 classes, merging with any others previously set.
|
||||||
|
*
|
||||||
|
* @param string $prefix The classes prefix
|
||||||
|
* @param array|string $paths The location(s) of the classes
|
||||||
|
* @param bool $prepend Prepend the location(s)
|
||||||
|
*/
|
||||||
|
public function add($prefix, $paths, $prepend = false)
|
||||||
|
{
|
||||||
|
if (!$prefix) {
|
||||||
|
if ($prepend) {
|
||||||
|
$this->fallbackDirs = array_merge(
|
||||||
|
(array) $paths,
|
||||||
|
$this->fallbackDirs
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$this->fallbackDirs = array_merge(
|
||||||
|
$this->fallbackDirs,
|
||||||
|
(array) $paths
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$first = $prefix[0];
|
||||||
|
if (!isset($this->prefixes[$first][$prefix])) {
|
||||||
|
$this->prefixes[$first][$prefix] = (array) $paths;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ($prepend) {
|
||||||
|
$this->prefixes[$first][$prefix] = array_merge(
|
||||||
|
(array) $paths,
|
||||||
|
$this->prefixes[$first][$prefix]
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$this->prefixes[$first][$prefix] = array_merge(
|
||||||
|
$this->prefixes[$first][$prefix],
|
||||||
|
(array) $paths
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a set of classes, replacing any others previously set.
|
||||||
|
*
|
||||||
|
* @param string $prefix The classes prefix
|
||||||
|
* @param array|string $paths The location(s) of the classes
|
||||||
|
*/
|
||||||
|
public function set($prefix, $paths)
|
||||||
|
{
|
||||||
|
if (!$prefix) {
|
||||||
|
$this->fallbackDirs = (array) $paths;
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$this->prefixes[substr($prefix, 0, 1)][$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)) {
|
||||||
|
include $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);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($this->classMap[$class])) {
|
||||||
|
return $this->classMap[$class];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (false !== $pos = strrpos($class, '\\')) {
|
||||||
|
// namespaced class name
|
||||||
|
$classPath = strtr(substr($class, 0, $pos), '\\', DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
|
||||||
|
$className = substr($class, $pos + 1);
|
||||||
|
} else {
|
||||||
|
// PEAR-like class name
|
||||||
|
$classPath = null;
|
||||||
|
$className = $class;
|
||||||
|
}
|
||||||
|
|
||||||
|
$classPath .= strtr($className, '_', DIRECTORY_SEPARATOR) . '.php';
|
||||||
|
|
||||||
|
$first = $class[0];
|
||||||
|
if (isset($this->prefixes[$first])) {
|
||||||
|
foreach ($this->prefixes[$first] as $prefix => $dirs) {
|
||||||
|
if (0 === strpos($class, $prefix)) {
|
||||||
|
foreach ($dirs as $dir) {
|
||||||
|
if (file_exists($dir . DIRECTORY_SEPARATOR . $classPath)) {
|
||||||
|
return $dir . DIRECTORY_SEPARATOR . $classPath;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($this->fallbackDirs as $dir) {
|
||||||
|
if (file_exists($dir . DIRECTORY_SEPARATOR . $classPath)) {
|
||||||
|
return $dir . DIRECTORY_SEPARATOR . $classPath;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($this->useIncludePath && $file = stream_resolve_include_path($classPath)) {
|
||||||
|
return $file;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->classMap[$class] = false;
|
||||||
|
}
|
||||||
|
}
|
13
vendor/composer/autoload_classmap.php
vendored
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// autoload_classmap.php generated by Composer
|
||||||
|
|
||||||
|
$vendorDir = dirname(dirname(__FILE__));
|
||||||
|
$baseDir = dirname($vendorDir);
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'Collator' => $vendorDir . '/symfony/intl/Symfony/Component/Intl/Resources/stubs/Collator.php',
|
||||||
|
'IntlDateFormatter' => $vendorDir . '/symfony/intl/Symfony/Component/Intl/Resources/stubs/IntlDateFormatter.php',
|
||||||
|
'Locale' => $vendorDir . '/symfony/intl/Symfony/Component/Intl/Resources/stubs/Locale.php',
|
||||||
|
'NumberFormatter' => $vendorDir . '/symfony/intl/Symfony/Component/Intl/Resources/stubs/NumberFormatter.php',
|
||||||
|
);
|
10
vendor/composer/autoload_files.php
vendored
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// autoload_files.php generated by Composer
|
||||||
|
|
||||||
|
$vendorDir = dirname(dirname(__FILE__));
|
||||||
|
$baseDir = dirname($vendorDir);
|
||||||
|
|
||||||
|
return array(
|
||||||
|
$vendorDir . '/symfony/intl/Symfony/Component/Intl/Resources/stubs/functions.php',
|
||||||
|
);
|
22
vendor/composer/autoload_namespaces.php
vendored
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// autoload_namespaces.php generated by Composer
|
||||||
|
|
||||||
|
$vendorDir = dirname(dirname(__FILE__));
|
||||||
|
$baseDir = dirname($vendorDir);
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'Twig_Extensions_' => array($vendorDir . '/twig/extensions/lib'),
|
||||||
|
'Twig_' => array($vendorDir . '/twig/twig/lib'),
|
||||||
|
'Twig\\Gettext' => array($vendorDir . '/umpirsky/twig-gettext-extractor'),
|
||||||
|
'Symfony\\Component\\Translation\\' => array($vendorDir . '/symfony/translation'),
|
||||||
|
'Symfony\\Component\\Routing\\' => array($vendorDir . '/symfony/routing'),
|
||||||
|
'Symfony\\Component\\PropertyAccess\\' => array($vendorDir . '/symfony/property-access'),
|
||||||
|
'Symfony\\Component\\OptionsResolver\\' => array($vendorDir . '/symfony/options-resolver'),
|
||||||
|
'Symfony\\Component\\Intl\\' => array($vendorDir . '/symfony/intl'),
|
||||||
|
'Symfony\\Component\\Icu\\' => array($vendorDir . '/symfony/icu'),
|
||||||
|
'Symfony\\Component\\Form\\' => array($vendorDir . '/symfony/form'),
|
||||||
|
'Symfony\\Component\\Filesystem\\' => array($vendorDir . '/symfony/filesystem'),
|
||||||
|
'Symfony\\Component\\EventDispatcher\\' => array($vendorDir . '/symfony/event-dispatcher'),
|
||||||
|
'Symfony\\Bridge\\Twig\\' => array($vendorDir . '/symfony/twig-bridge'),
|
||||||
|
);
|
47
vendor/composer/autoload_real.php
vendored
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
// autoload_real.php generated by Composer
|
||||||
|
|
||||||
|
class ComposerAutoloaderInit1c7743925d207055d2ad189b1f10a029
|
||||||
|
{
|
||||||
|
private static $loader;
|
||||||
|
|
||||||
|
public static function loadClassLoader($class)
|
||||||
|
{
|
||||||
|
if ('Composer\Autoload\ClassLoader' === $class) {
|
||||||
|
require __DIR__ . '/ClassLoader.php';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function getLoader()
|
||||||
|
{
|
||||||
|
if (null !== self::$loader) {
|
||||||
|
return self::$loader;
|
||||||
|
}
|
||||||
|
|
||||||
|
spl_autoload_register(array('ComposerAutoloaderInit1c7743925d207055d2ad189b1f10a029', 'loadClassLoader'), true, true);
|
||||||
|
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
|
||||||
|
spl_autoload_unregister(array('ComposerAutoloaderInit1c7743925d207055d2ad189b1f10a029', 'loadClassLoader'));
|
||||||
|
|
||||||
|
$vendorDir = dirname(__DIR__);
|
||||||
|
$baseDir = dirname($vendorDir);
|
||||||
|
|
||||||
|
$map = require __DIR__ . '/autoload_namespaces.php';
|
||||||
|
foreach ($map as $namespace => $path) {
|
||||||
|
$loader->set($namespace, $path);
|
||||||
|
}
|
||||||
|
|
||||||
|
$classMap = require __DIR__ . '/autoload_classmap.php';
|
||||||
|
if ($classMap) {
|
||||||
|
$loader->addClassMap($classMap);
|
||||||
|
}
|
||||||
|
|
||||||
|
$loader->register(true);
|
||||||
|
|
||||||
|
foreach (require __DIR__ . '/autoload_files.php' as $file) {
|
||||||
|
require $file;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $loader;
|
||||||
|
}
|
||||||
|
}
|
747
vendor/composer/installed.json
vendored
Normal file
@ -0,0 +1,747 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "twig/twig",
|
||||||
|
"version": "v1.13.2",
|
||||||
|
"version_normalized": "1.13.2.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/fabpot/Twig.git",
|
||||||
|
"reference": "v1.13.2"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/fabpot/Twig/zipball/v1.13.2",
|
||||||
|
"reference": "v1.13.2",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.2.4"
|
||||||
|
},
|
||||||
|
"time": "2013-08-03 15:35:31",
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.13-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"installation-source": "dist",
|
||||||
|
"autoload": {
|
||||||
|
"psr-0": {
|
||||||
|
"Twig_": "lib/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"BSD-3-Clause"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Fabien Potencier",
|
||||||
|
"email": "fabien@symfony.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Armin Ronacher",
|
||||||
|
"email": "armin.ronacher@active-4.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Twig, the flexible, fast, and secure template language for PHP",
|
||||||
|
"homepage": "http://twig.sensiolabs.org",
|
||||||
|
"keywords": [
|
||||||
|
"templating"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "twig/extensions",
|
||||||
|
"version": "dev-master",
|
||||||
|
"version_normalized": "9999999-dev",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/fabpot/Twig-extensions.git",
|
||||||
|
"reference": "f5b0c84f3699e494c84ee627d7d583e115d2c4a2"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/fabpot/Twig-extensions/zipball/f5b0c84f3699e494c84ee627d7d583e115d2c4a2",
|
||||||
|
"reference": "f5b0c84f3699e494c84ee627d7d583e115d2c4a2",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"twig/twig": "~1.0"
|
||||||
|
},
|
||||||
|
"time": "2013-07-02 11:21:55",
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "1.0.x-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"installation-source": "source",
|
||||||
|
"autoload": {
|
||||||
|
"psr-0": {
|
||||||
|
"Twig_Extensions_": "lib/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Fabien Potencier",
|
||||||
|
"email": "fabien@symfony.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Common additional features for Twig that do not directly belong in core",
|
||||||
|
"homepage": "https://github.com/fabpot/Twig-extensions",
|
||||||
|
"keywords": [
|
||||||
|
"debug",
|
||||||
|
"i18n",
|
||||||
|
"text"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "symfony/icu",
|
||||||
|
"version": "v1.0.0",
|
||||||
|
"version_normalized": "1.0.0.0",
|
||||||
|
"target-dir": "Symfony/Component/Icu",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/symfony/Icu.git",
|
||||||
|
"reference": "v1.0.0"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/symfony/Icu/zipball/v1.0.0",
|
||||||
|
"reference": "v1.0.0",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.3",
|
||||||
|
"symfony/intl": ">=2.3,<3.0"
|
||||||
|
},
|
||||||
|
"time": "2013-06-03 18:32:07",
|
||||||
|
"type": "library",
|
||||||
|
"installation-source": "dist",
|
||||||
|
"autoload": {
|
||||||
|
"psr-0": {
|
||||||
|
"Symfony\\Component\\Icu\\": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Symfony Community",
|
||||||
|
"homepage": "http://symfony.com/contributors"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Bernhard Schussek",
|
||||||
|
"email": "bschussek@gmail.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Contains an excerpt of the ICU data and classes to load it.",
|
||||||
|
"homepage": "http://symfony.com",
|
||||||
|
"keywords": [
|
||||||
|
"icu",
|
||||||
|
"intl"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "symfony/intl",
|
||||||
|
"version": "v2.3.2",
|
||||||
|
"version_normalized": "2.3.2.0",
|
||||||
|
"target-dir": "Symfony/Component/Intl",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/symfony/Intl.git",
|
||||||
|
"reference": "v2.3.2"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/symfony/Intl/zipball/v2.3.2",
|
||||||
|
"reference": "v2.3.2",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.3",
|
||||||
|
"symfony/icu": "~1.0-RC"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"symfony/filesystem": ">=2.1"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-intl": "to use the component with locales other than \"en\""
|
||||||
|
},
|
||||||
|
"time": "2013-07-08 13:00:35",
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.3-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"installation-source": "dist",
|
||||||
|
"autoload": {
|
||||||
|
"psr-0": {
|
||||||
|
"Symfony\\Component\\Intl\\": ""
|
||||||
|
},
|
||||||
|
"classmap": [
|
||||||
|
"Symfony/Component/Intl/Resources/stubs"
|
||||||
|
],
|
||||||
|
"files": [
|
||||||
|
"Symfony/Component/Intl/Resources/stubs/functions.php"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Symfony Community",
|
||||||
|
"homepage": "http://symfony.com/contributors"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Igor Wiedler",
|
||||||
|
"email": "igor@wiedler.ch",
|
||||||
|
"homepage": "http://wiedler.ch/igor/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Bernhard Schussek",
|
||||||
|
"email": "bschussek@gmail.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Eriksen Costa",
|
||||||
|
"email": "eriksen.costa@infranology.com.br"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "A PHP replacement layer for the C intl extension that includes additional data from the ICU library.",
|
||||||
|
"homepage": "http://symfony.com",
|
||||||
|
"keywords": [
|
||||||
|
"i18n",
|
||||||
|
"icu",
|
||||||
|
"internationalization",
|
||||||
|
"intl",
|
||||||
|
"l10n",
|
||||||
|
"localization"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "symfony/property-access",
|
||||||
|
"version": "v2.3.2",
|
||||||
|
"version_normalized": "2.3.2.0",
|
||||||
|
"target-dir": "Symfony/Component/PropertyAccess",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/symfony/PropertyAccess.git",
|
||||||
|
"reference": "v2.3.2"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/symfony/PropertyAccess/zipball/v2.3.2",
|
||||||
|
"reference": "v2.3.2",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.3"
|
||||||
|
},
|
||||||
|
"time": "2013-07-01 12:24:43",
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.3-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"installation-source": "dist",
|
||||||
|
"autoload": {
|
||||||
|
"psr-0": {
|
||||||
|
"Symfony\\Component\\PropertyAccess\\": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Fabien Potencier",
|
||||||
|
"email": "fabien@symfony.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Symfony Community",
|
||||||
|
"homepage": "http://symfony.com/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Symfony PropertyAccess Component",
|
||||||
|
"homepage": "http://symfony.com",
|
||||||
|
"keywords": [
|
||||||
|
"access",
|
||||||
|
"array",
|
||||||
|
"extraction",
|
||||||
|
"index",
|
||||||
|
"injection",
|
||||||
|
"object",
|
||||||
|
"property",
|
||||||
|
"property path",
|
||||||
|
"reflection"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "symfony/options-resolver",
|
||||||
|
"version": "v2.3.2",
|
||||||
|
"version_normalized": "2.3.2.0",
|
||||||
|
"target-dir": "Symfony/Component/OptionsResolver",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/symfony/OptionsResolver.git",
|
||||||
|
"reference": "v2.3.2"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/symfony/OptionsResolver/zipball/v2.3.2",
|
||||||
|
"reference": "v2.3.2",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.3"
|
||||||
|
},
|
||||||
|
"time": "2013-04-11 06:50:46",
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.3-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"installation-source": "dist",
|
||||||
|
"autoload": {
|
||||||
|
"psr-0": {
|
||||||
|
"Symfony\\Component\\OptionsResolver\\": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Fabien Potencier",
|
||||||
|
"email": "fabien@symfony.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Symfony Community",
|
||||||
|
"homepage": "http://symfony.com/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Symfony OptionsResolver Component",
|
||||||
|
"homepage": "http://symfony.com",
|
||||||
|
"keywords": [
|
||||||
|
"config",
|
||||||
|
"configuration",
|
||||||
|
"options"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "symfony/event-dispatcher",
|
||||||
|
"version": "v2.3.2",
|
||||||
|
"version_normalized": "2.3.2.0",
|
||||||
|
"target-dir": "Symfony/Component/EventDispatcher",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/symfony/EventDispatcher.git",
|
||||||
|
"reference": "v2.3.2"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/v2.3.2",
|
||||||
|
"reference": "v2.3.2",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.3"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"symfony/dependency-injection": "~2.0"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"symfony/dependency-injection": "",
|
||||||
|
"symfony/http-kernel": ""
|
||||||
|
},
|
||||||
|
"time": "2013-05-13 14:36:40",
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.3-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"installation-source": "dist",
|
||||||
|
"autoload": {
|
||||||
|
"psr-0": {
|
||||||
|
"Symfony\\Component\\EventDispatcher\\": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Fabien Potencier",
|
||||||
|
"email": "fabien@symfony.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Symfony Community",
|
||||||
|
"homepage": "http://symfony.com/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Symfony EventDispatcher Component",
|
||||||
|
"homepage": "http://symfony.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "symfony/form",
|
||||||
|
"version": "v2.3.2",
|
||||||
|
"version_normalized": "2.3.2.0",
|
||||||
|
"target-dir": "Symfony/Component/Form",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/symfony/Form.git",
|
||||||
|
"reference": "v2.3.2"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/symfony/Form/zipball/v2.3.2",
|
||||||
|
"reference": "v2.3.2",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.3",
|
||||||
|
"symfony/event-dispatcher": "~2.1",
|
||||||
|
"symfony/intl": "~2.3",
|
||||||
|
"symfony/options-resolver": "~2.1",
|
||||||
|
"symfony/property-access": "~2.2"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"symfony/http-foundation": "~2.2",
|
||||||
|
"symfony/validator": "~2.2"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"symfony/http-foundation": "",
|
||||||
|
"symfony/validator": ""
|
||||||
|
},
|
||||||
|
"time": "2013-07-01 12:24:43",
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.3-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"installation-source": "dist",
|
||||||
|
"autoload": {
|
||||||
|
"psr-0": {
|
||||||
|
"Symfony\\Component\\Form\\": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Fabien Potencier",
|
||||||
|
"email": "fabien@symfony.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Symfony Community",
|
||||||
|
"homepage": "http://symfony.com/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Symfony Form Component",
|
||||||
|
"homepage": "http://symfony.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "symfony/translation",
|
||||||
|
"version": "v2.3.2",
|
||||||
|
"version_normalized": "2.3.2.0",
|
||||||
|
"target-dir": "Symfony/Component/Translation",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/symfony/Translation.git",
|
||||||
|
"reference": "v2.3.2"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/symfony/Translation/zipball/v2.3.2",
|
||||||
|
"reference": "v2.3.2",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.3"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"symfony/config": "~2.0",
|
||||||
|
"symfony/yaml": "~2.2"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"symfony/config": "",
|
||||||
|
"symfony/yaml": ""
|
||||||
|
},
|
||||||
|
"time": "2013-05-13 14:36:40",
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.3-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"installation-source": "dist",
|
||||||
|
"autoload": {
|
||||||
|
"psr-0": {
|
||||||
|
"Symfony\\Component\\Translation\\": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Fabien Potencier",
|
||||||
|
"email": "fabien@symfony.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Symfony Community",
|
||||||
|
"homepage": "http://symfony.com/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Symfony Translation Component",
|
||||||
|
"homepage": "http://symfony.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "symfony/filesystem",
|
||||||
|
"version": "v2.3.2",
|
||||||
|
"version_normalized": "2.3.2.0",
|
||||||
|
"target-dir": "Symfony/Component/Filesystem",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/symfony/Filesystem.git",
|
||||||
|
"reference": "v2.3.2"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/symfony/Filesystem/zipball/v2.3.2",
|
||||||
|
"reference": "v2.3.2",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.3"
|
||||||
|
},
|
||||||
|
"time": "2013-06-04 15:02:05",
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.3-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"installation-source": "dist",
|
||||||
|
"autoload": {
|
||||||
|
"psr-0": {
|
||||||
|
"Symfony\\Component\\Filesystem\\": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Fabien Potencier",
|
||||||
|
"email": "fabien@symfony.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Symfony Community",
|
||||||
|
"homepage": "http://symfony.com/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Symfony Filesystem Component",
|
||||||
|
"homepage": "http://symfony.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "symfony/routing",
|
||||||
|
"version": "v2.3.2",
|
||||||
|
"version_normalized": "2.3.2.0",
|
||||||
|
"target-dir": "Symfony/Component/Routing",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/symfony/Routing.git",
|
||||||
|
"reference": "v2.3.2"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/symfony/Routing/zipball/v2.3.2",
|
||||||
|
"reference": "v2.3.2",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.3"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"doctrine/common": "~2.2",
|
||||||
|
"psr/log": "~1.0",
|
||||||
|
"symfony/config": "~2.2",
|
||||||
|
"symfony/yaml": "~2.0"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"doctrine/common": "",
|
||||||
|
"symfony/config": "",
|
||||||
|
"symfony/yaml": ""
|
||||||
|
},
|
||||||
|
"time": "2013-06-23 08:16:02",
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.3-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"installation-source": "dist",
|
||||||
|
"autoload": {
|
||||||
|
"psr-0": {
|
||||||
|
"Symfony\\Component\\Routing\\": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Fabien Potencier",
|
||||||
|
"email": "fabien@symfony.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Symfony Community",
|
||||||
|
"homepage": "http://symfony.com/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Symfony Routing Component",
|
||||||
|
"homepage": "http://symfony.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "symfony/twig-bridge",
|
||||||
|
"version": "v2.3.2",
|
||||||
|
"version_normalized": "2.3.2.0",
|
||||||
|
"target-dir": "Symfony/Bridge/Twig",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/symfony/TwigBridge.git",
|
||||||
|
"reference": "v2.3.2"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/symfony/TwigBridge/zipball/v2.3.2",
|
||||||
|
"reference": "v2.3.2",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.3",
|
||||||
|
"twig/twig": "~1.11"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"symfony/form": "2.2.*",
|
||||||
|
"symfony/http-kernel": "~2.2",
|
||||||
|
"symfony/routing": "~2.2",
|
||||||
|
"symfony/security": "~2.0",
|
||||||
|
"symfony/templating": "~2.1",
|
||||||
|
"symfony/translation": "~2.2",
|
||||||
|
"symfony/yaml": "~2.0"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"symfony/form": "",
|
||||||
|
"symfony/http-kernel": "",
|
||||||
|
"symfony/routing": "",
|
||||||
|
"symfony/security": "",
|
||||||
|
"symfony/templating": "",
|
||||||
|
"symfony/translation": "",
|
||||||
|
"symfony/yaml": ""
|
||||||
|
},
|
||||||
|
"time": "2013-05-16 10:19:58",
|
||||||
|
"type": "symfony-bridge",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.3-dev"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"installation-source": "dist",
|
||||||
|
"autoload": {
|
||||||
|
"psr-0": {
|
||||||
|
"Symfony\\Bridge\\Twig\\": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Fabien Potencier",
|
||||||
|
"email": "fabien@symfony.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Symfony Community",
|
||||||
|
"homepage": "http://symfony.com/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Symfony Twig Bridge",
|
||||||
|
"homepage": "http://symfony.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "umpirsky/twig-gettext-extractor",
|
||||||
|
"version": "1.1.3",
|
||||||
|
"version_normalized": "1.1.3.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/umpirsky/Twig-Gettext-Extractor.git",
|
||||||
|
"reference": "1.1.3"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/umpirsky/Twig-Gettext-Extractor/zipball/1.1.3",
|
||||||
|
"reference": "1.1.3",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.3",
|
||||||
|
"symfony/filesystem": ">=2.0,<3.0",
|
||||||
|
"symfony/form": ">=2.0,<3.0",
|
||||||
|
"symfony/routing": ">=2.0,<3.0",
|
||||||
|
"symfony/translation": ">=2.0,<3.0",
|
||||||
|
"symfony/twig-bridge": ">=2.0,<3.0",
|
||||||
|
"twig/extensions": "1.0.*",
|
||||||
|
"twig/twig": ">=1.2.0,<2.0-dev"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"symfony/config": "2.1.*"
|
||||||
|
},
|
||||||
|
"time": "2013-02-14 16:41:48",
|
||||||
|
"bin": [
|
||||||
|
"twig-gettext-extractor"
|
||||||
|
],
|
||||||
|
"type": "application",
|
||||||
|
"installation-source": "dist",
|
||||||
|
"autoload": {
|
||||||
|
"psr-0": {
|
||||||
|
"Twig\\Gettext": "."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Саша Стаменковић",
|
||||||
|
"email": "umpirsky@gmail.com",
|
||||||
|
"homepage": "http://umpirsky.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "The Twig Gettext Extractor is Poedit friendly tool which extracts translations from twig templates."
|
||||||
|
}
|
||||||
|
]
|
4
vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
vendor/
|
||||||
|
composer.lock
|
||||||
|
phpunit.xml
|
||||||
|
|
16
vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/CHANGELOG.md
vendored
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
CHANGELOG
|
||||||
|
=========
|
||||||
|
|
||||||
|
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
|
202
vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/ContainerAwareEventDispatcher.php
vendored
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* 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 <fabien@symfony.com>
|
||||||
|
* @author Bernhard Schussek <bschussek@gmail.com>
|
||||||
|
* @author Jordan Alliot <jordan.alliot@gmail.com>
|
||||||
|
*/
|
||||||
|
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 integer $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 (Boolean) count($this->listenerIds) || (Boolean) 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,32 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Symfony\Component\EventDispatcher\Debug;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Fabien Potencier <fabien@symfony.com>
|
||||||
|
*/
|
||||||
|
interface TraceableEventDispatcherInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* 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();
|
||||||
|
}
|
121
vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Event.php
vendored
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* 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 <guilhermeblanco@hotmail.com>
|
||||||
|
* @author Jonathan Wage <jonwage@gmail.com>
|
||||||
|
* @author Roman Borschel <roman@code-factory.org>
|
||||||
|
* @author Bernhard Schussek <bschussek@gmail.com>
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
class Event
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var Boolean 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 Boolean 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
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function setDispatcher(EventDispatcherInterface $dispatcher)
|
||||||
|
{
|
||||||
|
$this->dispatcher = $dispatcher;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the EventDispatcher that dispatches this Event
|
||||||
|
*
|
||||||
|
* @return EventDispatcherInterface
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function getDispatcher()
|
||||||
|
{
|
||||||
|
return $this->dispatcher;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the event's name.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function getName()
|
||||||
|
{
|
||||||
|
return $this->name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the event's name property.
|
||||||
|
*
|
||||||
|
* @param string $name The event name.
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
public function setName($name)
|
||||||
|
{
|
||||||
|
$this->name = $name;
|
||||||
|
}
|
||||||
|
}
|
185
vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcher.php
vendored
Normal file
@ -0,0 +1,185 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* 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 <guilhermeblanco@hotmail.com>
|
||||||
|
* @author Jonathan Wage <jonwage@gmail.com>
|
||||||
|
* @author Roman Borschel <roman@code-factory.org>
|
||||||
|
* @author Bernhard Schussek <bschussek@gmail.com>
|
||||||
|
* @author Fabien Potencier <fabien@symfony.com>
|
||||||
|
* @author Jordi Boggiano <j.boggiano@seld.be>
|
||||||
|
* @author Jordan Alliot <jordan.alliot@gmail.com>
|
||||||
|
*
|
||||||
|
* @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 $this->sorted;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see EventDispatcherInterface::hasListeners
|
||||||
|
*/
|
||||||
|
public function hasListeners($eventName = null)
|
||||||
|
{
|
||||||
|
return (Boolean) 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 array[callback] $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);
|
||||||
|
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]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
96
vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventDispatcherInterface.php
vendored
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* 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 <bschussek@gmail.com>
|
||||||
|
*
|
||||||
|
* @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 integer $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 Boolean true if the specified event has any listeners, false otherwise
|
||||||
|
*/
|
||||||
|
public function hasListeners($eventName = null);
|
||||||
|
}
|
50
vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/EventSubscriberInterface.php
vendored
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* 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 <guilhermeblanco@hotmail.com>
|
||||||
|
* @author Jonathan Wage <jonwage@gmail.com>
|
||||||
|
* @author Roman Borschel <roman@code-factory.org>
|
||||||
|
* @author Bernhard Schussek <bschussek@gmail.com>
|
||||||
|
*
|
||||||
|
* @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();
|
||||||
|
}
|
186
vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/GenericEvent.php
vendored
Normal file
@ -0,0 +1,186 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* 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 <drak@zikula.org>
|
||||||
|
*/
|
||||||
|
class GenericEvent extends Event implements \ArrayAccess, \IteratorAggregate
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Observer pattern 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 boolean
|
||||||
|
*/
|
||||||
|
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 boolean
|
||||||
|
*/
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
92
vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/ImmutableEventDispatcher.php
vendored
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* 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 <bschussek@gmail.com>
|
||||||
|
*/
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
19
vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/LICENSE
vendored
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
Copyright (c) 2004-2013 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.
|
25
vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/README.md
vendored
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
EventDispatcher Component
|
||||||
|
=========================
|
||||||
|
|
||||||
|
EventDispatcher implements a lightweight version of the Observer design
|
||||||
|
pattern.
|
||||||
|
|
||||||
|
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 --dev
|
||||||
|
$ phpunit
|
@ -0,0 +1,257 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Symfony\Component\EventDispatcher\Tests;
|
||||||
|
|
||||||
|
use Symfony\Component\DependencyInjection\Container;
|
||||||
|
use Symfony\Component\DependencyInjection\Scope;
|
||||||
|
use Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher;
|
||||||
|
use Symfony\Component\EventDispatcher\Event;
|
||||||
|
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
||||||
|
|
||||||
|
class ContainerAwareEventDispatcherTest extends \PHPUnit_Framework_TestCase
|
||||||
|
{
|
||||||
|
protected function setUp()
|
||||||
|
{
|
||||||
|
if (!class_exists('Symfony\Component\DependencyInjection\Container')) {
|
||||||
|
$this->markTestSkipped('The "DependencyInjection" component is not available');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testAddAListenerService()
|
||||||
|
{
|
||||||
|
$event = new Event();
|
||||||
|
|
||||||
|
$service = $this->getMock('Symfony\Component\EventDispatcher\Tests\Service');
|
||||||
|
|
||||||
|
$service
|
||||||
|
->expects($this->once())
|
||||||
|
->method('onEvent')
|
||||||
|
->with($event)
|
||||||
|
;
|
||||||
|
|
||||||
|
$container = new Container();
|
||||||
|
$container->set('service.listener', $service);
|
||||||
|
|
||||||
|
$dispatcher = new ContainerAwareEventDispatcher($container);
|
||||||
|
$dispatcher->addListenerService('onEvent', array('service.listener', 'onEvent'));
|
||||||
|
|
||||||
|
$dispatcher->dispatch('onEvent', $event);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testAddASubscriberService()
|
||||||
|
{
|
||||||
|
$event = new Event();
|
||||||
|
|
||||||
|
$service = $this->getMock('Symfony\Component\EventDispatcher\Tests\SubscriberService');
|
||||||
|
|
||||||
|
$service
|
||||||
|
->expects($this->once())
|
||||||
|
->method('onEvent')
|
||||||
|
->with($event)
|
||||||
|
;
|
||||||
|
|
||||||
|
$container = new Container();
|
||||||
|
$container->set('service.subscriber', $service);
|
||||||
|
|
||||||
|
$dispatcher = new ContainerAwareEventDispatcher($container);
|
||||||
|
$dispatcher->addSubscriberService('service.subscriber', 'Symfony\Component\EventDispatcher\Tests\SubscriberService');
|
||||||
|
|
||||||
|
$dispatcher->dispatch('onEvent', $event);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testPreventDuplicateListenerService()
|
||||||
|
{
|
||||||
|
$event = new Event();
|
||||||
|
|
||||||
|
$service = $this->getMock('Symfony\Component\EventDispatcher\Tests\Service');
|
||||||
|
|
||||||
|
$service
|
||||||
|
->expects($this->once())
|
||||||
|
->method('onEvent')
|
||||||
|
->with($event)
|
||||||
|
;
|
||||||
|
|
||||||
|
$container = new Container();
|
||||||
|
$container->set('service.listener', $service);
|
||||||
|
|
||||||
|
$dispatcher = new ContainerAwareEventDispatcher($container);
|
||||||
|
$dispatcher->addListenerService('onEvent', array('service.listener', 'onEvent'), 5);
|
||||||
|
$dispatcher->addListenerService('onEvent', array('service.listener', 'onEvent'), 10);
|
||||||
|
|
||||||
|
$dispatcher->dispatch('onEvent', $event);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @expectedException \InvalidArgumentException
|
||||||
|
*/
|
||||||
|
public function testTriggerAListenerServiceOutOfScope()
|
||||||
|
{
|
||||||
|
$service = $this->getMock('Symfony\Component\EventDispatcher\Tests\Service');
|
||||||
|
|
||||||
|
$scope = new Scope('scope');
|
||||||
|
$container = new Container();
|
||||||
|
$container->addScope($scope);
|
||||||
|
$container->enterScope('scope');
|
||||||
|
|
||||||
|
$container->set('service.listener', $service, 'scope');
|
||||||
|
|
||||||
|
$dispatcher = new ContainerAwareEventDispatcher($container);
|
||||||
|
$dispatcher->addListenerService('onEvent', array('service.listener', 'onEvent'));
|
||||||
|
|
||||||
|
$container->leaveScope('scope');
|
||||||
|
$dispatcher->dispatch('onEvent');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testReEnteringAScope()
|
||||||
|
{
|
||||||
|
$event = new Event();
|
||||||
|
|
||||||
|
$service1 = $this->getMock('Symfony\Component\EventDispatcher\Tests\Service');
|
||||||
|
|
||||||
|
$service1
|
||||||
|
->expects($this->exactly(2))
|
||||||
|
->method('onEvent')
|
||||||
|
->with($event)
|
||||||
|
;
|
||||||
|
|
||||||
|
$scope = new Scope('scope');
|
||||||
|
$container = new Container();
|
||||||
|
$container->addScope($scope);
|
||||||
|
$container->enterScope('scope');
|
||||||
|
|
||||||
|
$container->set('service.listener', $service1, 'scope');
|
||||||
|
|
||||||
|
$dispatcher = new ContainerAwareEventDispatcher($container);
|
||||||
|
$dispatcher->addListenerService('onEvent', array('service.listener', 'onEvent'));
|
||||||
|
$dispatcher->dispatch('onEvent', $event);
|
||||||
|
|
||||||
|
$service2 = $this->getMock('Symfony\Component\EventDispatcher\Tests\Service');
|
||||||
|
|
||||||
|
$service2
|
||||||
|
->expects($this->once())
|
||||||
|
->method('onEvent')
|
||||||
|
->with($event)
|
||||||
|
;
|
||||||
|
|
||||||
|
$container->enterScope('scope');
|
||||||
|
$container->set('service.listener', $service2, 'scope');
|
||||||
|
|
||||||
|
$dispatcher->dispatch('onEvent', $event);
|
||||||
|
|
||||||
|
$container->leaveScope('scope');
|
||||||
|
|
||||||
|
$dispatcher->dispatch('onEvent');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testHasListenersOnLazyLoad()
|
||||||
|
{
|
||||||
|
$event = new Event();
|
||||||
|
|
||||||
|
$service = $this->getMock('Symfony\Component\EventDispatcher\Tests\Service');
|
||||||
|
|
||||||
|
$container = new Container();
|
||||||
|
$container->set('service.listener', $service);
|
||||||
|
|
||||||
|
$dispatcher = new ContainerAwareEventDispatcher($container);
|
||||||
|
$dispatcher->addListenerService('onEvent', array('service.listener', 'onEvent'));
|
||||||
|
|
||||||
|
$event->setDispatcher($dispatcher);
|
||||||
|
$event->setName('onEvent');
|
||||||
|
|
||||||
|
$service
|
||||||
|
->expects($this->once())
|
||||||
|
->method('onEvent')
|
||||||
|
->with($event)
|
||||||
|
;
|
||||||
|
|
||||||
|
$this->assertTrue($dispatcher->hasListeners());
|
||||||
|
|
||||||
|
if ($dispatcher->hasListeners('onEvent')) {
|
||||||
|
$dispatcher->dispatch('onEvent');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetListenersOnLazyLoad()
|
||||||
|
{
|
||||||
|
$event = new Event();
|
||||||
|
|
||||||
|
$service = $this->getMock('Symfony\Component\EventDispatcher\Tests\Service');
|
||||||
|
|
||||||
|
$container = new Container();
|
||||||
|
$container->set('service.listener', $service);
|
||||||
|
|
||||||
|
$dispatcher = new ContainerAwareEventDispatcher($container);
|
||||||
|
$dispatcher->addListenerService('onEvent', array('service.listener', 'onEvent'));
|
||||||
|
|
||||||
|
$listeners = $dispatcher->getListeners();
|
||||||
|
|
||||||
|
$this->assertTrue(isset($listeners['onEvent']));
|
||||||
|
|
||||||
|
$this->assertCount(1, $dispatcher->getListeners('onEvent'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testRemoveAfterDispatch()
|
||||||
|
{
|
||||||
|
$event = new Event();
|
||||||
|
|
||||||
|
$service = $this->getMock('Symfony\Component\EventDispatcher\Tests\Service');
|
||||||
|
|
||||||
|
$container = new Container();
|
||||||
|
$container->set('service.listener', $service);
|
||||||
|
|
||||||
|
$dispatcher = new ContainerAwareEventDispatcher($container);
|
||||||
|
$dispatcher->addListenerService('onEvent', array('service.listener', 'onEvent'));
|
||||||
|
|
||||||
|
$dispatcher->dispatch('onEvent', new Event());
|
||||||
|
$dispatcher->removeListener('onEvent', array($container->get('service.listener'), 'onEvent'));
|
||||||
|
$this->assertFalse($dispatcher->hasListeners('onEvent'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testRemoveBeforeDispatch()
|
||||||
|
{
|
||||||
|
$event = new Event();
|
||||||
|
|
||||||
|
$service = $this->getMock('Symfony\Component\EventDispatcher\Tests\Service');
|
||||||
|
|
||||||
|
$container = new Container();
|
||||||
|
$container->set('service.listener', $service);
|
||||||
|
|
||||||
|
$dispatcher = new ContainerAwareEventDispatcher($container);
|
||||||
|
$dispatcher->addListenerService('onEvent', array('service.listener', 'onEvent'));
|
||||||
|
|
||||||
|
$dispatcher->removeListener('onEvent', array($container->get('service.listener'), 'onEvent'));
|
||||||
|
$this->assertFalse($dispatcher->hasListeners('onEvent'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Service
|
||||||
|
{
|
||||||
|
public function onEvent(Event $e)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class SubscriberService implements EventSubscriberInterface
|
||||||
|
{
|
||||||
|
public static function getSubscribedEvents()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
'onEvent' => 'onEvent',
|
||||||
|
'onEvent' => array('onEvent', 10),
|
||||||
|
'onEvent' => array('onEvent'),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function onEvent(Event $e)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
320
vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/EventDispatcherTest.php
vendored
Normal file
@ -0,0 +1,320 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Symfony\Component\EventDispatcher\Tests;
|
||||||
|
|
||||||
|
use Symfony\Component\EventDispatcher\Event;
|
||||||
|
use Symfony\Component\EventDispatcher\EventDispatcher;
|
||||||
|
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
||||||
|
|
||||||
|
class EventDispatcherTest extends \PHPUnit_Framework_TestCase
|
||||||
|
{
|
||||||
|
/* Some pseudo events */
|
||||||
|
const preFoo = 'pre.foo';
|
||||||
|
const postFoo = 'post.foo';
|
||||||
|
const preBar = 'pre.bar';
|
||||||
|
const postBar = 'post.bar';
|
||||||
|
|
||||||
|
private $dispatcher;
|
||||||
|
|
||||||
|
private $listener;
|
||||||
|
|
||||||
|
protected function setUp()
|
||||||
|
{
|
||||||
|
$this->dispatcher = new EventDispatcher();
|
||||||
|
$this->listener = new TestEventListener();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function tearDown()
|
||||||
|
{
|
||||||
|
$this->dispatcher = null;
|
||||||
|
$this->listener = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testInitialState()
|
||||||
|
{
|
||||||
|
$this->assertEquals(array(), $this->dispatcher->getListeners());
|
||||||
|
$this->assertFalse($this->dispatcher->hasListeners(self::preFoo));
|
||||||
|
$this->assertFalse($this->dispatcher->hasListeners(self::postFoo));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testAddListener()
|
||||||
|
{
|
||||||
|
$this->dispatcher->addListener('pre.foo', array($this->listener, 'preFoo'));
|
||||||
|
$this->dispatcher->addListener('post.foo', array($this->listener, 'postFoo'));
|
||||||
|
$this->assertTrue($this->dispatcher->hasListeners(self::preFoo));
|
||||||
|
$this->assertTrue($this->dispatcher->hasListeners(self::postFoo));
|
||||||
|
$this->assertCount(1, $this->dispatcher->getListeners(self::preFoo));
|
||||||
|
$this->assertCount(1, $this->dispatcher->getListeners(self::postFoo));
|
||||||
|
$this->assertCount(2, $this->dispatcher->getListeners());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetListenersSortsByPriority()
|
||||||
|
{
|
||||||
|
$listener1 = new TestEventListener();
|
||||||
|
$listener2 = new TestEventListener();
|
||||||
|
$listener3 = new TestEventListener();
|
||||||
|
$listener1->name = '1';
|
||||||
|
$listener2->name = '2';
|
||||||
|
$listener3->name = '3';
|
||||||
|
|
||||||
|
$this->dispatcher->addListener('pre.foo', array($listener1, 'preFoo'), -10);
|
||||||
|
$this->dispatcher->addListener('pre.foo', array($listener2, 'preFoo'), 10);
|
||||||
|
$this->dispatcher->addListener('pre.foo', array($listener3, 'preFoo'));
|
||||||
|
|
||||||
|
$expected = array(
|
||||||
|
array($listener2, 'preFoo'),
|
||||||
|
array($listener3, 'preFoo'),
|
||||||
|
array($listener1, 'preFoo'),
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->assertSame($expected, $this->dispatcher->getListeners('pre.foo'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetAllListenersSortsByPriority()
|
||||||
|
{
|
||||||
|
$listener1 = new TestEventListener();
|
||||||
|
$listener2 = new TestEventListener();
|
||||||
|
$listener3 = new TestEventListener();
|
||||||
|
$listener4 = new TestEventListener();
|
||||||
|
$listener5 = new TestEventListener();
|
||||||
|
$listener6 = new TestEventListener();
|
||||||
|
|
||||||
|
$this->dispatcher->addListener('pre.foo', $listener1, -10);
|
||||||
|
$this->dispatcher->addListener('pre.foo', $listener2);
|
||||||
|
$this->dispatcher->addListener('pre.foo', $listener3, 10);
|
||||||
|
$this->dispatcher->addListener('post.foo', $listener4, -10);
|
||||||
|
$this->dispatcher->addListener('post.foo', $listener5);
|
||||||
|
$this->dispatcher->addListener('post.foo', $listener6, 10);
|
||||||
|
|
||||||
|
$expected = array(
|
||||||
|
'pre.foo' => array($listener3, $listener2, $listener1),
|
||||||
|
'post.foo' => array($listener6, $listener5, $listener4),
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->assertSame($expected, $this->dispatcher->getListeners());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testDispatch()
|
||||||
|
{
|
||||||
|
$this->dispatcher->addListener('pre.foo', array($this->listener, 'preFoo'));
|
||||||
|
$this->dispatcher->addListener('post.foo', array($this->listener, 'postFoo'));
|
||||||
|
$this->dispatcher->dispatch(self::preFoo);
|
||||||
|
$this->assertTrue($this->listener->preFooInvoked);
|
||||||
|
$this->assertFalse($this->listener->postFooInvoked);
|
||||||
|
$this->assertInstanceOf('Symfony\Component\EventDispatcher\Event', $this->dispatcher->dispatch('noevent'));
|
||||||
|
$this->assertInstanceOf('Symfony\Component\EventDispatcher\Event', $this->dispatcher->dispatch(self::preFoo));
|
||||||
|
$event = new Event();
|
||||||
|
$return = $this->dispatcher->dispatch(self::preFoo, $event);
|
||||||
|
$this->assertEquals('pre.foo', $event->getName());
|
||||||
|
$this->assertSame($event, $return);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testDispatchForClosure()
|
||||||
|
{
|
||||||
|
$invoked = 0;
|
||||||
|
$listener = function () use (&$invoked) {
|
||||||
|
$invoked++;
|
||||||
|
};
|
||||||
|
$this->dispatcher->addListener('pre.foo', $listener);
|
||||||
|
$this->dispatcher->addListener('post.foo', $listener);
|
||||||
|
$this->dispatcher->dispatch(self::preFoo);
|
||||||
|
$this->assertEquals(1, $invoked);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testStopEventPropagation()
|
||||||
|
{
|
||||||
|
$otherListener = new TestEventListener();
|
||||||
|
|
||||||
|
// postFoo() stops the propagation, so only one listener should
|
||||||
|
// be executed
|
||||||
|
// Manually set priority to enforce $this->listener to be called first
|
||||||
|
$this->dispatcher->addListener('post.foo', array($this->listener, 'postFoo'), 10);
|
||||||
|
$this->dispatcher->addListener('post.foo', array($otherListener, 'preFoo'));
|
||||||
|
$this->dispatcher->dispatch(self::postFoo);
|
||||||
|
$this->assertTrue($this->listener->postFooInvoked);
|
||||||
|
$this->assertFalse($otherListener->postFooInvoked);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testDispatchByPriority()
|
||||||
|
{
|
||||||
|
$invoked = array();
|
||||||
|
$listener1 = function () use (&$invoked) {
|
||||||
|
$invoked[] = '1';
|
||||||
|
};
|
||||||
|
$listener2 = function () use (&$invoked) {
|
||||||
|
$invoked[] = '2';
|
||||||
|
};
|
||||||
|
$listener3 = function () use (&$invoked) {
|
||||||
|
$invoked[] = '3';
|
||||||
|
};
|
||||||
|
$this->dispatcher->addListener('pre.foo', $listener1, -10);
|
||||||
|
$this->dispatcher->addListener('pre.foo', $listener2);
|
||||||
|
$this->dispatcher->addListener('pre.foo', $listener3, 10);
|
||||||
|
$this->dispatcher->dispatch(self::preFoo);
|
||||||
|
$this->assertEquals(array('3', '2', '1'), $invoked);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testRemoveListener()
|
||||||
|
{
|
||||||
|
$this->dispatcher->addListener('pre.bar', $this->listener);
|
||||||
|
$this->assertTrue($this->dispatcher->hasListeners(self::preBar));
|
||||||
|
$this->dispatcher->removeListener('pre.bar', $this->listener);
|
||||||
|
$this->assertFalse($this->dispatcher->hasListeners(self::preBar));
|
||||||
|
$this->dispatcher->removeListener('notExists', $this->listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testAddSubscriber()
|
||||||
|
{
|
||||||
|
$eventSubscriber = new TestEventSubscriber();
|
||||||
|
$this->dispatcher->addSubscriber($eventSubscriber);
|
||||||
|
$this->assertTrue($this->dispatcher->hasListeners(self::preFoo));
|
||||||
|
$this->assertTrue($this->dispatcher->hasListeners(self::postFoo));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testAddSubscriberWithPriorities()
|
||||||
|
{
|
||||||
|
$eventSubscriber = new TestEventSubscriber();
|
||||||
|
$this->dispatcher->addSubscriber($eventSubscriber);
|
||||||
|
|
||||||
|
$eventSubscriber = new TestEventSubscriberWithPriorities();
|
||||||
|
$this->dispatcher->addSubscriber($eventSubscriber);
|
||||||
|
|
||||||
|
$listeners = $this->dispatcher->getListeners('pre.foo');
|
||||||
|
$this->assertTrue($this->dispatcher->hasListeners(self::preFoo));
|
||||||
|
$this->assertCount(2, $listeners);
|
||||||
|
$this->assertInstanceOf('Symfony\Component\EventDispatcher\Tests\TestEventSubscriberWithPriorities', $listeners[0][0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testAddSubscriberWithMultipleListeners()
|
||||||
|
{
|
||||||
|
$eventSubscriber = new TestEventSubscriberWithMultipleListeners();
|
||||||
|
$this->dispatcher->addSubscriber($eventSubscriber);
|
||||||
|
|
||||||
|
$listeners = $this->dispatcher->getListeners('pre.foo');
|
||||||
|
$this->assertTrue($this->dispatcher->hasListeners(self::preFoo));
|
||||||
|
$this->assertCount(2, $listeners);
|
||||||
|
$this->assertEquals('preFoo2', $listeners[0][1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testRemoveSubscriber()
|
||||||
|
{
|
||||||
|
$eventSubscriber = new TestEventSubscriber();
|
||||||
|
$this->dispatcher->addSubscriber($eventSubscriber);
|
||||||
|
$this->assertTrue($this->dispatcher->hasListeners(self::preFoo));
|
||||||
|
$this->assertTrue($this->dispatcher->hasListeners(self::postFoo));
|
||||||
|
$this->dispatcher->removeSubscriber($eventSubscriber);
|
||||||
|
$this->assertFalse($this->dispatcher->hasListeners(self::preFoo));
|
||||||
|
$this->assertFalse($this->dispatcher->hasListeners(self::postFoo));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testRemoveSubscriberWithPriorities()
|
||||||
|
{
|
||||||
|
$eventSubscriber = new TestEventSubscriberWithPriorities();
|
||||||
|
$this->dispatcher->addSubscriber($eventSubscriber);
|
||||||
|
$this->assertTrue($this->dispatcher->hasListeners(self::preFoo));
|
||||||
|
$this->dispatcher->removeSubscriber($eventSubscriber);
|
||||||
|
$this->assertFalse($this->dispatcher->hasListeners(self::preFoo));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testRemoveSubscriberWithMultipleListeners()
|
||||||
|
{
|
||||||
|
$eventSubscriber = new TestEventSubscriberWithMultipleListeners();
|
||||||
|
$this->dispatcher->addSubscriber($eventSubscriber);
|
||||||
|
$this->assertTrue($this->dispatcher->hasListeners(self::preFoo));
|
||||||
|
$this->assertCount(2, $this->dispatcher->getListeners(self::preFoo));
|
||||||
|
$this->dispatcher->removeSubscriber($eventSubscriber);
|
||||||
|
$this->assertFalse($this->dispatcher->hasListeners(self::preFoo));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testEventReceivesTheDispatcherInstance()
|
||||||
|
{
|
||||||
|
$test = $this;
|
||||||
|
$this->dispatcher->addListener('test', function ($event) use (&$dispatcher) {
|
||||||
|
$dispatcher = $event->getDispatcher();
|
||||||
|
});
|
||||||
|
$this->dispatcher->dispatch('test');
|
||||||
|
$this->assertSame($this->dispatcher, $dispatcher);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see https://bugs.php.net/bug.php?id=62976
|
||||||
|
*
|
||||||
|
* This bug affects:
|
||||||
|
* - The PHP 5.3 branch for versions < 5.3.18
|
||||||
|
* - The PHP 5.4 branch for versions < 5.4.8
|
||||||
|
* - The PHP 5.5 branch is not affected
|
||||||
|
*/
|
||||||
|
public function testWorkaroundForPhpBug62976()
|
||||||
|
{
|
||||||
|
$dispatcher = new EventDispatcher();
|
||||||
|
$dispatcher->addListener('bug.62976', new CallableClass());
|
||||||
|
$dispatcher->removeListener('bug.62976', function() {});
|
||||||
|
$this->assertTrue($dispatcher->hasListeners('bug.62976'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class CallableClass
|
||||||
|
{
|
||||||
|
public function __invoke()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class TestEventListener
|
||||||
|
{
|
||||||
|
public $preFooInvoked = false;
|
||||||
|
public $postFooInvoked = false;
|
||||||
|
|
||||||
|
/* Listener methods */
|
||||||
|
|
||||||
|
public function preFoo(Event $e)
|
||||||
|
{
|
||||||
|
$this->preFooInvoked = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function postFoo(Event $e)
|
||||||
|
{
|
||||||
|
$this->postFooInvoked = true;
|
||||||
|
|
||||||
|
$e->stopPropagation();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class TestEventSubscriber implements EventSubscriberInterface
|
||||||
|
{
|
||||||
|
public static function getSubscribedEvents()
|
||||||
|
{
|
||||||
|
return array('pre.foo' => 'preFoo', 'post.foo' => 'postFoo');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class TestEventSubscriberWithPriorities implements EventSubscriberInterface
|
||||||
|
{
|
||||||
|
public static function getSubscribedEvents()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
'pre.foo' => array('preFoo', 10),
|
||||||
|
'post.foo' => array('postFoo'),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class TestEventSubscriberWithMultipleListeners implements EventSubscriberInterface
|
||||||
|
{
|
||||||
|
public static function getSubscribedEvents()
|
||||||
|
{
|
||||||
|
return array('pre.foo' => array(
|
||||||
|
array('preFoo1'),
|
||||||
|
array('preFoo2', 10)
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
84
vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/EventTest.php
vendored
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Symfony\Component\EventDispatcher\Tests;
|
||||||
|
|
||||||
|
use Symfony\Component\EventDispatcher\Event;
|
||||||
|
use Symfony\Component\EventDispatcher\EventDispatcher;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Event.
|
||||||
|
*/
|
||||||
|
class EventTest extends \PHPUnit_Framework_TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var \Symfony\Component\EventDispatcher\Event
|
||||||
|
*/
|
||||||
|
protected $event;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var \Symfony\Component\EventDispatcher\EventDispatcher
|
||||||
|
*/
|
||||||
|
protected $dispatcher;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets up the fixture, for example, opens a network connection.
|
||||||
|
* This method is called before a test is executed.
|
||||||
|
*/
|
||||||
|
protected function setUp()
|
||||||
|
{
|
||||||
|
$this->event = new Event;
|
||||||
|
$this->dispatcher = new EventDispatcher();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tears down the fixture, for example, closes a network connection.
|
||||||
|
* This method is called after a test is executed.
|
||||||
|
*/
|
||||||
|
protected function tearDown()
|
||||||
|
{
|
||||||
|
$this->event = null;
|
||||||
|
$this->eventDispatcher = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testIsPropagationStopped()
|
||||||
|
{
|
||||||
|
$this->assertFalse($this->event->isPropagationStopped());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testStopPropagationAndIsPropagationStopped()
|
||||||
|
{
|
||||||
|
$this->event->stopPropagation();
|
||||||
|
$this->assertTrue($this->event->isPropagationStopped());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testSetDispatcher()
|
||||||
|
{
|
||||||
|
$this->event->setDispatcher($this->dispatcher);
|
||||||
|
$this->assertSame($this->dispatcher, $this->event->getDispatcher());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetDispatcher()
|
||||||
|
{
|
||||||
|
$this->assertNull($this->event->getDispatcher());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetName()
|
||||||
|
{
|
||||||
|
$this->assertNull($this->event->getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testSetName()
|
||||||
|
{
|
||||||
|
$this->event->setName('foo');
|
||||||
|
$this->assertEquals('foo', $this->event->getName());
|
||||||
|
}
|
||||||
|
}
|
140
vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/Tests/GenericEventTest.php
vendored
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Symfony\Component\EventDispatcher\Tests;
|
||||||
|
|
||||||
|
use Symfony\Component\EventDispatcher\GenericEvent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Event.
|
||||||
|
*/
|
||||||
|
class GenericEventTest extends \PHPUnit_Framework_TestCase
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var GenericEvent
|
||||||
|
*/
|
||||||
|
private $event;
|
||||||
|
|
||||||
|
private $subject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prepares the environment before running a test.
|
||||||
|
*/
|
||||||
|
protected function setUp()
|
||||||
|
{
|
||||||
|
parent::setUp();
|
||||||
|
|
||||||
|
$this->subject = new \StdClass();
|
||||||
|
$this->event = new GenericEvent($this->subject, array('name' => 'Event'), 'foo');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cleans up the environment after running a test.
|
||||||
|
*/
|
||||||
|
protected function tearDown()
|
||||||
|
{
|
||||||
|
$this->subject = null;
|
||||||
|
$this->event = null;
|
||||||
|
|
||||||
|
parent::tearDown();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testConstruct()
|
||||||
|
{
|
||||||
|
$this->assertEquals($this->event, new GenericEvent($this->subject, array('name' => 'Event')));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests Event->getArgs()
|
||||||
|
*/
|
||||||
|
public function testGetArguments()
|
||||||
|
{
|
||||||
|
// test getting all
|
||||||
|
$this->assertSame(array('name' => 'Event'), $this->event->getArguments());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testSetArguments()
|
||||||
|
{
|
||||||
|
$result = $this->event->setArguments(array('foo' => 'bar'));
|
||||||
|
$this->assertAttributeSame(array('foo' => 'bar'), 'arguments', $this->event);
|
||||||
|
$this->assertSame($this->event, $result);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testSetArgument()
|
||||||
|
{
|
||||||
|
$result = $this->event->setArgument('foo2', 'bar2');
|
||||||
|
$this->assertAttributeSame(array('name' => 'Event', 'foo2' => 'bar2'), 'arguments', $this->event);
|
||||||
|
$this->assertEquals($this->event, $result);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetArgument()
|
||||||
|
{
|
||||||
|
// test getting key
|
||||||
|
$this->assertEquals('Event', $this->event->getArgument('name'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @expectedException \InvalidArgumentException
|
||||||
|
*/
|
||||||
|
public function testGetArgException()
|
||||||
|
{
|
||||||
|
$this->event->getArgument('nameNotExist');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testOffsetGet()
|
||||||
|
{
|
||||||
|
// test getting key
|
||||||
|
$this->assertEquals('Event', $this->event['name']);
|
||||||
|
|
||||||
|
// test getting invalid arg
|
||||||
|
$this->setExpectedException('InvalidArgumentException');
|
||||||
|
$this->assertFalse($this->event['nameNotExist']);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testOffsetSet()
|
||||||
|
{
|
||||||
|
$this->event['foo2'] = 'bar2';
|
||||||
|
$this->assertAttributeSame(array('name' => 'Event', 'foo2' => 'bar2'), 'arguments', $this->event);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testOffsetUnset()
|
||||||
|
{
|
||||||
|
unset($this->event['name']);
|
||||||
|
$this->assertAttributeSame(array(), 'arguments', $this->event);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testOffsetIsset()
|
||||||
|
{
|
||||||
|
$this->assertTrue(isset($this->event['name']));
|
||||||
|
$this->assertFalse(isset($this->event['nameNotExist']));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testHasArgument()
|
||||||
|
{
|
||||||
|
$this->assertTrue($this->event->hasArgument('name'));
|
||||||
|
$this->assertFalse($this->event->hasArgument('nameNotExist'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetSubject()
|
||||||
|
{
|
||||||
|
$this->assertSame($this->subject, $this->event->getSubject());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testHasIterator()
|
||||||
|
{
|
||||||
|
$data = array();
|
||||||
|
foreach ($this->event as $key => $value) {
|
||||||
|
$data[$key] = $value;
|
||||||
|
}
|
||||||
|
$this->assertEquals(array('name' => 'Event'), $data);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,106 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Symfony\Component\EventDispatcher\Tests;
|
||||||
|
|
||||||
|
use Symfony\Component\EventDispatcher\Event;
|
||||||
|
use Symfony\Component\EventDispatcher\ImmutableEventDispatcher;
|
||||||
|
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Bernhard Schussek <bschussek@gmail.com>
|
||||||
|
*/
|
||||||
|
class ImmutableEventDispatcherTest extends \PHPUnit_Framework_TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var \PHPUnit_Framework_MockObject_MockObject
|
||||||
|
*/
|
||||||
|
private $innerDispatcher;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var ImmutableEventDispatcher
|
||||||
|
*/
|
||||||
|
private $dispatcher;
|
||||||
|
|
||||||
|
protected function setUp()
|
||||||
|
{
|
||||||
|
$this->innerDispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
|
||||||
|
$this->dispatcher = new ImmutableEventDispatcher($this->innerDispatcher);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testDispatchDelegates()
|
||||||
|
{
|
||||||
|
$event = new Event();
|
||||||
|
|
||||||
|
$this->innerDispatcher->expects($this->once())
|
||||||
|
->method('dispatch')
|
||||||
|
->with('event', $event)
|
||||||
|
->will($this->returnValue('result'));
|
||||||
|
|
||||||
|
$this->assertSame('result', $this->dispatcher->dispatch('event', $event));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetListenersDelegates()
|
||||||
|
{
|
||||||
|
$this->innerDispatcher->expects($this->once())
|
||||||
|
->method('getListeners')
|
||||||
|
->with('event')
|
||||||
|
->will($this->returnValue('result'));
|
||||||
|
|
||||||
|
$this->assertSame('result', $this->dispatcher->getListeners('event'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testHasListenersDelegates()
|
||||||
|
{
|
||||||
|
$this->innerDispatcher->expects($this->once())
|
||||||
|
->method('hasListeners')
|
||||||
|
->with('event')
|
||||||
|
->will($this->returnValue('result'));
|
||||||
|
|
||||||
|
$this->assertSame('result', $this->dispatcher->hasListeners('event'));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @expectedException \BadMethodCallException
|
||||||
|
*/
|
||||||
|
public function testAddListenerDisallowed()
|
||||||
|
{
|
||||||
|
$this->dispatcher->addListener('event', function () { return 'foo'; });
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @expectedException \BadMethodCallException
|
||||||
|
*/
|
||||||
|
public function testAddSubscriberDisallowed()
|
||||||
|
{
|
||||||
|
$subscriber = $this->getMock('Symfony\Component\EventDispatcher\EventSubscriberInterface');
|
||||||
|
|
||||||
|
$this->dispatcher->addSubscriber($subscriber);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @expectedException \BadMethodCallException
|
||||||
|
*/
|
||||||
|
public function testRemoveListenerDisallowed()
|
||||||
|
{
|
||||||
|
$this->dispatcher->removeListener('event', function () { return 'foo'; });
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @expectedException \BadMethodCallException
|
||||||
|
*/
|
||||||
|
public function testRemoveSubscriberDisallowed()
|
||||||
|
{
|
||||||
|
$subscriber = $this->getMock('Symfony\Component\EventDispatcher\EventSubscriberInterface');
|
||||||
|
|
||||||
|
$this->dispatcher->removeSubscriber($subscriber);
|
||||||
|
}
|
||||||
|
}
|
38
vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/composer.json
vendored
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
{
|
||||||
|
"name": "symfony/event-dispatcher",
|
||||||
|
"type": "library",
|
||||||
|
"description": "Symfony EventDispatcher Component",
|
||||||
|
"keywords": [],
|
||||||
|
"homepage": "http://symfony.com",
|
||||||
|
"license": "MIT",
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Fabien Potencier",
|
||||||
|
"email": "fabien@symfony.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Symfony Community",
|
||||||
|
"homepage": "http://symfony.com/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3.3"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"symfony/dependency-injection": "~2.0"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"symfony/dependency-injection": "",
|
||||||
|
"symfony/http-kernel": ""
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-0": { "Symfony\\Component\\EventDispatcher\\": "" }
|
||||||
|
},
|
||||||
|
"target-dir": "Symfony/Component/EventDispatcher",
|
||||||
|
"minimum-stability": "dev",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-master": "2.3-dev"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
30
vendor/symfony/event-dispatcher/Symfony/Component/EventDispatcher/phpunit.xml.dist
vendored
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
|
<phpunit backupGlobals="false"
|
||||||
|
backupStaticAttributes="false"
|
||||||
|
colors="true"
|
||||||
|
convertErrorsToExceptions="true"
|
||||||
|
convertNoticesToExceptions="true"
|
||||||
|
convertWarningsToExceptions="true"
|
||||||
|
processIsolation="false"
|
||||||
|
stopOnFailure="false"
|
||||||
|
syntaxCheck="false"
|
||||||
|
bootstrap="vendor/autoload.php"
|
||||||
|
>
|
||||||
|
<testsuites>
|
||||||
|
<testsuite name="Symfony EventDispatcher Component Test Suite">
|
||||||
|
<directory>./Tests/</directory>
|
||||||
|
</testsuite>
|
||||||
|
</testsuites>
|
||||||
|
|
||||||
|
<filter>
|
||||||
|
<whitelist>
|
||||||
|
<directory>./</directory>
|
||||||
|
<exclude>
|
||||||
|
<directory>./Resources</directory>
|
||||||
|
<directory>./Tests</directory>
|
||||||
|
<directory>./vendor</directory>
|
||||||
|
</exclude>
|
||||||
|
</whitelist>
|
||||||
|
</filter>
|
||||||
|
</phpunit>
|
4
vendor/symfony/filesystem/Symfony/Component/Filesystem/.gitignore
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
vendor/
|
||||||
|
composer.lock
|
||||||
|
phpunit.xml
|
||||||
|
|
18
vendor/symfony/filesystem/Symfony/Component/Filesystem/CHANGELOG.md
vendored
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
CHANGELOG
|
||||||
|
=========
|
||||||
|
|
||||||
|
2.3.0
|
||||||
|
-----
|
||||||
|
|
||||||
|
* added the dumpFile() method to atomically write files
|
||||||
|
|
||||||
|
2.2.0
|
||||||
|
-----
|
||||||
|
|
||||||
|
* added a delete option for the mirror() method
|
||||||
|
|
||||||
|
2.1.0
|
||||||
|
-----
|
||||||
|
|
||||||
|
* 24eb396 : BC Break : mkdir() function now throws exception in case of failure instead of returning Boolean value
|
||||||
|
* created the component
|
24
vendor/symfony/filesystem/Symfony/Component/Filesystem/Exception/ExceptionInterface.php
vendored
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Symfony\Component\Filesystem\Exception;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Exception interface for all exceptions thrown by the component.
|
||||||
|
*
|
||||||
|
* @author Romain Neutron <imprec@gmail.com>
|
||||||
|
*
|
||||||
|
* @api
|
||||||
|
*/
|
||||||
|
interface ExceptionInterface
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|