FilterCaption.php in Zircon Profile 8.0
File
core/modules/filter/src/Plugin/Filter/FilterCaption.php
View source
<?php
namespace Drupal\filter\Plugin\Filter;
use Drupal\Component\Utility\Html;
use Drupal\Component\Utility\Unicode;
use Drupal\Component\Utility\Xss;
use Drupal\filter\FilterProcessResult;
use Drupal\filter\Plugin\FilterBase;
use Drupal\filter\Render\FilteredMarkup;
class FilterCaption extends FilterBase {
public function process($text, $langcode) {
$result = new FilterProcessResult($text);
if (stristr($text, 'data-caption') !== FALSE) {
$dom = Html::load($text);
$xpath = new \DOMXPath($dom);
foreach ($xpath
->query('//*[@data-caption]') as $node) {
$caption = Html::escape($node
->getAttribute('data-caption'));
$node
->removeAttribute('data-caption');
$caption = Html::decodeEntities($caption);
$caption = FilteredMarkup::create(Xss::filter($caption, array(
'a',
'em',
'strong',
'cite',
'code',
'br',
)));
if (Unicode::strlen($caption) === 0) {
continue;
}
$tag = $node->tagName;
$classes = $node
->getAttribute('class');
$node
->removeAttribute('class');
$node = $node->parentNode->tagName === 'a' ? $node->parentNode : $node;
$filter_caption = array(
'#theme' => 'filter_caption',
'#node' => FilteredMarkup::create($node
->C14N()),
'#tag' => $tag,
'#caption' => $caption,
'#classes' => $classes,
);
$altered_html = drupal_render($filter_caption);
$updated_node = Html::load($altered_html)
->getElementsByTagName('body')
->item(0)->childNodes
->item(0);
$updated_node = $dom
->importNode($updated_node, TRUE);
$node->parentNode
->replaceChild($updated_node, $node);
}
$result
->setProcessedText(Html::serialize($dom))
->addAttachments(array(
'library' => array(
'filter/caption',
),
));
}
return $result;
}
public function tips($long = FALSE) {
if ($long) {
return $this
->t('
<p>You can caption images, videos, blockquotes, and so on. Examples:</p>
<ul>
<li><code><img src="" data-caption="This is a caption" /></code></li>
<li><code><video src="" data-caption="The Drupal Dance" /></code></li>
<li><code><blockquote data-caption="Dries Buytaert">Drupal is awesome!</blockquote></code></li>
<li><code><code data-caption="Hello world in JavaScript.">alert("Hello world!");</code></code></li>
</ul>');
}
else {
return $this
->t('You can caption images (<code>data-caption="Text"</code>), but also videos, blockquotes, and so on.');
}
}
}