Updated to Drupal 8.6.4, which is PHP 7.3 friendly. Also updated HTMLaw library....
[yaffs-website] / web / core / modules / media / src / OEmbed / Endpoint.php
1 <?php
2
3 namespace Drupal\media\OEmbed;
4
5 use Drupal\Component\Utility\UrlHelper;
6
7 /**
8  * Value object for oEmbed provider endpoints.
9  *
10  * @internal
11  *   This class is an internal part of the oEmbed system and should only be
12  *   instantiated by instances of Drupal\media\OEmbed\Provider.
13  */
14 class Endpoint {
15
16   /**
17    * The endpoint's URL.
18    *
19    * @var string
20    */
21   protected $url;
22
23   /**
24    * The provider this endpoint belongs to.
25    *
26    * @var \Drupal\media\OEmbed\Provider
27    */
28   protected $provider;
29
30   /**
31    * List of URL schemes supported by the provider.
32    *
33    * @var string[]
34    */
35   protected $schemes;
36
37   /**
38    * List of supported formats. Only 'json' and 'xml' are allowed.
39    *
40    * @var string[]
41    *
42    * @see https://oembed.com/#section2
43    */
44   protected $formats;
45
46   /**
47    * Whether the provider supports oEmbed discovery.
48    *
49    * @var bool
50    */
51   protected $supportsDiscovery;
52
53   /**
54    * Endpoint constructor.
55    *
56    * @param string $url
57    *   The endpoint URL. May contain a @code '{format}' @endcode placeholder.
58    * @param \Drupal\media\OEmbed\Provider $provider
59    *   The provider this endpoint belongs to.
60    * @param string[] $schemes
61    *   List of URL schemes supported by the provider.
62    * @param string[] $formats
63    *   List of supported formats. Can be "json", "xml" or both.
64    * @param bool $supports_discovery
65    *   Whether the provider supports oEmbed discovery.
66    *
67    * @throws \InvalidArgumentException
68    *   If the endpoint URL is empty.
69    */
70   public function __construct($url, Provider $provider, array $schemes = [], array $formats = [], $supports_discovery = FALSE) {
71     $this->provider = $provider;
72     $this->schemes = array_map('mb_strtolower', $schemes);
73
74     $this->formats = $formats = array_map('mb_strtolower', $formats);
75     // Assert that only the supported formats are present.
76     assert(array_diff($formats, ['json', 'xml']) == []);
77
78     // Use the first provided format to build the endpoint URL. If no formats
79     // are provided, default to JSON.
80     $this->url = str_replace('{format}', reset($this->formats) ?: 'json', $url);
81
82     if (!UrlHelper::isValid($this->url, TRUE) || !UrlHelper::isExternal($this->url)) {
83       throw new \InvalidArgumentException('oEmbed endpoint must have a valid external URL');
84     }
85
86     $this->supportsDiscovery = (bool) $supports_discovery;
87   }
88
89   /**
90    * Returns the endpoint URL.
91    *
92    * The URL will be built with the first available format. If the endpoint
93    * does not provide any formats, JSON will be used.
94    *
95    * @return string
96    *   The endpoint URL.
97    */
98   public function getUrl() {
99     return $this->url;
100   }
101
102   /**
103    * Returns the provider this endpoint belongs to.
104    *
105    * @return \Drupal\media\OEmbed\Provider
106    *   The provider object.
107    */
108   public function getProvider() {
109     return $this->provider;
110   }
111
112   /**
113    * Returns list of URL schemes supported by the provider.
114    *
115    * @return string[]
116    *   List of schemes.
117    */
118   public function getSchemes() {
119     return $this->schemes;
120   }
121
122   /**
123    * Returns list of supported formats.
124    *
125    * @return string[]
126    *   List of formats.
127    */
128   public function getFormats() {
129     return $this->formats;
130   }
131
132   /**
133    * Returns whether the provider supports oEmbed discovery.
134    *
135    * @return bool
136    *   Returns TRUE if the provides discovery, otherwise FALSE.
137    */
138   public function supportsDiscovery() {
139     return $this->supportsDiscovery;
140   }
141
142   /**
143    * Tries to match a URL against the endpoint schemes.
144    *
145    * @param string $url
146    *   Media item URL.
147    *
148    * @return bool
149    *   TRUE if the URL matches against the endpoint schemes, otherwise FALSE.
150    */
151   public function matchUrl($url) {
152     foreach ($this->getSchemes() as $scheme) {
153       // Convert scheme into a valid regular expression.
154       $regexp = str_replace(['.', '*'], ['\.', '.*'], $scheme);
155       if (preg_match("|^$regexp$|", $url)) {
156         return TRUE;
157       }
158     }
159     return FALSE;
160   }
161
162   /**
163    * Builds and returns the endpoint URL.
164    *
165    * @param string $url
166    *   The canonical media URL.
167    *
168    * @return string
169    *   URL of the oEmbed endpoint.
170    */
171   public function buildResourceUrl($url) {
172     $query = ['url' => $url];
173     return $this->getUrl() . '?' . UrlHelper::buildQuery($query);
174   }
175
176 }