class SoEmbedFilter in Simple oEmbed 8
Same name and namespace in other branches
- 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
- 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\soembed\Plugin\Filter\SoEmbedFilter
- class \Drupal\filter\Plugin\FilterBase implements FilterInterface
- class \Drupal\Core\Plugin\PluginBase uses DependencySerializationTrait, MessengerTrait, StringTranslationTrait
Expanded class hierarchy of SoEmbedFilter
File
- src/
Plugin/ Filter/ SoEmbedFilter.php, line 29
Namespace
Drupal\soembed\Plugin\FilterView 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('&', '&', $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
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. | |
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. | |
SoEmbedFilter:: |
private | function | Callback function to process each URL | |
SoEmbedFilter:: |
private | function | Locally create HTML after pattern study for sites that don't support oEmbed. | |
SoEmbedFilter:: |
public | function |
Performs the filter processing. Overrides FilterInterface:: |
|
SoEmbedFilter:: |
public | function |
Define settings for text filter. Overrides FilterBase:: |
|
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. |