<?php // src/Rapsys/AirBundle/Twig/Bb2htmlExtension.php namespace Rapsys\AirBundle\Twig; class Bb2htmlExtension extends \Twig_Extension { public function getFilters() { return array( new \Twig\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')) ) ); } }