Completed
Push — master ( b7a681...e792b8 )
by Jakub
01:59
created

RssCore::getName()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 2
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 2
ccs 0
cts 1
cp 0
crap 2
rs 10
1
<?php
2
declare(strict_types=1);
3
4
namespace Nexendrie\Rss\Extensions;
5
6
use Nette\Utils\Arrays;
7
use Nexendrie\Rss\CategoriesCollection;
8
use Nexendrie\Rss\Category;
9
use Nexendrie\Rss\Cloud;
10
use Nexendrie\Rss\EnclosuresCollection;
11
use Nexendrie\Rss\Generator;
12
use Nexendrie\Rss\GenericElement;
13
use Nexendrie\Rss\Image;
14
use Nexendrie\Rss\IRssExtension;
15
use Nexendrie\Rss\SkipDaysCollection;
16
use Nexendrie\Rss\SkipHoursCollection;
17
use Nexendrie\Rss\Source;
18
use Nexendrie\Rss\TextInput;
19
use Nexendrie\Utils\Numbers;
20
use Symfony\Component\OptionsResolver\Options;
21
use Symfony\Component\OptionsResolver\OptionsResolver;
22
23
/**
24
 * RssCore
25
 *
26
 * @author Jakub Konečný
27
 * @internal
28
 */
29 1
final class RssCore implements IRssExtension {
30 1
  use \Nette\SmartObject;
31
32
  public function getName(): string {
33
    return "";
34
  }
35
36
  public function getNamespace(): string {
37
    return "";
38
  }
39
40
  public function configureChannelOptions(OptionsResolver $resolver, Generator $generator): void {
41 1
    $resolver->setRequired(["title", "description", "link", "lastBuildDate", ]);
42 1
    $resolver->setAllowedTypes("title", "string");
43 1
    $resolver->setAllowedTypes("description", "string");
44 1
    $resolver->setAllowedTypes("link", "string");
45 1
    $resolver->setAllowedTypes("lastBuildDate", "callable");
46 1
    $resolver->setDefault("lastBuildDate", "time");
47 1
    $resolver->setNormalizer("lastBuildDate", function(Options $options, callable $value) use($generator) {
48 1
      $value = call_user_func($value);
49 1
      if(!is_int($value)) {
50 1
        throw new \InvalidArgumentException("Callback for last build date for RSS generator has to return integer.");
51
      }
52 1
      $value = date($generator->dateTimeFormat, $value);
53 1
      return new GenericElement("lastBuildDate", $value);
54 1
    });
55 1
    $resolver->setDefined([
56 1
      "language", "copyright", "managingEditor", "webMaster", "ttl",  "pubDate", "rating", "categories", "skipDays",
57
      "skipHours", "image", "cloud", "textInput",
58
    ]);
59 1
    $resolver->setAllowedTypes("language", "string");
60 1
    $resolver->setAllowedTypes("copyright", "string");
61 1
    $resolver->setAllowedTypes("managingEditor", "string");
62 1
    $resolver->setAllowedTypes("webMaster", "string");
63 1
    $resolver->setAllowedTypes("ttl", "int");
64 1
    $resolver->setAllowedValues("ttl", function(int $value) {
65 1
      return ($value >= 0);
66 1
    });
67 1
    $resolver->setAllowedTypes("pubDate", "callable");
68 1
    $resolver->setNormalizer("pubDate", function(Options $options, callable $value) use($generator) {
69 1
      $value = call_user_func($value);
70 1
      if(!is_int($value)) {
71 1
        throw new \InvalidArgumentException("Callback for pub date for RSS generator has to return integer.");
72
      }
73 1
      $value = date($generator->dateTimeFormat, $value);
74 1
      return new GenericElement("pubDate", $value);
75 1
    });
76 1
    $resolver->setAllowedTypes("rating", "string");
77 1
    $resolver->setAllowedTypes("categories", Category::class . "[]");
78 1
    $resolver->setNormalizer("categories", function(Options $options, array $value) {
79 1
      return CategoriesCollection::fromArray($value);
80 1
    });
81 1
    $resolver->setAllowedTypes("skipDays", "string[]");
82 1
    $resolver->setAllowedValues("skipDays", function(array $value) {
83 1
      $allowedValues = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday", ];
84 1
      return Arrays::every($value, function(string $value) use($allowedValues) {
85 1
        return in_array($value, $allowedValues, true);
86 1
      });
87 1
    });
88 1
    $resolver->setNormalizer("skipDays", function(Options $options, array $value) {
89 1
      return new SkipDaysCollection($value);
90 1
    });
91 1
    $resolver->setAllowedTypes("skipHours", "int[]");
92 1
    $resolver->setAllowedValues("skipHours", function(array $value) {
93 1
      return Arrays::every($value, function(int $value) {
94 1
        return Numbers::isInRange($value, 0, 23);
95 1
      });
96 1
    });
97 1
    $resolver->setNormalizer("skipHours", function(Options $options, array $value) {
98 1
      return new SkipHoursCollection($value);
99 1
    });
100 1
    $resolver->setAllowedTypes("image", Image::class);
101 1
    $resolver->setAllowedTypes("cloud", Cloud::class);
102 1
    $resolver->setAllowedTypes("textInput", TextInput::class);
103 1
  }
104
105
  public function configureItemOptions(OptionsResolver $resolver, Generator $generator): void {
106 1
    $resolver->setRequired(["title", "description", "link", ]);
107 1
    $resolver->setAllowedTypes("title", "string");
108 1
    $resolver->setAllowedTypes("description", "string");
109 1
    $resolver->setNormalizer("description", function(Options $options, string $value) use($generator) {
110 1
      return $this->shortenDescription($value, $generator->shortenDescription);
111 1
    });
112 1
    $resolver->setAllowedTypes("link", "string");
113 1
    $resolver->setDefined([
114 1
      "pubDate", "author", "comments", "guid", "source", "categories", "enclosures",
115
    ]);
116 1
    $resolver->setAllowedTypes("pubDate", "int");
117 1
    $resolver->setNormalizer("pubDate", function(Options $options, int $value) use($generator) {
118 1
      return date($generator->dateTimeFormat, $value);
119 1
    });
120 1
    $resolver->setAllowedTypes("author", "string");
121 1
    $resolver->setAllowedTypes("comments", "string");
122 1
    $resolver->setAllowedTypes("guid", "string");
123 1
    $resolver->setAllowedTypes("source", Source::class);
124 1
    $resolver->setAllowedTypes("categories", CategoriesCollection::class);
125 1
    $resolver->setAllowedTypes("enclosures", EnclosuresCollection::class);
126 1
  }
127
128
  protected function shortenDescription(string $description, int $maxLength): string {
129 1
    if($maxLength < 1) {
130 1
      return $description;
131
    }
132 1
    $originalDescription = $description;
133 1
    $description = substr($description, 0, $maxLength);
134 1
    if($description !== $originalDescription) {
135 1
      $description .= "...";
136
    }
137 1
    return $description;
138
  }
139
}
140
?>