Add twig bb2html filter
authorRaphaël Gertz <git@rapsys.eu>
Sun, 25 Feb 2018 05:01:59 +0000 (06:01 +0100)
committerRaphaël Gertz <git@rapsys.eu>
Sun, 25 Feb 2018 05:02:38 +0000 (06:02 +0100)
Fix possible deprecated assets.packages direct call with dependancy injection

Twig/PackExtension.php
Twig/PackTokenParser.php

index 4baba52..5ce4ed6 100644 (file)
@@ -4,13 +4,17 @@ namespace Rapsys\PackBundle\Twig;
 
 use Symfony\Component\HttpKernel\Config\FileLocator;
 use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\Asset\Packages;
+use Twig\TwigFilter;
 
 class PackExtension extends \Twig_Extension {
-       public function __construct(FileLocator $fileLocator, ContainerInterface $containerInterface) {
+       public function __construct(FileLocator $fileLocator, ContainerInterface $containerInterface, Packages $assetsPackages) {
                //Set file locator
                $this->fileLocator = $fileLocator;
                //Set container interface
                $this->containerInterface = $containerInterface;
+               //Set assets packages
+               $this->assetsPackages = $assetsPackages;
 
                //Set default prefix
                $this->prefix = '@RapsysPackBundle/Resources/public/';
@@ -46,9 +50,68 @@ class PackExtension extends \Twig_Extension {
 
        public function getTokenParsers() {
                return array(
-                       new PackTokenParser($this->fileLocator, $this->containerInterface, $this->prefix, 'stylesheet', $this->coutput, $this->cfilter),
-                       new PackTokenParser($this->fileLocator, $this->containerInterface, $this->prefix, 'javascript', $this->joutput, $this->jfilter),
-                       new PackTokenParser($this->fileLocator, $this->containerInterface, $this->prefix, 'image', $this->ioutput, $this->ifilter),
+                       new PackTokenParser($this->fileLocator, $this->containerInterface, $this->assetsPackages, $this->prefix, 'stylesheet', $this->coutput, $this->cfilter),
+                       new PackTokenParser($this->fileLocator, $this->containerInterface, $this->assetsPackages, $this->prefix, 'javascript', $this->joutput, $this->jfilter),
+                       new PackTokenParser($this->fileLocator, $this->containerInterface, $this->assetsPackages, $this->prefix, 'image', $this->ioutput, $this->ifilter)
+               );
+       }
+
+       public function getFilters() {
+               return array(
+                       new TwigFilter(
+                               'bb2html',
+                               function($text) {
+                                       $ctx = bbcode_create(
+                                               array(
+                                                       '' => array('type' => BBCODE_TYPE_ROOT),
+                                                       'code' => array(
+                                                               'type' => BBCODE_TYPE_OPTARG,
+                                                               'open_tag' => '<pre class="{PARAM}">',
+                                                               'close_tag' => '</pre>',
+                                                               'default_arg' => '{CONTENT}'
+                                                       ),
+                                                       'ul' => array(
+                                                               'type' => BBCODE_TYPE_NOARG,
+                                                               'open_tag' => '<ul>',
+                                                               'close_tag' => '</ul>',
+                                                               'childs' => 'li'
+                                                       ),
+                                                       'li' => array(
+                                                               'type' => BBCODE_TYPE_NOARG,
+                                                               'open_tag' => '<li>',
+                                                               'close_tag' => '</li>',
+                                                               'parent' => 'ul',
+                                                               'childs' => 'url'
+                                                       ),
+                                                       'url' => array(
+                                                               'type' => BBCODE_TYPE_OPTARG,
+                                                               'open_tag' => '<a href="{PARAM}">',
+                                                               'close_tag' => '</a>',
+                                                               'default_arg' => '{CONTENT}',
+                                                               'parent' => 'p,li'
+                                                       )
+                                               )
+                                       );
+                                       $text = nl2br(bbcode_parse($ctx, htmlspecialchars($text)));
+                                       if (preg_match_all('#\<pre[^>]*\>(.*?)\</pre\>#s', $text, $matches) && !empty($matches[1])) {
+                                               foreach($matches[1] as $string) {
+                                                       $text = str_replace($string, str_replace('<br />', '', $string), $text);
+                                               }
+                                       }
+                                       if (preg_match_all('#\<ul[^>]*\>(.*?)\</ul\>#s', $text, $matches) && !empty($matches[1])) {
+                                               foreach($matches[1] as $string) {
+                                                       $text = str_replace($string, str_replace('<br />', '', $string), $text);
+                                               }
+                                       }
+                                       $text = preg_replace(
+                                               array('#(<br />(\r?\n?))*<pre#s', '#</pre>(<br />(\r?\n?))*#', '#(<br />(\r?\n?))*<ul#s', '#</ul>(<br />(\r?\n?))*#', '#(<br />(\r?\n?)){2,}#'),
+                                               array('</p>\2<pre', '</pre>\2<p>', '</p>\2<ul', '</ul>\2<p>', '</p>\2<p>'),
+                                               $text
+                                       );
+                                       return $text;
+                               },
+                               array('is_safe' => array('html'))
+                       )
                );
        }
 }
index 24a43e9..2644a1b 100644 (file)
@@ -4,6 +4,7 @@ namespace Rapsys\PackBundle\Twig;
 
 use Symfony\Component\HttpKernel\Config\FileLocator;
 use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\Asset\Packages;
 
 class PackTokenParser extends \Twig_TokenParser {
        private $tag;
@@ -12,15 +13,17 @@ class PackTokenParser extends \Twig_TokenParser {
         * Constructor.
         *
         * @param class         $fileLocator            The FileLocator instance
+        * @param class         $containerInterface     The Container Interface instance
         * @param class         $assetsPackages         The Assets Packages instance
         * @param string        $prefix                 The prefix path
         * @param string        $tag                    The tag name
         * @param string        $output                 The default output string
         * @param array         $filters                The default filters array
         */
-       public function __construct(FileLocator $fileLocator, ContainerInterface $containerInterface, $prefix, $tag, $output, $filters) {
+       public function __construct(FileLocator $fileLocator, ContainerInterface $containerInterface, Packages $assetsPackages, $prefix, $tag, $output, $filters) {
                $this->fileLocator              = $fileLocator;
                $this->containerInterface       = $containerInterface;
+               $this->assetsPackages           = $assetsPackages;
                $this->prefix                   = $prefix;
                $this->tag                      = $tag;
                $this->output                   = $output;
@@ -233,7 +236,7 @@ class PackTokenParser extends \Twig_TokenParser {
                }
 
                //Retrieve asset uri
-               if (($output = $this->containerInterface->get('assets.packages')->getUrl($output, 'rapsys_pack')) === false) {
+               if (($output = $this->assetsPackages->getUrl($output, 'rapsys_pack')) === false) {
                        throw new \Twig_Error_Syntax(sprintf('Unable to get url for asset: %s with package %s', $output, 'rapsys_pack'), $token->getLine(), $stream->getSourceContext());
                }