Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 10
CRAP
0.00% covered (danger)
0.00%
0 / 45
TokenHandler
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 10
812
0.00% covered (danger)
0.00%
0 / 45
 __construct
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 6
 setPipelineId
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 2
 resetState
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 2
 isDisabled
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 1
 onEnd
0.00% covered (danger)
0.00%
0 / 1
6
0.00% covered (danger)
0.00%
0 / 1
 onNewline
0.00% covered (danger)
0.00%
0 / 1
6
0.00% covered (danger)
0.00%
0 / 1
 onTag
0.00% covered (danger)
0.00%
0 / 1
6
0.00% covered (danger)
0.00%
0 / 1
 onAny
0.00% covered (danger)
0.00%
0 / 1
6
0.00% covered (danger)
0.00%
0 / 1
 isModified
0.00% covered (danger)
0.00%
0 / 1
6
0.00% covered (danger)
0.00%
0 / 2
 process
0.00% covered (danger)
0.00%
0 / 1
210
0.00% covered (danger)
0.00%
0 / 28
<?php
declare( strict_types = 1 );
namespace Wikimedia\Parsoid\Wt2Html\TT;
use Wikimedia\Parsoid\Config\Env;
use Wikimedia\Parsoid\Tokens\EOFTk;
use Wikimedia\Parsoid\Tokens\NlTk;
use Wikimedia\Parsoid\Tokens\Token;
use Wikimedia\Parsoid\Utils\PHPUtils;
use Wikimedia\Parsoid\Wt2Html\TokenTransformManager;
abstract class TokenHandler {
    /** @var Env */
    protected $env;
    /** @var TokenTransformManager */
    protected $manager;
    /** @var int|null */
    protected $pipelineId;
    /** @var array */
    protected $options;
    /** @var bool */
    protected $disabled;
    /** @var bool */
    protected $onAnyEnabled;
    /** @var bool */
    protected $atTopLevel = false;
    /**
     * @param TokenTransformManager $manager The manager for this stage of the parse.
     * @param array $options Any options for the expander.
     */
    public function __construct( TokenTransformManager $manager, array $options ) {
        $this->manager = $manager;
        $this->env = $manager->getEnv();
        $this->options = $options;
        // This is set if the token handler is disabled for the entire pipeline.
        $this->disabled = false;
        // This is set/reset by the token handlers at various points
        // in the token stream based on what is encountered.
        // This only enables/disables the onAny handler.
        $this->onAnyEnabled = true;
    }
    /**
     * @param int $id
     */
    public function setPipelineId( int $id ): void {
        $this->pipelineId = $id;
    }
    /**
     * Resets any internal state for this token handler.
     *
     * @param array $options
     */
    public function resetState( array $options ): void {
        $this->atTopLevel = $options['toplevel'] ?? false;
    }
    /**
     * Is this transformer disabled?
     * @return bool
     */
    public function isDisabled(): bool {
        return $this->disabled;
    }
    /**
     * This handler is called for EOF tokens only
     * @param EOFTk $token EOF token to be processed
     * @return TokenHandlerResult|null A TokenHandlerResult, or null to efficiently
     *   indicate that the input token is unchanged.
     */
    public function onEnd( EOFTk $token ): ?TokenHandlerResult {
        return null;
    }
    /**
     * This handler is called for newline tokens only
     * @param NlTk $token Newline token to be processed
     * @return TokenHandlerResult|null A TokenHandlerResult, or null to efficiently
     *   indicate that the input token is unchanged.
     */
    public function onNewline( NlTk $token ): ?TokenHandlerResult {
        return null;
    }
    /**
     * This handler is called for tokens that are not EOFTk or NLTk tokens.
     * The handler may choose to process only specific kinds of tokens.
     * For example, a list handler may only process 'listitem' TagTk tokens.
     *
     * @param Token $token Token to be processed
     * @return TokenHandlerResult|null A TokenHandlerResult, or null to efficiently
     *   indicate that the input token is unchanged.
     */
    public function onTag( Token $token ): ?TokenHandlerResult {
        return null;
    }
    /**
     * This handler is called for *all* tokens in the token stream except if
     * (a) The more specific handlers above modified the token
     * (b) the more specific handlers (onTag, onEnd, onNewline) have set
     *     the skip flag in their return values.
     * (c) this handlers 'active' flag is set to false (can be set by any
     *     of the handlers).
     *
     * @param Token|string $token Token to be processed
     * @return TokenHandlerResult|null A TokenHandlerResult, or null to efficiently
     *   indicate that the input token is unchanged.
     */
    public function onAny( $token ): ?TokenHandlerResult {
        return null;
    }
    /**
     * @param mixed $token
     * @param TokenHandlerResult $res
     * @return bool
     */
    private function isModified( $token, $res ): bool {
        return $res->tokens !== null
            && $res->tokens !== [ $token ];
    }
    /**
     * Push an input array of tokens through the transformer
     * and return the transformed tokens
     * @param array $tokens
     * @return array
     */
    public function process( $tokens ): array {
        $accum = [];
        $i = 0;
        $n = count( $tokens );
        while ( $i < $n ) {
            $token = $tokens[$i];
            $res = null;
            $resTokens = null; // Not needed but helpful for code comprehension
            if ( $token instanceof NlTk ) {
                $res = $this->onNewline( $token );
            } elseif ( $token instanceof EOFTk ) {
                $res = $this->onEnd( $token );
            } elseif ( !is_string( $token ) ) {
                $res = $this->onTag( $token );
            } else {
                $res = null;
            }
            $modified = $res && $this->isModified( $token, $res );
            if ( $modified ) {
                $resTokens = $res->tokens;
            } elseif ( $this->onAnyEnabled && ( !$res || !$res->skipOnAny ) ) {
                $res = $this->onAny( $token );
                $modified = $res && $this->isModified( $token, $res );
                if ( $modified ) {
                    $resTokens = $res->tokens;
                }
            }
            if ( !$modified ) {
                $accum[] = $token;
            } elseif ( $resTokens ) {
                // Avoid array_merge() -- see https://w.wiki/3zvE
                PHPUtils::pushArray( $accum, $resTokens );
            }
            $i++;
        }
        return $accum;
    }
}