class OEmbedFilter in Gutenberg 8
Class OEmbedFilter.
Plugin annotation
@Filter(
  id = "filter_oembed",
  title = @Translation("Gutenberg oEmbed filter"),
  description = @Translation("Embeds media for URL that supports oEmbed standard."),
  settings = {
  "oembed_maxwidth" = 800,
  "oembed_providers" = "#https?://(www\.)?youtube.com/watch.*#i | http://www.youtube.com/oembed | true
#https?://youtu\.be/\w*#i | http://www.youtube.com/oembed | true
#https?://(www\.)?vimeo\.com/\w*#i | http://vimeo.com/api/oembed.json | true
#http://(www\.)?hulu\.com/watch/.*#i | http://www.hulu.com/api/oembed.json | true
#https?://(www\.)?twitter.com/.+?/status(es)?/.*#i | https://api.twitter.com/1/statuses/oembed.json | true
#https?://(www\.)?instagram.com/p/.*#i | https://api.instagram.com/oembed | true
#https?:\/\/(www\.)?google\.com\/maps\/embed\?pb\=.*#i | http://open.iframe.ly/api/oembed | true
#https?://maps.google.com/maps.*#i | google-maps | LOCAL
#https?://docs.google.com/(document|spreadsheet)/.*#i | google-docs | LOCAL"
  },
  type = Drupal\filter\Plugin\FilterInterface::TYPE_MARKUP_LANGUAGE,
)
Hierarchy
- class \Drupal\Component\Plugin\PluginBase implements DerivativeInspectionInterface, PluginInspectionInterface- class \Drupal\Core\Plugin\PluginBase uses DependencySerializationTrait, MessengerTrait, StringTranslationTrait- class \Drupal\filter\Plugin\FilterBase implements FilterInterface- class \Drupal\gutenberg\Plugin\Filter\OEmbedFilter
 
 
- class \Drupal\filter\Plugin\FilterBase implements FilterInterface
 
