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 / 31
PreHandler
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 6
240
0.00% covered (danger)
0.00%
0 / 31
 __construct
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 2
 handle
0.00% covered (danger)
0.00%
0 / 1
20
0.00% covered (danger)
0.00%
0 / 17
 before
0.00% covered (danger)
0.00%
0 / 1
20
0.00% covered (danger)
0.00%
0 / 5
 after
0.00% covered (danger)
0.00%
0 / 1
20
0.00% covered (danger)
0.00%
0 / 5
 firstChild
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 1
 lastChild
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 1
<?php
declare( strict_types = 1 );
namespace Wikimedia\Parsoid\Html2Wt\DOMHandlers;
use Wikimedia\Parsoid\DOM\Element;
use Wikimedia\Parsoid\DOM\Node;
use Wikimedia\Parsoid\Html2Wt\SerializerState;
use Wikimedia\Parsoid\Utils\DOMCompat;
use Wikimedia\Parsoid\Utils\DOMDataUtils;
use Wikimedia\Parsoid\Utils\PHPUtils;
use Wikimedia\Parsoid\Utils\Utils;
class PreHandler extends DOMHandler {
    public function __construct() {
        parent::__construct( false );
    }
    /** @inheritDoc */
    public function handle(
        Element $node, SerializerState $state, bool $wrapperUnmodified = false
    ): ?Node {
        // Handle indent pre
        // XXX: Use a pre escaper?
        $content = $state->serializeIndentPreChildrenToString( $node );
        // Strip (only the) trailing newline
        $trailingNL = str_ends_with( $content, "\n" ) ? "\n" : '';
        if ( $trailingNL !== '' ) {
            $content = substr( $content, 0, -1 );
        }
        // Insert indentation
        $solRE = '/'
            . '(\n('
            // SSS FIXME: What happened to the includeonly seen
            // in wts.separators.js?
            . PHPUtils::reStrip( Utils::COMMENT_REGEXP )
            . ')*)'
        . '/';
        $content = ' ' . preg_replace( $solRE, '$1 ', $content );
        // But skip "empty lines" (lines with 1+ comment and
        // optional whitespace) since empty-lines sail through all
        // handlers without being affected.
        //
        // See empty_line_with_comments rule in pegTokenizer.pegjs
        //
        // We could use 'split' to split content into lines and
        // selectively add indentation, but the code will get
        // unnecessarily complex for questionable benefits. So, going
        // this route for now.
        $emptyLinesRE = '/'
            // This space comes from what we inserted earlier
            . '(^|\n) '
            . '((?:'
            . '[ \t]*'
            . PHPUtils::reStrip( Utils::COMMENT_REGEXP )
            . '[ \t]*'
            . ')+)'
            . '(?=\n|$)'
        . '/D';
        $content = preg_replace( $emptyLinesRE, '$1$2', $content, 1 );
        $state->emitChunk( $content, $node );
        // Preserve separator source
        $state->appendSep( $trailingNL );
        return $node->nextSibling;
    }
    /** @inheritDoc */
    public function before( Element $node, Node $otherNode, SerializerState $state ): array {
        if ( $otherNode instanceof Element // for static analyzers
            && DOMCompat::nodeName( $otherNode ) === 'pre'
            && ( DOMDataUtils::getDataParsoid( $otherNode )->stx ?? null ) !== 'html'
        ) {
            return [ 'min' => 2 ];
        } else {
            return [ 'min' => 1 ];
        }
    }
    /** @inheritDoc */
    public function after( Element $node, Node $otherNode, SerializerState $state ): array {
        if ( $otherNode instanceof Element // for static analyzers
            && DOMCompat::nodeName( $otherNode ) === 'pre'
            && ( DOMDataUtils::getDataParsoid( $otherNode )->stx ?? null ) !== 'html'
        ) {
            return [ 'min' => 2 ];
        } else {
            return [ 'min' => 1 ];
        }
    }
    /** @inheritDoc */
    public function firstChild( Node $node, Node $otherNode, SerializerState $state ): array {
        return [];
    }
    /** @inheritDoc */
    public function lastChild( Node $node, Node $otherNode, SerializerState $state ): array {
        return [];
    }
}