Merge "objectcache: add object segmentation support to BagOStuff"
[lhc/web/wiklou.git] / includes / tidy / RemexCompatMunger.php
index 7cf7bbe..a37f4f7 100644 (file)
@@ -28,6 +28,7 @@ class RemexCompatMunger implements TreeHandler {
                "button" => true,
                "cite" => true,
                "code" => true,
+               "del" => true,
                "dfn" => true,
                "em" => true,
                "font" => true,
@@ -35,6 +36,7 @@ class RemexCompatMunger implements TreeHandler {
                "iframe" => true,
                "img" => true,
                "input" => true,
+               "ins" => true,
                "kbd" => true,
                "label" => true,
                "legend" => true,
@@ -70,6 +72,21 @@ class RemexCompatMunger implements TreeHandler {
                "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,
@@ -87,11 +104,19 @@ class RemexCompatMunger implements TreeHandler {
                '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 ) {
@@ -182,7 +207,9 @@ class RemexCompatMunger implements TreeHandler {
        }
 
        private function trace( $msg ) {
-               // echo "[RCM] $msg\n";
+               if ( $this->trace ) {
+                       wfDebug( "[RCM] $msg" );
+               }
        }
 
        /**
@@ -243,24 +270,25 @@ class RemexCompatMunger implements TreeHandler {
        ) {
                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
                ) {
@@ -348,7 +376,6 @@ class RemexCompatMunger implements TreeHandler {
                $root = $serializer->getRootNode();
                $nodes = [];
                $removableNodes = [];
-               $haveContent = false;
                while ( $node !== $cloneEnd ) {
                        $nextParent = $serializer->getParentNode( $node );
                        if ( $nextParent === $root ) {
@@ -455,9 +482,8 @@ class RemexCompatMunger implements TreeHandler {
        }
 
        public function comment( $preposition, $refElement, $text, $sourceStart, $sourceLength ) {
-               list( $parent, $refNode ) = $this->getParentForInsert( $preposition, $refElement );
-               $this->serializer->comment( $preposition, $refNode, $text,
-                       $sourceStart, $sourceLength );
+               list( , $refNode ) = $this->getParentForInsert( $preposition, $refElement );
+               $this->serializer->comment( $preposition, $refNode, $text, $sourceStart, $sourceLength );
        }
 
        public function error( $text, $pos ) {