You are here

class SoEmbedFilter in Simple oEmbed 8

Same name and namespace in other branches
  1. 8.2 src/Plugin/Filter/SoEmbedFilter.php \Drupal\soembed\Plugin\Filter\SoEmbedFilter

Plugin annotation


@Filter(
  id = "filter_soembed",
  title = @Translation("Simple oEmbed filter"),
  description = @Translation("Embeds media for URL that supports oEmbed standard."),
  settings = {
  "soembed_maxwidth" = 500,
  "soembed_replace_inline" = FALSE,
  "soembed_providers" = "#https?://(www\.)?youtube.com/watch.*#i | http://www.youtube.com/oembed | true
#https?://youtu\.be/.*#i | http://www.youtube.com/oembed | true
#https?://(www\.)?vimeo\.com/.*#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?://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

Expanded class hierarchy of SoEmbedFilter

File

src/Plugin/Filter/SoEmbedFilter.php, line 29

Namespace

Drupal\soembed\Plugin\Filter
View source
class SoEmbedFilter extends FilterBase {
  public function process($text, $langcode) {
    $lines = explode("\n", $text);
    if (!empty($this->settings['soembed_replace_inline'])) {

      // Match in-line urls. (First () in pattern is needed because the callback
      // expects the url in the second pair of parentheses).
      $lines = preg_replace_callback('#()(https?://[^\\s<]+)#', [
        $this,
        'embed',
      ], $lines);
    }
    else {
      $lines = preg_replace_callback('#^(<p>)?(https?://\\S+?)(</p>)?$#', [
        $this,
        'embed',
      ], $lines);
    }
    $text = implode("\n", $lines);
    return new FilterProcessResult($text);
  }

  /**
   * Callback function to process each URL
   */
  private function embed($match) {
    static $providers = [];
    if (empty($providers)) {
      $providers_string = $this->settings['soembed_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 (!empty($provider)) {
      if ($regex === 'LOCAL') {
        $output = $this
          ->getContents($provider, $url);
      }
      else {
        $client = \Drupal::httpClient();
        $response = '';
        try {
          $request = $client
            ->get($provider . '?url=' . $url . '&format=json&maxwidth=' . $this->settings['soembed_maxwidth']);
          $response = $request
            ->getBody();
        } catch (\Exception $e) {
          watchdog_exception('soembed', $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) {
      $output = $match[1] . $output . $match[3];

      // Add <p> and </p> back.
    }
    return $output;
  }

  /**
   * Locally create HTML after pattern study for sites that don't support oEmbed.
   */
  private function getContents($provider, $url) {
    $width = $this->settings['soembed_maxwidth'];
    switch ($provider) {
      case 'google-maps':

        //$url    = str_replace('&', '&amp;', $url); Though Google encodes ampersand, it seems to work without it.
        $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['soembed_providers'] = [
      '#type' => 'textarea',
      '#title' => $this
        ->t('Providers'),
      '#default_value' => $this->settings['soembed_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['soembed_maxwidth'] = [
      '#type' => 'textfield',
      '#title' => $this
        ->t('Maximum width of media embed'),
      '#default_value' => $this->settings['soembed_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.'),
    ];
    $form['soembed_replace_inline'] = [
      '#type' => 'checkbox',
      '#title' => $this
        ->t('Replace in-line URLs'),
      '#default_value' => $this->settings['soembed_replace_inline'],
      '#description' => $this
        ->t('If this option is checked, the filter will recognize URLs even when they are not on their own lines.'),
    ];
    return $form;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
DependencySerializationTrait::$_entityStorages protected property An array of entity type IDs keyed by the property name of their storages.
DependencySerializationTrait::$_serviceIds protected property An array of service IDs keyed by property name used for serialization.
DependencySerializationTrait::__sleep public function 1
DependencySerializationTrait::__wakeup public function 2
FilterBase::$provider public property The name of the provider that owns this filter.
FilterBase::$settings public property An associative array containing the configured settings of this filter.
FilterBase::$status public property A Boolean indicating whether this filter is enabled.
FilterBase::$weight public property The weight of this filter compared to others in a filter collection.
FilterBase::calculateDependencies public function Calculates dependencies for the configured plugin. Overrides DependentPluginInterface::calculateDependencies 1
FilterBase::defaultConfiguration public function Gets default configuration for this plugin. Overrides ConfigurableInterface::defaultConfiguration
FilterBase::getConfiguration public function Gets this plugin's configuration. Overrides ConfigurableInterface::getConfiguration
FilterBase::getDescription public function Returns the administrative description for this filter plugin. Overrides FilterInterface::getDescription
FilterBase::getHTMLRestrictions public function Returns HTML allowed by this filter's configuration. Overrides FilterInterface::getHTMLRestrictions 4
FilterBase::getLabel public function Returns the administrative label for this filter plugin. Overrides FilterInterface::getLabel
FilterBase::getType public function Returns the processing type of this filter plugin. Overrides FilterInterface::getType
FilterBase::prepare public function Prepares the text for processing. Overrides FilterInterface::prepare
FilterBase::setConfiguration public function Sets the configuration for this plugin instance. Overrides ConfigurableInterface::setConfiguration 1
FilterBase::tips public function Generates a filter's tip. Overrides FilterInterface::tips 9
FilterBase::__construct public function Constructs a \Drupal\Component\Plugin\PluginBase object. Overrides PluginBase::__construct 4
FilterInterface::TYPE_HTML_RESTRICTOR constant HTML tag and attribute restricting filters to prevent XSS attacks.
FilterInterface::TYPE_MARKUP_LANGUAGE constant Non-HTML markup language filters that generate HTML.
FilterInterface::TYPE_TRANSFORM_IRREVERSIBLE constant Irreversible transformation filters.
FilterInterface::TYPE_TRANSFORM_REVERSIBLE constant Reversible transformation filters.
MessengerTrait::$messenger protected property The messenger. 29
MessengerTrait::messenger public function Gets the messenger. 29
MessengerTrait::setMessenger public function Sets the messenger.
PluginBase::$configuration protected property Configuration information passed into the plugin. 1
PluginBase::$pluginDefinition protected property The plugin implementation definition. 1
PluginBase::$pluginId protected property The plugin_id.
PluginBase::DERIVATIVE_SEPARATOR constant A string which is used to separate base plugin IDs from the derivative ID.
PluginBase::getBaseId public function Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface::getBaseId
PluginBase::getDerivativeId public function Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface::getDerivativeId
PluginBase::getPluginDefinition public function Gets the definition of the plugin implementation. Overrides PluginInspectionInterface::getPluginDefinition 3
PluginBase::getPluginId public function Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface::getPluginId
PluginBase::isConfigurable public function Determines if the plugin is configurable.
SoEmbedFilter::embed private function Callback function to process each URL
SoEmbedFilter::getContents private function Locally create HTML after pattern study for sites that don't support oEmbed.
SoEmbedFilter::process public function Performs the filter processing. Overrides FilterInterface::process
SoEmbedFilter::settingsForm public function Define settings for text filter. Overrides FilterBase::settingsForm
StringTranslationTrait::$stringTranslation protected property The string translation service. 1
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.