CatalogueCompiler::compile()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 17
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 12
CRAP Score 3

Importance

Changes 3
Bugs 0 Features 2
Metric Value
eloc 13
c 3
b 0
f 2
dl 0
loc 17
rs 9.8333
ccs 12
cts 12
cp 1
cc 3
nc 3
nop 0
crap 3
1
<?php
2
declare(strict_types=1);
3
4
namespace Nexendrie\Translation;
5
6
use Nette\PhpGenerator\Dumper;
7
use Nette\Utils\FileSystem;
8
9
/**
10
 * CatalogueCompiler
11
 * Compiles messages catalogues from resources found by loader
12
 *
13
 * @author Jakub Konečný
14
 * @method void onCompile(CatalogueCompiler $compiler, string $language)
15
 */
16 1
final class CatalogueCompiler {
17
  use \Nette\SmartObject;
18
19
  private ILoader $loader;
20
  /** @var string[] */
21
  private array $languages = [];
22
  private string $folder = "";
23
  /** @var callable[] */
24
  public array $onCompile = [];
25
  
26
  /**
27
   * @param string[] $languages
28
   */
29
  public function __construct(ILoader $loader, string $folder, array $languages = []) {
30 1
    $this->loader = $loader;
31 1
    if(count($languages) === 0) {
32 1
      $languages = $loader->getAvailableLanguages();
33
    }
34 1
    $this->languages = $languages;
35 1
    $this->folder = $folder;
36 1
  }
37
  
38
  protected function getCatalogueFilename(string $language): string {
39 1
    return $this->folder . "/catalogue.$language.php";
40
  }
41
  
42
  protected function isCatalogueExpired(string $language): bool {
43 1
    $catalogueFilename = $this->getCatalogueFilename($language);
44 1
    if(!is_file($catalogueFilename)) {
45 1
      return true;
46
    }
47 1
    $catalogueInfo = new \SplFileInfo($catalogueFilename);
48 1
    $lastGenerated = $catalogueInfo->getCTime();
49 1
    foreach($this->loader->getResources() as $domain) {
50 1
      foreach($domain as $filename) {
51 1
        $fileinfo = new \SplFileInfo($filename);
52 1
        if($fileinfo->getMTime() > $lastGenerated) {
53
          return true;
54
        }
55
      }
56
    }
57 1
    return false;
58
  }
59
  
60
  /**
61
   * Compile catalogues
62
   */
63
  public function compile(): void {
64 1
    $lang = $this->loader->getLang();
65 1
    foreach($this->languages as $language) {
66 1
      $this->loader->setLang($language);
67 1
      $texts = $this->loader->getTexts();
68 1
      if(!$this->isCatalogueExpired($language)) {
69 1
        continue;
70
      }
71 1
      $texts["__resources"] = $this->loader->getResources();
72
      $content = "<?php
73 1
return " . (new Dumper())->dump($texts) . ";
74
?>";
75 1
      $filename = $this->getCatalogueFilename($language);
76 1
      FileSystem::write($filename, $content);
77 1
      $this->onCompile($this, $language);
78
    }
79 1
    $this->loader->setLang($lang);
80 1
  }
81
}
82
?>