JamSpell   A
last analyzed

Complexity

Total Complexity 5

Size/Duplication

Total Lines 48
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
eloc 21
c 0
b 0
f 0
dl 0
loc 48
rs 10
wmc 5

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A check() 0 23 3
A getSupportedLanguages() 0 3 1
1
<?php
2
3
declare(strict_types=1);
4
5
namespace PhpSpellcheck\Spellchecker;
6
7
use Nyholm\Psr7\Factory\Psr17Factory;
8
use Nyholm\Psr7\Stream;
9
use PhpSpellcheck\Exception\RuntimeException;
10
use PhpSpellcheck\Misspelling;
11
use PhpSpellcheck\Utils\LineAndOffset;
12
use Psr\Http\Client\ClientInterface;
13
use Webmozart\Assert\Assert;
14
15
class JamSpell implements SpellcheckerInterface
16
{
17
    /**
18
     * @var ClientInterface
19
     */
20
    private $httpClient;
21
22
    /**
23
     * @var string
24
     */
25
    private $endpoint;
26
27
    public function __construct(ClientInterface $httpClient, string $endpoint)
28
    {
29
        $this->httpClient = $httpClient;
30
        $this->endpoint = $endpoint;
31
    }
32
33
    public function check(string $text, array $languages, array $context): iterable
34
    {
35
        $request = (new Psr17Factory())
36
            ->createRequest('POST', $this->endpoint)
37
            ->withBody(Stream::create($text));
38
39
        $spellcheckResponseAsArray = \Safe\json_decode($spellcheckResponse = $this->httpClient->sendRequest($request)->getBody()->getContents(), true);
40
        Assert::isArray($spellcheckResponseAsArray);
41
42
        // @TODO use json api validation schema
43
        if (!isset($spellcheckResponseAsArray['results'])) {
44
            throw new RuntimeException('Jamspell spellcheck HTTP response must include a "results" key. Response given: "'.$spellcheckResponse.'"');
45
        }
46
47
        foreach ($spellcheckResponseAsArray['results'] as $result) {
48
            [$line, $offset] = LineAndOffset::findFromFirstCharacterOffset($text, $result['pos_from']);
49
50
            yield new Misspelling(
51
                mb_substr($text, $result['pos_from'], $result['len']),
52
                $offset,
53
                $line,
54
                $result['candidates'],
55
                $context
56
            );
57
        }
58
    }
59
60
    public function getSupportedLanguages(): iterable
61
    {
62
        throw new RuntimeException('Jamspell doesn\'t provide a way to retrieve the language its actually supporting through its HTTP API. Rely on the language models it has been setup with.');
63
    }
64
}
65