Completed
Push — master ( cf1346...b28e72 )
by Faiz
01:57
created

Quran::getSource()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 4
rs 10
ccs 0
cts 2
cp 0
cc 1
eloc 2
nc 1
nop 0
crap 2
1
<?php
2
3
namespace FaizShukri\Quran;
4
5
use FaizShukri\Quran\Repositories\Source\SourceInterface;
6
use FaizShukri\Quran\Exceptions\AyahNotProvided;
7
use FaizShukri\Quran\Exceptions\WrongArgument;
8
use FaizShukri\Quran\Repositories\Source\XMLRepository;
9
use FaizShukri\Quran\Supports\Config;
10
11
class Quran
12
{
13
    /**
14
     * Quran application version.
15
     *
16
     * @var string
17
     */
18
    const VERSION = 'v0.3.9';
19
20
    private $config;
21
22
    private $translations = ['ar'];
23
24
    private $source;
25
26 66
    public function __construct(array $config = array())
27
    {
28 66
        $this->config = new Config($config);
29
30
        // By default, source is XML
31 66
        $this->setSource( new XMLRepository() );
32 66
    }
33
34
    /**
35
     * Set quran source either XML, Sql
36
     *
37
     * @param \FaizShukri\Quran\Repositories\Source\SourceInterface $source
38
     */
39 66
    public function setSource(SourceInterface $source)
40
    {
41 66
        $this->source = $source;
42 66
        $this->source->setConfig( $this->config );
43 66
        $this->source->initialize();
44 66
    }
45
46
    /**
47
     * Get source variable
48
     *
49
     * @return \FaizShukri\Quran\Repositories\Source\SourceInterface $source
50
     */
51
    public function getSource()
52
    {
53
        return $this->source;
54
    }
55
56
    /**
57
     * Set translations to be used
58
     *
59
     * @param array|string $translations
60
     *
61
     * @return self
62
     */
63 27
    public function translation($translations)
64 3
    {
65 27
        if (is_array($translations)) {
66 3
            $this->translations = $translations;
67 3
        } else {
68 24
            $this->translations = explode(',', str_replace(' ', '', $translations));
69
        }
70
71 27
        return $this;
72
    }
73
74
    /**
75
     * Get ayah.
76
     *
77
     * @param string $args String of supported format of ayah
78
     *
79
     * @return string|array Ayah
80
     *
81
     * @throws AyahNotProvided
82
     * @throws WrongArgument
83
     */
84 57
    public function get($args)
85
    {
86 57
        $args = explode(':', $args);
87 57
        $result = [];
88
89 57
        if (sizeof($args) <= 1) {
90 6
            throw new AyahNotProvided();
91
        }
92
93
        // Get text for all translation
94 51
        foreach ($this->translations as $translation) {
95
96
            // Parse ayah arguments into array of ayah
97 51
            $ayah = $this->parseSurah($args[1]);
98
99
            // Check if Surah and Ayah is in correct format
100 51
            if (!is_numeric($args[0]) || sizeof($ayah) === 0) {
101 9
                throw new WrongArgument();
102
            }
103
104 42
            $result[$translation] = $this->source->ayah($args[0], $ayah, $translation);
105 39
        }
106
107 42
        return $this->minimize($result);
108
    }
109
110
    /**
111
     * Get array of chapters information
112
     *
113
     * @return array Array of object for each chapter
114
     */
115 3
    public function chapters()
116
    {
117 3
        return $this->source->chapters();
118
    }
119
120
    /**
121
     * Get single chapter information
122
     *
123
     * @return object Chapter information of a chapter
124
     */
125 3
    public function chapter($chapter)
126
    {
127 3
        return $this->source->chapter($chapter);
128
    }
129
130
    /**
131
     * Parse the ayah requested of a certain surah. The format of ayah will
132
     * be translated into an array or ayah.
133
     *
134
     * @param string $surah
135
     *
136
     * @return array Array of ayah
137
     */
138 51
    private function parseSurah($surah)
139
    {
140 51
        $result = [];
141
142 51
        foreach (explode(',', $surah) as $comma) {
143
144 51
            $dash = explode('-', $comma);
145
146
            // Skip any invalid ayah
147 51
            if (!is_numeric($dash[0]) || (isset($dash[1]) && !is_numeric($dash[1]))) {
148 9
                continue;
149
            }
150
151
            // Single ayah, just push it into array.
152 45
            if (sizeof($dash) === 1) {
153 39
                array_push($result, intval($dash[0]));
154 39
            } // Range ayah, so we create all ayah in between.
155
            else {
156 18
                for ($i = $dash[0]; $i <= $dash[1]; $i++) {
157 18
                    array_push($result, intval($i));
158 18
                }
159
            }
160 51
        }
161
162 51
        return $result;
163
    }
164
165
    /**
166
     * Sort array in ascending by it's key.
167
     *
168
     * @param array $arr
169
     *
170
     * @return array
171
     */
172 24
    private function sortArray(array $arr)
173
    {
174 24
        ksort($arr, SORT_NUMERIC);
175 24
        return $arr;
176
    }
177
178
    /**
179
     * Reduce the array level by remove unnecessary parent.
180
     *
181
     * @param array $array
182
     *
183
     * @return array
184
     */
185 39
    private function minimize(array $array)
186
    {
187 39
        foreach ($array as $key => $translation) {
188
189
            // If one ayah is requested, we remove it's key
190 39
            if (sizeof($translation) === 1) {
191 15
                $array[$key] = $translation[key($translation)];
192 15
            } // Else we maintain current format, but in sorted form
193
            else {
194 24
                $array[$key] = $this->sortArray($translation);
195
            }
196 39
        }
197
198
        // If one translation is requested, we remove it's key.
199
        // Else just return the current format
200 39
        return (sizeof($array) > 1) ? $array : $array[key($array)];
201
    }
202
203
    /**
204
     * Get the Quran Application version
205
     *
206
     * @return string
207
     */
208 3
    public static function version()
209
    {
210 3
        return static::VERSION;
211
    }
212
213
}
214