- class \Drupal\Core\Plugin\PluginBase uses DependencySerializationTrait, MessengerTrait, StringTranslationTrait
Expanded class hierarchy of OEmbedFilter
File
- src/Plugin/ Filter/ OEmbedFilter.php, line 34 
Namespace
Drupal\gutenberg\Plugin\FilterView source
class OEmbedFilter extends FilterBase {
  /**
   * Process each URL.
   */
  public function process($text, $langcode) {
    $blocks = preg_split('/^.?(\\n)?$/m', $text);
    $blocks = preg_replace_callback('/^(<figure.*?class=".*wp-block-embed.*">)\\s*(https?:\\/\\/\\S+?)\\s*(.*?<\\/figure>)?$/m', [
      $this,
      'embed',
    ], $blocks);
    $text = implode("\n", $blocks);
    return new FilterProcessResult($text);
  }
  /**
   * Callback function to process each URL.
   */
  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;
  }
  /**
   * Get contents.
   *
   * Locally create HTML after pattern study for sites that don't support
   * oEmbed.
   */
  private function getContents($provider, $url) {
    $width = $this->settings['oembed_maxwidth'];
    switch ($provider) {
      case 'google-maps':
        $height = (int) ($width / 1.3);
        $embed = "<iframe width='{$width}' height='{$height}' frameborder='0' scrolling='no' marginheight='0' marginwidth='0' src='{$url}&output=embed'></iframe><br /><small><a href='{$url}&source=embed' style='color:#0000FF;text-align:left'>View Larger Map</a></small>";
        break;
      case 'google-docs':
        $height = (int) ($width * 1.5);
        $embed = "<iframe width='{$width}' height='{$height}' frameborder='0' src='{$url}&widget=true'></iframe>";
        break;
      default:
        $embed = $url;
    }
    return $embed;
  }
  /**
   * Define settings for text filter.
   */
  public function settingsForm(array $form, FormStateInterface $form_state) {
    $form['oembed_providers'] = [
      '#type' => 'textarea',
      '#title' => $this
        ->t('Providers'),
      '#default_value' => $this->settings['oembed_providers'],
      '#description' => $this
        ->t('A list of oEmbed providers. Add your own by adding a new line and using this pattern: [Url to match] | [oEmbed endpoint] | [Use regex (true or false)]'),
    ];
    $form['oembed_maxwidth'] = [
      '#type' => 'textfield',
      '#title' => $this
        ->t('Maximum width of media embed'),
      '#default_value' => $this->settings['oembed_maxwidth'],
      '#description' => $this
        ->t('Set the maximum width of an embedded media. The unit is in pixels, but only put a number in the textbox.'),
    ];
    return $form;
  }
}Members
| Name   | Modifiers | Type | Description | Overrides | 
|---|---|---|---|---|
| DependencySerializationTrait:: | protected | property | An array of entity type IDs keyed by the property name of their storages. | |
| DependencySerializationTrait:: | protected | property | An array of service IDs keyed by property name used for serialization. | |
| DependencySerializationTrait:: | public | function | 1 | |
| DependencySerializationTrait:: | public | function | 2 | |
| FilterBase:: | public | property | The name of the provider that owns this filter. | |
| FilterBase:: | public | property | An associative array containing the configured settings of this filter. | |
| FilterBase:: | public | property | A Boolean indicating whether this filter is enabled. | |
| FilterBase:: | public | property | The weight of this filter compared to others in a filter collection. | |
| FilterBase:: | public | function | Calculates dependencies for the configured plugin. Overrides DependentPluginInterface:: | 1 | 
| FilterBase:: | public | function | Gets default configuration for this plugin. Overrides ConfigurableInterface:: | |
| FilterBase:: | public | function | Gets this plugin's configuration. Overrides ConfigurableInterface:: | |
| FilterBase:: | public | function | Returns the administrative description for this filter plugin. Overrides FilterInterface:: | |
| FilterBase:: | public | function | Returns HTML allowed by this filter's configuration. Overrides FilterInterface:: | 4 | 
| FilterBase:: | public | function | Returns the administrative label for this filter plugin. Overrides FilterInterface:: | |
| FilterBase:: | public | function | Returns the processing type of this filter plugin. Overrides FilterInterface:: | |
| FilterBase:: | public | function | Prepares the text for processing. Overrides FilterInterface:: | |
| FilterBase:: | public | function | Sets the configuration for this plugin instance. Overrides ConfigurableInterface:: | 1 | 
| FilterBase:: | public | function | Generates a filter's tip. Overrides FilterInterface:: | 9 | 
| FilterBase:: | public | function | Constructs a \Drupal\Component\Plugin\PluginBase object. Overrides PluginBase:: | 4 | 
| FilterInterface:: | constant | HTML tag and attribute restricting filters to prevent XSS attacks. | ||
| FilterInterface:: | constant | Non-HTML markup language filters that generate HTML. | ||
| FilterInterface:: | constant | Irreversible transformation filters. | ||
| FilterInterface:: | constant | Reversible transformation filters. | ||
| MessengerTrait:: | protected | property | The messenger. | 29 | 
| MessengerTrait:: | public | function | Gets the messenger. | 29 | 
| MessengerTrait:: | public | function | Sets the messenger. | |
| OEmbedFilter:: | private | function | Callback function to process each URL. | |
| OEmbedFilter:: | private | function | Get contents. | |
| OEmbedFilter:: | public | function | Process each URL. Overrides FilterInterface:: | |
| OEmbedFilter:: | public | function | Define settings for text filter. Overrides FilterBase:: | |
| PluginBase:: | protected | property | Configuration information passed into the plugin. | 1 | 
| PluginBase:: | protected | property | The plugin implementation definition. | 1 | 
| PluginBase:: | protected | property | The plugin_id. | |
| PluginBase:: | constant | A string which is used to separate base plugin IDs from the derivative ID. | ||
| PluginBase:: | public | function | Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface:: | |
| PluginBase:: | public | function | Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface:: | |
| PluginBase:: | public | function | Gets the definition of the plugin implementation. Overrides PluginInspectionInterface:: | 3 | 
| PluginBase:: | public | function | Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface:: | |
| PluginBase:: | public | function | Determines if the plugin is configurable. | |
| StringTranslationTrait:: | protected | property | The string translation service. | 1 | 
| StringTranslationTrait:: | protected | function | Formats a string containing a count of items. | |
| StringTranslationTrait:: | protected | function | Returns the number of plurals supported by a given language. | |
| StringTranslationTrait:: | protected | function | Gets the string translation service. | |
| StringTranslationTrait:: | public | function | Sets the string translation service to use. | 2 | 
| StringTranslationTrait:: | protected | function | Translates a string to the current language or to a given language. | 
