blazy-8.x-2.x-dev/src/internals/Content.php
src/internals/Content.php
<?php namespace Drupal\blazy\internals; use Drupal\Component\Render\FormattableMarkup; use Drupal\Core\Entity\EntityInterface; /** * Provides internal content utilities. * * @internal * This is an internal part of the Blazy system and should only be used by * blazy-related code in Blazy module. */ class Content extends Multimedia { /** * Returns a message if access to view the entity is denied. */ public static function denied($entity): array { if (!$entity instanceof EntityInterface) { return []; } if (!$entity->access('view')) { $parameters = [ '@label' => $entity->getEntityType()->getSingularLabel(), '@id' => $entity->id(), '@langcode' => $entity->language()->getId(), '@title' => $entity->label(), ]; $restricted_access_label = $entity->access('view label') ? new FormattableMarkup('@label @id (@title)', $parameters) : new FormattableMarkup('@label @id', $parameters); return ['#markup' => $restricted_access_label]; } return []; } /** * Returns a formatted title. */ public static function formatTitle($value, $url, array $settings): array { $delimiter = $settings['delimiter'] ?? NULL; $tag = $settings['tag'] ?? NULL; $break = $settings['break'] ?? FALSE; $title = $value; $subtitle = NULL; if ($delimiter) { if ($found = self::getDelimiter($value, $delimiter)) { [$title, $subtitle] = array_pad(array_map('trim', explode($found, $value, 2)), 2, NULL); } if ($subtitle) { if ($tag) { $linebreak = $break ? '<br />' : ' '; $title .= $linebreak . '<' . $tag . '>' . $subtitle . '</' . $tag . '>'; } else { $title .= '<br />' . $subtitle; } } } $tags = ['span', 'em', 'b', 'i', 'strong', 'br', 'small']; $view_value = [ '#markup' => $title, '#allowed_tags' => array_merge($tags, [$tag]), ]; if ($url) { return [ '#type' => 'link', '#title' => $view_value, '#url' => $url, ]; } return $view_value; } /** * A helper to gradually migrate sub-modules content into theme_blazy(). */ public static function toContent( array &$data, $unset = FALSE, array $keys = ['content', 'box', 'slide'], ): array { $result = []; foreach ($keys as $key) { $value = $data[$key] ?? $data["#$key"] ?? []; if ($value) { $result = $value; break; } if ($unset) { unset($data[$key]); } } return $result; } /** * Returns the common content item. */ public static function toHtml($content, $tag = 'div', $class = NULL): array { if ($class) { $attributes = is_array($class) ? $class : ['class' => [$class]]; $output = [ '#type' => 'html_tag', '#tag' => $tag, '#attributes' => $attributes, ]; // Allows empty IFRAME, etc. tags. if (!is_null($content)) { $content = is_string($content) ? ['#markup' => $content] : $content; $output['content'] = $content; } return $output; } return $content ?: []; } /** * Returns one of the found configurable delimiter in the title. */ private static function getDelimiter($title, $delimiter = ''): ?string { $delimiter = empty($delimiter) ? '|,:,/,- , —' : $delimiter; $limits = array_map('trim', explode(',', $delimiter)); foreach ($limits as $limit) { if (stripos($title, $limit) === FALSE) { continue; } return $limit; } return NULL; } }