Completed
Push — master ( a8154f...2042ea )
by Oscar
02:07
created

Po::toString()   D

Complexity

Conditions 15
Paths 260

Size

Total Lines 58
Code Lines 31

Duplication

Lines 0
Ratio 0 %

Importance

Changes 6
Bugs 3 Features 0
Metric Value
cc 15
eloc 31
c 6
b 3
f 0
nc 260
nop 2
dl 0
loc 58
rs 4.7492

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
namespace Gettext\Generators;
4
5
use Gettext\Translations;
6
7
class Po extends Generator implements GeneratorInterface
8
{
9
    /**
10
     * {@parentDoc}.
11
     */
12
    public static function toString(Translations $translations, array $options = [])
13
    {
14
        $pluralForm = $translations->getPluralForms();
15
        $pluralSize = is_array($pluralForm) ? ($pluralForm[0] - 1) : null;
16
        $lines = ['msgid ""', 'msgstr ""'];
17
18
        foreach ($translations->getHeaders() as $name => $value) {
19
            $lines[] = sprintf('"%s: %s\\n"', $name, $value);
20
        }
21
22
        $lines[] = '';
23
24
        //Translations
25
        foreach ($translations as $translation) {
26
            if ($translation->hasComments()) {
27
                foreach ($translation->getComments() as $comment) {
28
                    $lines[] = '# '.$comment;
29
                }
30
            }
31
32
            if ($translation->hasExtractedComments()) {
33
                foreach ($translation->getExtractedComments() as $comment) {
34
                    $lines[] = '#. '.$comment;
35
                }
36
            }
37
38
            if ($translation->hasReferences()) {
39
                foreach ($translation->getReferences() as $reference) {
40
                    $lines[] = '#: '.$reference[0].(!is_null($reference[1]) ? ':'.$reference[1] : null);
41
                }
42
            }
43
44
            if ($translation->hasFlags()) {
45
                $lines[] = '#, '.implode(',', $translation->getFlags());
46
            }
47
48
            if ($translation->hasContext()) {
49
                $lines[] = 'msgctxt '.self::convertString($translation->getContext());
50
            }
51
52
            self::addLines($lines, 'msgid', $translation->getOriginal());
53
54
            if ($translation->hasPlural()) {
55
                self::addLines($lines, 'msgid_plural', $translation->getPlural());
56
                self::addLines($lines, 'msgstr[0]', $translation->getTranslation());
57
58
                foreach ($translation->getPluralTranslations($pluralSize) as $k => $v) {
59
                    self::addLines($lines, 'msgstr['.($k + 1).']', $v);
60
                }
61
            } else {
62
                self::addLines($lines, 'msgstr', $translation->getTranslation());
63
            }
64
65
            $lines[] = '';
66
        }
67
68
        return implode("\n", $lines);
69
    }
70
71
    /**
72
     * Escapes and adds double quotes to a string.
73
     *
74
     * @param string $string
75
     *
76
     * @return string
77
     */
78
    private static function multilineQuote($string)
79
    {
80
        $lines = explode("\n", $string);
81
        $last = count($lines) - 1;
82
83
        foreach ($lines as $k => $line) {
84
            if ($k === $last) {
85
                $lines[$k] = self::convertString($line);
86
            } else {
87
                $lines[$k] = self::convertString($line."\n");
88
            }
89
        }
90
91
        return $lines;
92
    }
93
94
    /**
95
     * Add one or more lines depending whether the string is multiline or not.
96
     *
97
     * @param array  &$lines
98
     * @param string $name
99
     * @param string $value
100
     */
101
    private static function addLines(array &$lines, $name, $value)
102
    {
103
        $newLines = self::multilineQuote($value);
104
105
        if (count($newLines) === 1) {
106
            $lines[] = $name.' '.$newLines[0];
107
        } else {
108
            $lines[] = $name.' ""';
109
110
            foreach ($newLines as $line) {
111
                $lines[] = $line;
112
            }
113
        }
114
    }
115
116
    /**
117
     * Convert a string to its PO representation.
118
     *
119
     * @param string $value
120
     *
121
     * @return string
122
     */
123
    public static function convertString($value)
124
    {
125
        return '"'.strtr(
126
            $value,
127
            [
128
                "\x00" => '',
129
                '\\' => '\\\\',
130
                "\t" => '\t',
131
                "\n" => '\n',
132
                '"' => '\\"',
133
            ]
134
        ).'"';
135
    }
136
}
137