Completed
Pull Request — master (#93)
by Michele
02:10
created

Po::convertString()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 12
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 12
rs 9.4285
cc 1
eloc 9
nc 1
nop 1
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)
13
    {
14
        $lines = array('msgid ""', 'msgstr ""');
15
16
        $headers = $translations->getHeaders();
17
        $headers['PO-Revision-Date'] = date('c');
18
19
        foreach ($headers as $name => $value) {
20
            $lines[] = '"'.$name.': '.$value.'\\n"';
21
        }
22
23
        $lines[] = '';
24
25
        //Translations
26
        foreach ($translations as $translation) {
27
            if ($translation->hasComments()) {
28
                foreach ($translation->getComments() as $comment) {
29
                    $lines[] = '# '.$comment;
30
                }
31
            }
32
33
            if ($translation->hasExtractedComments()) {
34
                foreach ($translation->getExtractedComments() as $comment) {
35
                    $lines[] = '#. '.$comment;
36
                }
37
            }
38
39
            if ($translation->hasReferences()) {
40
                foreach ($translation->getReferences() as $reference) {
41
                    $lines[] = '#: '.$reference[0].(!is_null($reference[1]) ? ':'.$reference[1] : null);
42
                }
43
            }
44
45
            if ($translation->hasFlags()) {
46
                $lines[] = '#, '.implode(',', $translation->getFlags());
47
            }
48
49
            if ($translation->hasContext()) {
50
                $lines[] = 'msgctxt '.self::convertString($translation->getContext());
51
            }
52
53
            self::addLines($lines, 'msgid', $translation->getOriginal());
54
            if ($translation->hasPlural()) {
55
                self::addLines($lines, 'msgid_plural', $translation->getPlural());
56
                self::addLines($lines, 'msgstr[0]', $translation->getTranslation());
57
58
                foreach ($translation->getPluralTranslation() 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
            array(
128
                "\x00" => '',
129
                '\\' => '\\\\',
130
                "\t" => '\t',
131
                "\n" => '\n',
132
            )
133
        ).'"';
134
    }
135
}
136