From: Raphaƫl Gertz <git@rapsys.eu>
Date: Sun, 25 Feb 2018 05:01:59 +0000 (+0100)
Subject: Add twig bb2html filter
X-Git-Tag: 0.0.1~7
X-Git-Url: https://git.rapsys.eu/packbundle/commitdiff_plain/bb11546ae005add2bdf1865f764b46ee8fa234e6

Add twig bb2html filter
Fix possible deprecated assets.packages direct call with dependancy injection
---

diff --git a/Twig/PackExtension.php b/Twig/PackExtension.php
index 4baba52..5ce4ed6 100644
--- a/Twig/PackExtension.php
+++ b/Twig/PackExtension.php
@@ -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'))
+			)
 		);
 	}
 }
diff --git a/Twig/PackTokenParser.php b/Twig/PackTokenParser.php
index 24a43e9..2644a1b 100644
--- a/Twig/PackTokenParser.php
+++ b/Twig/PackTokenParser.php
@@ -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());
 		}