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 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 39
IncludeOnly
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 6
306
0.00% covered (danger)
0.00%
0 / 39
 __construct
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 2
 type
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 1
 name
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 1
 toEnd
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 1
 ackEnd
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 1
 transformation
0.00% covered (danger)
0.00%
0 / 1
156
0.00% covered (danger)
0.00%
0 / 33
<?php
declare( strict_types = 1 );
namespace Wikimedia\Parsoid\Wt2Html\TT;
use Wikimedia\Parsoid\Tokens\EOFTk;
use Wikimedia\Parsoid\Tokens\SelfclosingTagTk;
use Wikimedia\Parsoid\Tokens\SourceRange;
use Wikimedia\Parsoid\Utils\PHPUtils;
use Wikimedia\Parsoid\Wt2Html\TokenTransformManager;
/**
 * Simple noinclude / onlyinclude implementation.
 * Strips all tokens in noinclude sections.
 */
class IncludeOnly extends TokenCollector {
    /**
     * @param TokenTransformManager $manager
     * @param array $options options
     */
    public function __construct( TokenTransformManager $manager, array $options ) {
        parent::__construct( $manager, $options );
    }
    /**
     * @return string
     */
    protected function type(): string {
        return 'tag';
    }
    /**
     * @return string
     */
    protected function name(): string {
        return 'includeonly';
    }
    /**
     * @return bool
     */
    protected function toEnd(): bool {
        return true;    // Match the end-of-input if </noinclude> is missing.
    }
    /**
     * @return bool
     */
    protected function ackEnd(): bool {
        return false;
    }
    /**
     * @param array $collection
     * @return TokenHandlerResult
     */
    protected function transformation( array $collection ): TokenHandlerResult {
        $start = array_shift( $collection );
        // Handle self-closing tag case specially!
        if ( $start instanceof SelfclosingTagTk ) {
            $tsr = $start->dataAttribs->tsr ?? new SourceRange( null, null );
            $token = TokenCollector::buildMetaToken(
                $this->manager,
                'mw:Includes/IncludeOnly',
                false,
                $tsr,
                null
            );
            if ( $start->dataAttribs->src ) {
                $datamw = PHPUtils::jsonEncode( [ 'src' => $start->dataAttribs->src ] );
                $token->addAttribute( 'data-mw', $datamw );
            }
            return ( $this->options['isInclude'] ) ?
                new TokenHandlerResult( [] ) : new TokenHandlerResult( [ $token ] );
        }
        $tokens = [];
        $end = array_pop( $collection );
        $eof = $end instanceof EOFTk;
        if ( $this->options['isInclude'] ) {
            // Just pass through the full collection including delimiters
            $tokens = $collection;
        } elseif ( !$this->options['inTemplate'] ) {
            // Content is stripped
            // Add meta tags for open and close for roundtripping.
            //
            // We can make do entirely with a single meta-tag since
            // there is no real content.  However, we add a dummy end meta-tag
            // so that all <*include*> meta tags show up in open/close pairs
            // and can be handled similarly by downstream handlers.
            $name = 'mw:Includes/IncludeOnly';
            $tokens[] = TokenCollector::buildStrippedMetaToken( $this->manager, $name,
                $start, $eof ? null : $end );
            if ( $start->dataAttribs->src ) {
                $dataMw = PHPUtils::jsonEncode( [ 'src' => $start->dataAttribs->src ] );
                $tokens[0]->addAttribute( 'data-mw', $dataMw );
            }
            if ( $end && !$eof ) {
                // This token is just a placeholder for RT purposes. Since the
                // stripped token (above) got the entire tsr value, we are artificially
                // setting the tsr on this node to zero-width to ensure that
                // DSR computation comes out correct.
                $endPos = isset( $end->dataAttribs->tsr ) ? $end->dataAttribs->tsr->end : null;
                $tokens[] = TokenCollector::buildMetaToken( $this->manager, $name,
                    true, new SourceRange( $endPos, $endPos ), '' );
            }
        }
        // Preserve EOF
        if ( $eof ) {
            $tokens[] = $end;
        }
        return new TokenHandlerResult( $tokens );
    }
}