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 / 17
CRAP
0.00% covered (danger)
0.00%
0 / 78
TraditionalMode
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 17
812
0.00% covered (danger)
0.00%
0 / 78
 __construct
0.00% covered (danger)
0.00%
0 / 1
6
0.00% covered (danger)
0.00%
0 / 4
 appendAttr
0.00% covered (danger)
0.00%
0 / 1
12
0.00% covered (danger)
0.00%
0 / 5
 ul
0.00% covered (danger)
0.00%
0 / 1
6
0.00% covered (danger)
0.00%
0 / 9
 perRow
0.00% covered (danger)
0.00%
0 / 1
6
0.00% covered (danger)
0.00%
0 / 7
 setAdditionalOptions
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 1
 caption
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 7
 dimensions
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 1
 scaleMedia
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 1
 thumbWidth
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 1
 thumbHeight
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 1
 thumbStyle
0.00% covered (danger)
0.00%
0 / 1
6
0.00% covered (danger)
0.00%
0 / 4
 boxWidth
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 1
 boxStyle
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 1
 galleryText
0.00% covered (danger)
0.00%
0 / 1
12
0.00% covered (danger)
0.00%
0 / 7
 line
0.00% covered (danger)
0.00%
0 / 1
2
0.00% covered (danger)
0.00%
0 / 19
 render
