MAXakaWIZARD/PoParser

View on GitHub
src/Writer.php

Summary

Maintainability
A
1 hr
Test Coverage
<?php

namespace PoParser;

use Exception;

class Writer
{
    /**
     * @param string $filePath
     * @param array $entries
     *
     * @throws Exception
     */
    public function write($filePath, array $entries)
    {
        $handle = $this->openFile($filePath);

        $entriesCount = count($entries);
        $counter = 0;
        foreach ($entries as $entry) {
            $entryStr = $this->getEntryStr($entry, $counter, $entriesCount);
            fwrite($handle, $entryStr);

            $counter++;
        }

        fclose($handle);
    }

    /**
     * @param string $filePath
     * @throws Exception
     * @return resource
     */
    protected function openFile($filePath)
    {
        if (empty($filePath)) {
            throw new Exception('Output file not defined.');
        }

        $handle = @fopen($filePath, 'wb');
        if (false === $handle) {
            throw new Exception("Unable to open file for writing: {$filePath}");
        }

        return $handle;
    }

    /**
     * @param array $entry
     *
     * @return string
     */
    protected function getEntryStr(array $entry, $index, $entriesCount)
    {
        $result = '';
        if ($index > 0) {
            $result = "\n";
        }

        $result .= $this->writeComments($entry);
        $result .= $this->writeReferences($entry);
        $result .= $this->writeFlags($entry);
        $result .= $this->writeContext($entry);
        $result .= $this->writeObsolete($entry);
        $result .= $this->writeMsgId($entry, 'msgid');
        $result .= $this->writeMsgId($entry, 'msgid_plural');
        $result .= $this->writeMsgStr($entry);

        if ($index == $entriesCount - 1) {
            $result = rtrim($result);
        }

        return $result;
    }

    /**
     * @param array $entry
     *
     * @return string
     */
    protected function writeComments(array $entry)
    {
        $result = '';

        if ($entry['tcomment'] !== '') {
            $result .= "# " . $entry['tcomment'] . "\n";
        }

        if ($entry['ccomment'] !== '') {
            $result .= '#. ' . $entry['ccomment'] . "\n";
        }

        return $result;
    }

    /**
     * @param array $entry
     *
     * @return string
     */
    protected function writeFlags(array $entry)
    {
        $result = '';

        if (count($entry['flags']) > 0) {
            $result .= "#, " . implode(', ', $entry['flags']) . "\n";
        }

        if (isset($entry['@'])) {
            $result .= "#@ " . $entry['@'] . "\n";
        }

        return $result;
    }

    /**
     * @param array $entry
     *
     * @return string
     */
    protected function writeReferences(array $entry)
    {
        $result = '';

        if (count($entry['references']) > 0) {
            foreach ($entry['references'] as $ref) {
                $result .= '#: ' . $ref . "\n";
            }
        }

        return $result;
    }

    /**
     * @param array $entry
     *
     * @return string
     */
    protected function writeContext(array $entry)
    {
        $result = '';

        if ($entry['msgctxt'] !== '') {
            $result .= 'msgctxt ' . $this->cleanExport($entry['msgctxt']) . "\n";
        }

        return $result;
    }

    /**
     * @param array $entry
     *
     * @return string
     */
    protected function writeObsolete(array $entry)
    {
        return ($entry['obsolete']) ? "#~ " : '';
    }

    /**
     * @param array $entry
     * @param string $type msgid or msgid_plural
     *
     * @return string
     */
    protected function writeMsgId(array $entry, $type = 'msgid')
    {
        $result = '';

        if (!isset($entry[$type])) {
            return $result;
        }

        $result .= $type . ' ';
        if (is_array($entry[$type])) {
            foreach ($entry[$type] as $id) {
                $result .= $this->cleanExport($id) . "\n";
            }
        } else {
            $result .= $this->cleanExport($entry[$type]) . "\n";
        }

        return $result;
    }

    /**
     * @param array $entry
     *
     * @return string
     */
    protected function writeMsgStr(array $entry)
    {
        $result = '';

        if (!isset($entry['msgstr'])) {
            return $result;
        }

        $isPlural = isset($entry['msgid_plural']);

        foreach ($entry['msgstr'] as $i => $value) {
            if ($entry['obsolete']) {
                $result .= "#~ ";
            }

            if ($isPlural) {
                $result .= "msgstr[$i] ";
            } else {
                if ($i == 0) {
                    $result .= 'msgstr ';
                }
            }

            $result .= $this->cleanExport($value) . "\n";
        }

        return $result;
    }

    /**
     * @param $string
     *
     * @return mixed
     */
    protected function cleanExport($string)
    {
        $quote = '"';
        $slash = '\\';
        $newline = "\n";

        $replaces = array(
            "$slash" => "$slash$slash",
            "$quote" => "$slash$quote",
            "\t"     => '\t',
        );

        $string = str_replace(array_keys($replaces), array_values($replaces), $string);

        $po = $quote . implode("${slash}n$quote$newline$quote", explode($newline, $string)) . $quote;

        // remove empty strings
        return str_replace("$newline$quote$quote", '', $po);
    }
}