refinery29/sitemap

View on GitHub
src/Writer/News/NewsWriter.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

/*
 * Copyright (c) 2016 Refinery29, Inc.
 *
 * For the full copyright and license information, please view
 * the LICENSE file that was distributed with this source code.
 */

namespace Refinery29\Sitemap\Writer\News;

use Refinery29\Sitemap\Component\News\NewsInterface;

/**
 * @link https://support.google.com/news/publisher/answer/74288?hl=en#exampleentry
 */
class NewsWriter
{
    /**
     * @var PublicationWriter
     */
    private $publicationWriter;

    public function __construct(PublicationWriter $publicationWriter = null)
    {
        $this->publicationWriter = $publicationWriter ?: new PublicationWriter();
    }

    public function write(NewsInterface $news, \XMLWriter $xmlWriter)
    {
        $xmlWriter->startElement('news:news');

        $this->publicationWriter->write($news->publication(), $xmlWriter);

        $this->writePublicationDate($xmlWriter, $news->publicationDate());
        $this->writeTitle($xmlWriter, $news->title());
        $this->writeAccess($xmlWriter, $news->access());
        $this->writeGenres($xmlWriter, $news->genres());
        $this->writeKeywords($xmlWriter, $news->keywords());
        $this->writeStockTickers($xmlWriter, $news->stockTickers());

        $xmlWriter->endElement();
    }

    private function writePublicationDate(\XMLWriter $xmlWriter, \DateTimeInterface $publicationDate)
    {
        $xmlWriter->startElement('news:publication_date');
        $xmlWriter->text($publicationDate->format('c'));
        $xmlWriter->endElement();
    }

    private function writeTitle(\XMLWriter $xmlWriter, $title)
    {
        $xmlWriter->startElement('news:title');
        $xmlWriter->text($title);
        $xmlWriter->endElement();
    }

    private function writeAccess(\XMLWriter $xmlWriter, $access = null)
    {
        if ($access === null) {
            return;
        }

        $xmlWriter->startElement('news:access');
        $xmlWriter->text($access);
        $xmlWriter->endElement();
    }

    private function writeGenres(\XMLWriter $xmlWriter, array $genres)
    {
        if (\count($genres) === 0) {
            return;
        }

        $xmlWriter->startElement('news:genres');
        $xmlWriter->text(\implode(', ', $genres));
        $xmlWriter->endElement();
    }

    private function writeKeywords(\XMLWriter $xmlWriter, array $keywords)
    {
        if (\count($keywords) === 0) {
            return;
        }

        $xmlWriter->startElement('news:keywords');
        $xmlWriter->text(\implode(', ', $keywords));
        $xmlWriter->endElement();
    }

    private function writeStockTickers(\XMLWriter $xmlWriter, array $stockTickers)
    {
        if (\count($stockTickers) === 0) {
            return;
        }

        $xmlWriter->startElement('news:stock_tickers');
        $xmlWriter->text(\implode(', ', $stockTickers));
        $xmlWriter->endElement();
    }
}