You are here

private function OEmbedFilter::embed in Gutenberg 8

Callback function to process each URL.

File

src/Plugin/Filter/OEmbedFilter.php, line 53

Class

OEmbedFilter
Class OEmbedFilter.

Namespace

Drupal\gutenberg\Plugin\Filter

Code

private function embed($match) {
  static $providers = [];
  if (empty($providers)) {
    $providers_string = $this->settings['oembed_providers'];
    $providers_line = explode("\n", $providers_string);
    foreach ($providers_line as $value) {
      $items = explode(" | ", $value);
      $key = array_shift($items);
      $providers[$key] = $items;
    }
  }
  $url = $match[2];
  foreach ($providers as $matchmask => $data) {
    list($providerurl, $regex) = $data;
    $regex = preg_replace('/\\s+/', '', $regex);
    if ($regex == 'false') {
      $regex = FALSE;
    }
    if (!$regex) {
      $matchmask = '#' . str_replace('___wildcard___', '(.+)', preg_quote(str_replace('*', '___wildcard___', $matchmask), '#')) . '#i';
    }
    if (preg_match($matchmask, $url)) {
      $provider = $providerurl;
      break;
    }
  }
  if ($regex === 'LOCAL' && !empty($provider)) {
    $output = $this
      ->getContents($provider, $url);
  }
  elseif (!empty($provider)) {
    $client = \Drupal::httpClient();
    $response = '';
    try {
      $request = $client
        ->get($provider . '?url=' . $url . '&origin=drupal&format=json&maxwidth=' . $this->settings['oembed_maxwidth']);
      $response = $request
        ->getBody();
    } catch (RequestException $e) {
      watchdog_exception('oembed', $e);
    } catch (\Throwable $e) {
      watchdog_exception('oembed', $e);
    }
    if (!empty($response)) {
      $embed = json_decode($response);
      if (!empty($embed->html)) {
        $output = $embed->html;
      }
      elseif ($embed->type == 'photo') {
        $output = '<img src="' . $embed->url . '" title="' . $embed->title . '" style="width: 100%" />';
        $output = '<a href="' . $url . '">' . $output . '</a>';
      }
    }
  }
  else {
    $client = \Drupal::httpClient();
    $response = '';
    try {
      $request = $client
        ->get(OEMBED_DEFAULT_PROVIDER . '?origin=drupal&url=' . $url);
      $response = $request
        ->getBody();
    } catch (RequestException $e) {
      watchdog_exception('oembed', $e);
    } catch (\Throwable $e) {
      watchdog_exception('oembed', $e);
    }
    if (!empty($response)) {
      $embed = json_decode($response);
      if (!empty($embed->html)) {
        $output = $embed->html;
      }
      elseif ($embed->type == 'photo') {
        $output = '<img src="' . $embed->url . '" title="' . $embed->title . '" style="width: 100%" />';
        $output = '<a href="' . $url . '">' . $output . '</a>';
      }
    }
  }
  $output = empty($output) ? $url : $output;
  if (count($match) > 3) {

    // Add <figure> and </figure> back.
    $output = $match[1] . $output . $match[3];
  }
  return $output;
}