"mark" => true,
];
+ /**
+ * For the purposes of this class, "metadata" elements are those that
+ * should neither trigger p-wrapping nor stop an outer p-wrapping,
+ * typically those that are themselves invisible in a browser's rendering.
+ * This isn't a complete list, it's just the tags that we're likely to
+ * encounter in practice.
+ * @var array
+ */
+ private static $metadataElements = [
+ 'style' => true,
+ 'script' => true,
+ 'link' => true,
+ 'meta' => true,
+ ];
+
private static $formattingElements = [
'a' => true,
'b' => true,
'u' => true,
];
+ /** @var Serializer */
+ private $serializer;
+
+ /** @var bool */
+ private $trace;
+
/**
* @param Serializer $serializer
+ * @param bool $trace
*/
- public function __construct( Serializer $serializer ) {
+ public function __construct( Serializer $serializer, $trace = false ) {
$this->serializer = $serializer;
+ $this->trace = $trace;
}
public function startDocument( $fragmentNamespace, $fragmentName ) {
}
private function trace( $msg ) {
- // echo "[RCM] $msg\n";
+ if ( $this->trace ) {
+ wfDebug( "[RCM] $msg" );
+ }
}
/**
) {
list( $parent, $newRef ) = $this->getParentForInsert( $preposition, $refElement );
$parentData = $parent->snData;
- $parentNs = $parent->namespace;
- $parentName = $parent->name;
$elementName = $element->htmlName;
$inline = isset( self::$onlyInlineElements[$elementName] );
$under = $preposition === TreeBuilder::UNDER;
+ $elementToEnd = null;
- if ( $under && $parentData->isPWrapper && !$inline ) {
+ if ( isset( self::$metadataElements[$elementName] ) ) {
+ // The element is a metadata element, that we allow to appear in
+ // both inline and block contexts.
+ $this->trace( 'insert metadata' );
+ } elseif ( $under && $parentData->isPWrapper && !$inline ) {
// [B/b] The element is non-inline and the parent is a p-wrapper,
// close the parent and insert into its parent instead
$this->trace( 'insert B/b' );
$newParent = $this->serializer->getParentNode( $parent );
$parent = $newParent;
$parentData = $parent->snData;
- $pElement = $parentData->childPElement;
$parentData->childPElement = null;
$newRef = $refElement->userData;
- $this->endTag( $pElement, $sourceStart, 0 );
} elseif ( $under && $parentData->isSplittable
&& (bool)$parentData->ancestorPNode !== $inline
) {
$root = $serializer->getRootNode();
$nodes = [];
$removableNodes = [];
- $haveContent = false;
while ( $node !== $cloneEnd ) {
$nextParent = $serializer->getParentNode( $node );
if ( $nextParent === $root ) {