You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

153 lines
3.3 KiB

<?php namespace Sensory5\Shortcode\Classes;
/**
* Shortcodes
*
* Original idea from Pingpong Labs (https://github.com/pingpong-labs/shortcode)
*
* Changed to fit closer to the Thunderer\Shortcode syntax.
*/
use Countable;
use Thunder\Shortcode\HandlerContainer\HandlerContainer;
use Thunder\Shortcode\Parser\RegexParser;
use Thunder\Shortcode\Processor\Processor;
use Thunder\Shortcode\Shortcode\ShortcodeInterface;
class Shortcode implements Countable
{
/** @var HandlerContainer */
private $handlers;
/**
* The constructor.
*/
public function __construct()
{
$this->handlers = new HandlerContainer();
}
/**
* Get the names for all registered shortcodes.
*
* @return array
*/
public function getNames()
{
return $this->handlers->getNames();
}
/**
* Add a new shortcode to the handler container.
*
* @param string $name
* @param mixed $callback
*/
public function add($name, $callback)
{
$this->handlers->add($name, $callback);
}
/**
* Remove the specified shortcode name from the handler.
*
* @param string $name
*/
public function remove($name)
{
if ($this->exists($name)) {
$this->handlers->remove($name);
}
return $this;
}
/**
* Remove all registered shortcodes
*
* @return self
*/
public function destroyAll()
{
$this->handlers = new HandlerContainer();
return $this;
}
/**
* Strip any shortcodes from the content.
*
* @param string $content
*
* @return string
*/
public function strip($content)
{
$handlers = new HandlerContainer();
$handlers->setDefault(function(ShortcodeInterface $s) { return $s->getContent(); });
$processor = new Processor(new RegexParser(), $handlers);
return $processor->process($content);
}
/**
* Get count from all shortcodes.
*
* @return int
*/
public function count()
{
return count($this->handlers->getNames());
}
/**
* Return true is the given name exist in shortcodes array.
*
* @param string $name
*
* @return bool
*/
public function exists($name)
{
return $this->handlers->has($name);
}
/**
* Return true is the given content contains the named shortcode.
*
* @param string $content
* @param string $name
*
* @return bool
*/
public function contains($content, $name)
{
$hasShortcode = false;
$handlers = new HandlerContainer();
$handlers->setDefault(function(ShortcodeInterface $s) use($name, &$hasShortcode) {
if($s->getName() === $name) {
$hasShortcode = true;
}
});
$processor = new Processor(new RegexParser(), $handlers);
$processor->process($content);
return $hasShortcode;
}
/**
* Parse content and replace parts of it using registered handlers
*
* @param $content
*
* @return string
*/
public function parse($content)
{
$processor = new Processor(new RegexParser(), $this->handlers);
return $processor->process($content);
}
}