You are here

private static function HTMLRestrictions::applyOperation in Drupal 10

Applies an operation (difference/intersection/union) with wildcard support.

Parameters

\Drupal\ckeditor5\HTMLRestrictions $a: The first operand.

\Drupal\ckeditor5\HTMLRestrictions $b: The second operand.

string $operation_method_name: The name of the private method on this class to use as the operation.

Return value

\Drupal\ckeditor5\HTMLRestrictions The result of the operation.

File

core/modules/ckeditor5/src/HTMLRestrictions.php, line 827

Class

HTMLRestrictions
Represents a set of HTML restrictions.

Namespace

Drupal\ckeditor5

Code

private static function applyOperation(HTMLRestrictions $a, HTMLRestrictions $b, string $operation_method_name) : HTMLRestrictions {

  // 1. Operation applied to wildcard tags that exist in both operands.
  // For example: <$text-container id> in both operands.
  $a_wildcard = $a
    ->getWildcardSubset();
  $b_wildcard = $b
    ->getWildcardSubset();
  $wildcard_op_result = $a_wildcard
    ->{$operation_method_name}($b_wildcard);

  // Early return if both operands contain only wildcard tags.
  if (count($a_wildcard->elements) === count($a->elements) && count($b_wildcard->elements) === count($b->elements)) {
    return $wildcard_op_result;
  }

  // 2. Operation applied with wildcard tags resolved into concrete tags.
  // For example: <p class="text-align-center"> in the first operand and
  // <$text-container class="text-align-center"> in the second
  // operand.
  $a_concrete = self::resolveWildcards($a);
  $b_concrete = self::resolveWildcards($b);
  $concrete_op_result = $a_concrete
    ->{$operation_method_name}($b_concrete);

  // Using the PHP array union operator is safe because the two operation
  // result arrays ensure there is no overlap between the array keys.
  // @codingStandardsIgnoreStart
  assert(Inspector::assertAll(function ($t) {
    return self::isWildcardTag($t);
  }, array_keys($wildcard_op_result->elements)));
  assert(Inspector::assertAll(function ($t) {
    return !self::isWildcardTag($t);
  }, array_keys($concrete_op_result->elements)));

  // @codingStandardsIgnoreEnd
  return new self($concrete_op_result->elements + $wildcard_op_result->elements);
}