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 / 1
CRAP
0.00% covered (danger)
0.00%
0 / 10
NodeData
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
12
0.00% covered (danger)
0.00%
0 / 10
 clone
0.00% covered (danger)
0.00%
0 / 1
12
0.00% covered (danger)
0.00%
0 / 10
<?php
declare( strict_types = 1 );
namespace Wikimedia\Parsoid\NodeData;
use Wikimedia\Parsoid\Utils\Utils;
// phpcs:disable MediaWiki.Commenting.PropertyDocumentation.ObjectTypeHintVar
/**
 * This object stores data associated with a single DOM node.
 *
 * Using undeclared properties reduces memory usage and CPU time if the
 * property is null in more than about 75% of instances. There are typically
 * a very large number of NodeData objects, so this optimisation is worthwhile.
 *
 * @property object|null $parsoid_diff
 * @property object|null $mw_variant
 * @property int|null $storedId
 */
class NodeData {
    /**
     * @var DataParsoid|null The unserialized data-parsoid attribute
     */
    public $parsoid;
    /**
     * @var object|null The unserialized data-mw attribute
     */
    public $mw;
    /**
     * Deep clone this object
     * @return self
     */
    public function clone(): self {
        $cloneableData = get_object_vars( $this );
        // Don't clone $this->parsoid because it has a custom clone method
        unset( $cloneableData['parsoid'] );
        // Don't clone storedId because it doesn't need it
        unset( $cloneableData['storedId'] );
        // Deep clone everything else
        $cloneableData = Utils::clone( $cloneableData );
        $nd = clone $this;
        if ( $nd->parsoid ) {
            $nd->parsoid = $nd->parsoid->clone();
        }
        foreach ( $cloneableData as $key => $value ) {
            $nd->$key = $value;
        }
        return $nd;
    }
}