0.00% covered (danger)
0.00%
0 / 1
20
0.00% covered (danger)
0.00%
0 / 8
 getModuleStyles
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\Ext\Gallery;
use Wikimedia\Parsoid\DOM\Document;
use Wikimedia\Parsoid\DOM\DocumentFragment;
use Wikimedia\Parsoid\DOM\Element;
use Wikimedia\Parsoid\Ext\DOMUtils;
use Wikimedia\Parsoid\Ext\ParsoidExtensionAPI;
use Wikimedia\Parsoid\Ext\PHPUtils;
class TraditionalMode extends Mode {
    /**
     * Create a TraditionalMode singleton.
     * @param ?string $mode Only used by subclasses.
     */
    protected function __construct( ?string $mode = null ) {
        parent::__construct( $mode ?? 'traditional' );
        $this->scale = 1;
        $this->padding = PHPUtils::arrayToObject( [ 'thumb' => 30, 'box' => 5, 'border' => 8 ] );
    }
    /** @var float */
    protected $scale;
    /** @var \stdClass */
    protected $padding;
    /**
     * @param Element $ul
     * @param string $k
     * @param string $v
     */
    private function appendAttr( Element $ul, string $k, string $v ) {
        $val = $ul->hasAttribute( $k ) ? $ul->getAttribute( $k ) : '';
        if ( strlen( $val ) > 0 ) {
            $val .= ' ';
        }
        $ul->setAttribute( $k, $val . $v );
    }
    /**
     * @param Opts $opts
     * @param DocumentFragment $domFragment
     * @return Element
     */
    private function ul(
        Opts $opts, DocumentFragment $domFragment
    ): Element {
        $ul = $domFragment->ownerDocument->createElement( 'ul' );
        $cl = 'gallery mw-gallery-' . $this->mode;
        $ul->setAttribute( 'class', $cl );
        foreach ( $opts->attrs as $k => $v ) {
            $this->appendAttr( $ul, $k, $v );
        }
        $domFragment->appendChild( $ul );
        $this->perRow( $opts, $ul );
        $this->setAdditionalOptions( $opts, $ul );
        return $ul;
    }
    /**
     * @param Opts $opts
     * @param Element $ul
     */
    protected function perRow( Opts $opts, Element $ul ): void {
        if ( $opts->imagesPerRow > 0 ) {
            $padding = $this->padding;
            $total = $opts->imageWidth + $padding->thumb + $padding->box + $padding->border;
            $total *= $opts->imagesPerRow;
            $this->appendAttr( $ul, 'style', 'max-width: ' . $total . 'px;' );
            $this->appendAttr( $ul, 'style', '_width: ' . $total . 'px;' );
        }
    }
    /**
     * @param Opts $opts
     * @param Element $ul
     */
    protected function setAdditionalOptions( Opts $opts, Element $ul ): void {
    }
    /**
     * @param Opts $opts
     * @param Element $ul
     * @param DocumentFragment $caption
     */
    private function caption(
        Opts $opts, Element $ul, DocumentFragment $caption
    ) {
        $doc = $ul->ownerDocument;
        $li = $doc->createElement( 'li' );
        $li->setAttribute( 'class', 'gallerycaption' );
        DOMUtils::migrateChildren( $caption, $li );
        $ul->appendChild( $doc->createTextNode( "\n" ) );
        $ul->appendChild( $li );
    }
    /** @inheritDoc */
    public function dimensions( Opts $opts ): string {
        return "{$opts->imageWidth}x{$opts->imageHeight}px";
    }
    /**
     * @param Opts $opts
     * @param Element $wrapper
     * @return int|float
     */
    protected function scaleMedia( Opts $opts, Element $wrapper ) {
        return $opts->imageWidth;
    }
    /**
     * @param float|int $width
     * @return float|int
     */
    protected function thumbWidth( $width ) {
        return $width + $this->padding->thumb;
    }
    /**
     * @param float|int $height
     * @return float|int
     */
    protected function thumbHeight( $height ) {
        return $height + $this->padding->thumb;
    }
    /**
     * @param float|int $width
     * @param float|int $height
     * @return string
     */
    protected function thumbStyle( $width, $height ): string {
        $style = [ 'width: ' . $this->thumbWidth( $width ) . 'px;' ];
        if ( $this->mode === 'traditional' ) {
            $style[] = 'height: ' . $this->thumbHeight( $height ) . 'px;';
        }
        return implode( ' ', $style );
    }
    /**
     * @param float|int $width
     * @return float|int
     */
    protected function boxWidth( $width ) {
        return $this->thumbWidth( $width ) + $this->padding->box;
    }
    /**
     * @param float|int $width
     * @param float|int $height
     * @return string
     */
    protected function boxStyle( $width, $height ): string {
        return 'width: ' . $this->boxWidth( $width ) . 'px;';
    }
    /**
     * @param Document $doc
     * @param Element $box
     * @param ?Element $gallerytext
     * @param float $width
     */
    protected function galleryText(
        Document $doc, Element $box, ?Element $gallerytext,
        float $width
    ): void {
        $div = $doc->createElement( 'div' );
        $div->setAttribute( 'class', 'gallerytext' );
        if ( $gallerytext ) {
            ParsoidExtensionAPI::migrateChildrenAndTransferWrapperDataAttribs(
                $gallerytext, $div
            );
        }
        $box->appendChild( $div );
    }
    /**
     * @param Opts $opts
     * @param Element $ul
     * @param ParsedLine $o
     */
    private function line( Opts $opts, Element $ul, ParsedLine $o ): void {
        $doc = $ul->ownerDocument;
        $width = $this->scaleMedia( $opts, $o->thumb );
        $height = $opts->imageHeight;
        $box = $doc->createElement( 'li' );
        $box->setAttribute( 'class', 'gallerybox' );
        $box->setAttribute( 'style', $this->boxStyle( $width, $height ) );
        $thumb = $doc->createElement( 'div' );
        $thumb->setAttribute( 'class', 'thumb' );
        $thumb->setAttribute( 'style', $this->thumbStyle( $width, $height ) );
        $wrapper = $doc->createElement( 'span' );
        $wrapper->setAttribute( 'typeof', $o->rdfaType );
        ParsoidExtensionAPI::migrateChildrenAndTransferWrapperDataAttribs(
            $o->thumb, $wrapper
        );
        $thumb->appendChild( $wrapper );
        $box->appendChild( $thumb );
        $this->galleryText( $doc, $box, $o->gallerytext, $width );
        $ul->appendChild( $doc->createTextNode( "\n" ) );
        $ul->appendChild( $box );
    }
    /** @inheritDoc */
    public function render(
        ParsoidExtensionAPI $extApi, Opts $opts, ?DocumentFragment $caption,
        array $lines
    ): DocumentFragment {
        $domFragment = $extApi->htmlToDom( '' );
        $ul = $this->ul( $opts, $domFragment );
        if ( $caption ) {
            $this->caption( $opts, $ul, $caption );
        }
        foreach ( $lines as $l ) {
            $this->line( $opts, $ul, $l );
        }
        $ul->appendChild( $domFragment->ownerDocument->createTextNode( "\n" ) );
        return $domFragment;
    }
    /**
     * @return array
     */
    public function getModuleStyles(): array {
        return [ 'mediawiki.page.gallery.styles' ];
    }
}