*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace HtmlSanitizer;
use HtmlSanitizer\Extension\Basic\BasicExtension;
use HtmlSanitizer\Extension\Code\CodeExtension;
use HtmlSanitizer\Extension\Details\DetailsExtension;
use HtmlSanitizer\Extension\ExtensionInterface;
use HtmlSanitizer\Extension\Extra\ExtraExtension;
use HtmlSanitizer\Extension\Iframe\IframeExtension;
use HtmlSanitizer\Extension\Image\ImageExtension;
use HtmlSanitizer\Extension\Listing\ListExtension;
use HtmlSanitizer\Extension\Table\TableExtension;
use HtmlSanitizer\Parser\ParserInterface;
use HtmlSanitizer\Visitor\ScriptNodeVisitor;
use HtmlSanitizer\Visitor\StyleNodeVisitor;
use Psr\Log\LoggerInterface;
/**
* @author Titouan Galopin
*
* @final
*/
class SanitizerBuilder implements SanitizerBuilderInterface
{
/**
* @var ExtensionInterface[]
*/
private $extensions = [];
/**
* @var ParserInterface|null
*/
private $parser;
/**
* @var LoggerInterface|null
*/
private $logger;
public static function createDefault(): self
{
$builder = new self();
$builder->registerExtension(new BasicExtension());
$builder->registerExtension(new ListExtension());
$builder->registerExtension(new ImageExtension());
$builder->registerExtension(new CodeExtension());
$builder->registerExtension(new TableExtension());
$builder->registerExtension(new IframeExtension());
$builder->registerExtension(new DetailsExtension());
$builder->registerExtension(new ExtraExtension());
return $builder;
}
public function registerExtension(ExtensionInterface $extension)
{
$this->extensions[$extension->getName()] = $extension;
return $this;
}
public function setParser(?ParserInterface $parser)
{
$this->parser = $parser;
return $this;
}
public function setLogger(?LoggerInterface $logger)
{
$this->logger = $logger;
return $this;
}
public function build(array $config): SanitizerInterface
{
$nodeVisitors = [];
foreach ($config['extensions'] ?? [] as $extensionName) {
if (!isset($this->extensions[$extensionName])) {
throw new \InvalidArgumentException(sprintf(
'You have requested a non-existent sanitizer extension "%s" (available extensions: %s)',
$extensionName,
implode(', ', array_keys($this->extensions))
));
}
foreach ($this->extensions[$extensionName]->createNodeVisitors($config) as $tagName => $visitor) {
$nodeVisitors[$tagName] = $visitor;
}
}
// Always required visitors
$nodeVisitors['script'] = new ScriptNodeVisitor();
$nodeVisitors['style'] = new StyleNodeVisitor();
return new Sanitizer(new DomVisitor($nodeVisitors), $config['max_input_length'] ?? 20000, $this->parser, $this->logger);
}
}