Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php namespace App\Entities;
- /**
- * Сущность HTML-тэга изображения
- *
- * @package App\Entities
- * taburetka.ua
- */
- class HtmlImage
- {
- /**
- * Атрибуты
- *
- * @var array
- */
- protected $attributes = [];
- /**
- * Сущность изображения
- *
- * @var Image
- */
- protected $entity;
- /**
- * Индикатор ленивой загрузки
- *
- * @var bool
- */
- protected $lazy = false;
- /**
- * Обычный источник
- *
- * @var
- */
- protected $src;
- /**
- * Непережатый источник
- *
- * @var
- */
- protected $uncompressed;
- /**
- * Конструктор
- *
- * @param Image|string $src
- */
- public function __construct($src)
- {
- // Нам передали строку?
- if (is_string($src)) {
- // Для начала удаляем хост табуретки из URL
- $src = preg_replace('/(http:|https:)?\/\/(([^\.]+)?\.)?taburetka\.([^\/]+)\//i', '', $src);
- // Если после этого не осталось URL
- if (strpos($src, '//') !== 0 and strpos($src, 'http') !== 0) {
- // Убираем QueryString
- $file = strtok($src, '?');
- // Затем очищаем пробелы с концов
- $file = trim($file);
- // Теперь убираем слєш в начала
- $file = ltrim($file, '/');
- // Создадим сущность
- $src = new Image($file);
- }
- }
- // Удалось создать сущность изображения?
- if ($src instanceof Image) {
- // Сохраняем сущность
- $this->entity = $src;
- // Получим URL
- $this->src = $this->attributes['src'] = $src->src();
- // Получим непережатый URL
- $this->uncompressed = $src->unprocessed();
- // Иначе
- } else {
- // Сохраняем атрибут как есть
- $this->src = $this->attributes['src'] = $src;
- }
- // Сохраняем настройку ленивой загрузки
- $this->lazy = (bool) config('image.lazy', false);
- }
- /**
- * Задает значение атрибута
- *
- * @param string $attr
- * @param mixed|null $value
- * @return $this
- */
- public function attr(string $attr, $value = null)
- {
- $this->attributes[$attr] = $value;
- return $this;
- }
- /**
- * Принудительное выключение ленивой загрузки
- *
- * @return $this
- */
- public function eager()
- {
- $this->lazy = false;
- return $this;
- }
- /**
- * Принудительное включение ленивой загрузки
- *
- * @return $this
- */
- public function lazy()
- {
- $this->lazy = true;
- return $this;
- }
- /**
- * Запрещает испльзвание пережатых картинок
- *
- * @return $this
- */
- public function unprocessed()
- {
- if (array_key_exists('src', $this->attributes)) {
- $this->attributes['src'] = $this->uncompressed ?: $this->attributes['src'];
- }
- return $this;
- }
- /**
- * Получает массив готовых атрибутов
- *
- * @param array|null $attrs
- * @return mixed
- */
- public function attrs(array $attrs = null)
- {
- // Если переданы атрибуты
- if ($attrs !== null) {
- // Добавляем их
- $this->attributes = array_merge($this->attributes, $attrs);
- // Позволяем делать чейн
- return $this;
- }
- // Бекапим атрибуты
- $attributes = $this->attributes;
- // Если включена ленивая загрузка
- if ($this->lazy) {
- // Задаем адрес ленивой загрузки
- $attributes['data-src'] = $attributes['src'];
- // Подменяем тэг иточника
- $attributes['src'] = config('image.placeholder');
- // Добавляем класс ленивой загрузки
- $attributes['class'] = 'lazyload';
- }
- // Если задан title но нет alt
- if (isset($attributes['title']) and !isset($attributes['alt'])) {
- // Копируем title в alt
- $attributes['alt'] = $attributes['title'];
- // Если есть alt но нет title
- } else if (isset($attributes['alt']) and !isset($attributes['title'])) {
- // Копируем alt в title
- $attributes['title'] = $attributes['alt'];
- }
- // Определяем разрешения использовать размеры
- $width = $height = true;
- // Удадяем пиксели их щирины
- if (isset($attributes['width'])) {
- $attributes['width'] = str_replace('px', '', $attributes['width']);
- }
- // Убираем пиксели из высоты
- if (isset($attributes['height'])) {
- $attributes['height'] = str_replace('px', '', $attributes['height']);
- }
- // Если задана ширина, но нет высоты
- if (isset($attributes['width']) and !isset($attributes['height'])) {
- // Если ширина в процентах
- if (!is_numeric($attributes['width'])) {
- // Отключаем использование высоты
- $height = false;
- // Иначе
- } else if ($this->entity and $this->entity->width()) {
- // Рассчитываем высоту по ширине
- $attributes['height'] = round($this->entity->height() * ((int) $attributes['width'] / $this->entity->width()));
- }
- // Иначе если задана
- } else if(isset($attributes['height']) and !isset($attributes['width'])) {
- // Если ширина в процентах
- if (!is_numeric($attributes['height'])) {
- // Отключаем использование ширины
- $width = false;
- // Иначе
- } else if($this->entity and $this->entity->height()) {
- // Рассчитываем ширину по высоте
- $attributes['width'] = round($this->entity->width() * ((int) $attributes['height'] / $this->entity->height()));
- }
- }
- // Если задана сущность
- if ($this->entity) {
- // Не задана ширина и разрешено применять ширину
- if (!isset($attributes['width']) and $width) {
- // Задаем ширину
- $attributes['width'] = $this->entity->width();
- }
- // И разрешего применять высоту
- if (!isset($attributes['height']) and $height) {
- // Задаем высоту
- $attributes['height'] = $this->entity->height();
- }
- }
- // Тут сохраним результат
- $result = [];
- // Проходим по атрибутам
- foreach ($attributes as $attribute => $value) {
- // Добавляем к результату атрибут и значение если оно есть
- $result[] = $this->escape($attribute) . ($value ? ('="' . $this->escape($value) . '"') : '');
- }
- // Возвращаем результат
- return $result;
- }
- /**
- * Преобразует специальные символы в HTML-сущности
- *
- * @param string $content
- * @return string
- */
- protected function escape(string $content)
- {
- return htmlspecialchars($content);
- }
- /**
- * Преобразование в строку
- *
- * @return string
- */
- public function __toString()
- {
- // Делаем тэг alt с атрибутами
- return '<img ' . implode(' ', $this->attrs()) . ' />';
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement