| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 | <?php/** * Injector that removes spans with no attributes */class HTMLPurifier_Injector_RemoveSpansWithoutAttributes extends HTMLPurifier_Injector{    /**     * @type string     */    public $name = 'RemoveSpansWithoutAttributes';    /**     * @type array     */    public $needed = array('span');    /**     * @type HTMLPurifier_AttrValidator     */    private $attrValidator;    /**     * Used by AttrValidator.     * @type HTMLPurifier_Config     */    private $config;    /**     * @type HTMLPurifier_Context     */    private $context;    /**     * @type SplObjectStorage     */    private $markForDeletion;    public function __construct()    {        $this->markForDeletion = new SplObjectStorage();    }    public function prepare($config, $context)    {        $this->attrValidator = new HTMLPurifier_AttrValidator();        $this->config = $config;        $this->context = $context;        return parent::prepare($config, $context);    }    /**     * @param HTMLPurifier_Token $token     */    public function handleElement(&$token)    {        if ($token->name !== 'span' || !$token instanceof HTMLPurifier_Token_Start) {            return;        }        // We need to validate the attributes now since this doesn't normally        // happen until after MakeWellFormed. If all the attributes are removed        // the span needs to be removed too.        $this->attrValidator->validateToken($token, $this->config, $this->context);        $token->armor['ValidateAttributes'] = true;        if (!empty($token->attr)) {            return;        }        $nesting = 0;        while ($this->forwardUntilEndToken($i, $current, $nesting)) {        }        if ($current instanceof HTMLPurifier_Token_End && $current->name === 'span') {            // Mark closing span tag for deletion            $this->markForDeletion->attach($current);            // Delete open span tag            $token = false;        }    }    /**     * @param HTMLPurifier_Token $token     */    public function handleEnd(&$token)    {        if ($this->markForDeletion->contains($token)) {            $this->markForDeletion->detach($token);            $token = false;        }    }}// vim: et sw=4 sts=4
 |