wikimedia/mediawiki-extensions-Translate

View on GitHub
src/MessageBundleTranslation/MessageBundleContentHandler.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php
declare( strict_types = 1 );

namespace MediaWiki\Extension\Translate\MessageBundleTranslation;

use Content;
use InvalidArgumentException;
use MediaWiki\Content\Renderer\ContentParseParams;
use MediaWiki\Content\ValidationParams;
use MediaWiki\Parser\ParserOutput;
use StatusValue;
use TextContentHandler;
use const CONTENT_FORMAT_JSON;

/**
 * @author Niklas Laxström
 * @license GPL-2.0-or-later
 * @since 2021.05
 */
class MessageBundleContentHandler extends TextContentHandler {
    public function __construct( $modelId = MessageBundleContent::CONTENT_MODEL_ID ) {
        parent::__construct( $modelId, [ CONTENT_FORMAT_JSON ] );
    }

    protected function getContentClass(): string {
        return MessageBundleContent::class;
    }

    public function makeEmptyContent(): Content {
        $class = $this->getContentClass();
        return new $class( '{}' );
    }

    public function validateSave( Content $content, ValidationParams $validationParams ) {
        // This will give an informative error message when trying to change the content model
        try {
            if ( $content instanceof MessageBundleContent ) {
                $content->validate();
            }
            return StatusValue::newGood();
        } catch ( MalformedBundle $e ) {
            // XXX: We have no context source nor is there Message::messageParam :(
            return StatusValue::newFatal( 'translate-messagebundle-validation-error', wfMessage( $e ) );
        }
    }

    /** @inheritDoc */
    protected function fillParserOutput(
        Content $content,
        ContentParseParams $cpoParams,
        ParserOutput &$parserOutput
    ) {
        if ( !$content instanceof MessageBundleContent ) {
            throw new InvalidArgumentException(
                'Expected $content to be MessageBundleContent; got: ' . get_class( $content )
            );
        }

        $label = $content->getMetadata()->getLabel();
        if ( $label !== null ) {
            $parserOutput->setDisplayTitle( $label );
        }

        if ( $cpoParams->getGenerateHtml() && $content->isValid() ) {
            /** @param $content JsonContent::class */
            $parserOutput->setRawText( $content->rootValueTable( $content->getData()->getValue() ) );
            $parserOutput->addModuleStyles( [ 'mediawiki.content.json' ] );
        } else {
            $parserOutput->setRawText( null );
        }
    }
}