Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 2 |
CRAP | |
0.00% |
0 / 24 |
FallbackHTMLHandler | |
0.00% |
0 / 1 |
|
0.00% |
0 / 2 |
132 | |
0.00% |
0 / 24 |
__construct | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
handle | |
0.00% |
0 / 1 |
110 | |
0.00% |
0 / 22 |
<?php | |
declare( strict_types = 1 ); | |
namespace Wikimedia\Parsoid\Html2Wt\DOMHandlers; | |
use Wikimedia\Parsoid\DOM\Element; | |
use Wikimedia\Parsoid\DOM\Node; | |
use Wikimedia\Parsoid\DOM\Text; | |
use Wikimedia\Parsoid\Html2Wt\SerializerState; | |
use Wikimedia\Parsoid\Utils\DOMCompat; | |
use Wikimedia\Parsoid\Utils\DOMDataUtils; | |
use Wikimedia\Parsoid\Utils\TokenUtils; | |
/** | |
* Used as a fallback in other tag handles. | |
*/ | |
class FallbackHTMLHandler extends DOMHandler { | |
public function __construct() { | |
parent::__construct( false ); | |
} | |
/** @inheritDoc */ | |
public function handle( | |
Element $node, SerializerState $state, bool $wrapperUnmodified = false | |
): ?Node { | |
$serializer = $state->serializer; | |
// Wikitext supports the following list syntax: | |
// | |
// * <li class="a"> hello world | |
// | |
// The "LI Hack" gives support for this syntax, and we need to | |
// specially reconstruct the above from a single <li> tag. | |
$serializer->handleLIHackIfApplicable( $node ); | |
$tag = $serializer->serializeHTMLTag( $node, $wrapperUnmodified ); | |
$state->emitChunk( $tag, $node ); | |
if ( $node->hasChildNodes() ) { | |
$inPHPBlock = $state->inPHPBlock; | |
if ( | |
TokenUtils::tagOpensBlockScope( DOMCompat::nodeName( $node ) ) || | |
// Blockquote is special in that it doesn't suppress paragraphs | |
// but does suppress pre wrapping | |
DOMCompat::nodeName( $node ) === 'blockquote' | |
) { | |
$state->inPHPBlock = true; | |
} | |
// TODO(arlolra): As of 1.3.0, html pre is considered an extension | |
// and wrapped in encapsulation. When that version is no longer | |
// accepted for serialization, we can remove this backwards | |
// compatibility code. | |
if ( DOMCompat::nodeName( $node ) === 'pre' ) { | |
// Handle html-pres specially | |
// 1. If the node has a leading newline, add one like it (logic copied from VE) | |
// 2. If not, and it has a data-parsoid strippedNL flag, add it back. | |
// This patched DOM will serialize html-pres correctly. | |
$lostLine = ''; | |
$fc = $node->firstChild; | |
if ( $fc instanceof Text ) { | |
$lostLine = str_starts_with( $fc->nodeValue, "\n" ) ? "\n" : ''; | |
} | |
if ( !$lostLine && ( DOMDataUtils::getDataParsoid( $node )->strippedNL ?? false ) ) { | |
$lostLine = "\n"; | |
} | |
$state->emitChunk( $lostLine, $node ); | |
} | |
$state->serializeChildren( $node ); | |
$state->inPHPBlock = $inPHPBlock; | |
} | |
$endTag = $serializer->serializeHTMLEndTag( $node, $wrapperUnmodified ); | |
$state->emitChunk( $endTag, $node ); | |
return $node->nextSibling; | |
} | |
} |