Drupal → Текстовый фильтр, оборачивающий контент ссылок в span

24.03.2024

Фильтр, преобразующий код вида <a href="/link-path">Link text</a>, в <a href="/link-path"><span>Link text</span></a>.

<?php
// modulename/src/Plugin/Filter/LinkSpanFilter.php

namespace Drupal\modulename\Plugin\Filter;

use Drupal\Component\Utility\Html;
use Drupal\filter\FilterProcessResult;
use Drupal\filter\Plugin\FilterBase;

/**
 * @Filter(
 *   id = "link_span",
 *   title = @Translation("Wrap link text to span"),
 *   description = "",
 *   type = Drupal\filter\Plugin\FilterInterface::TYPE_TRANSFORM_IRREVERSIBLE,
 *   weight = 20,
 * )
 */
class LinkSpanFilter extends FilterBase {

  /**
   * {@inheritDoc}
   */
  public function process($text, $langcode): FilterProcessResult {
    $result = new FilterProcessResult($text);

    if (stripos($text, '<a') !== FALSE) {
      $dom = Html::load($text);
      $links = $dom->getElementsByTagName('a');

      /** @var \DOMElement $link */
      foreach ($links as $link) {
        $span = $dom->createElement('span');
        while ($link->childNodes->length) {
          $span->appendChild($link->childNodes[0]);
        }
        $link->appendChild($span);
      }

      $result->setProcessedText(Html::serialize($dom));
    }

    return $result;
  }

}
Написанное актуально для
Drupal 8+
Похожие записи

Добавить комментарий