403Webshell
Server IP : 104.21.84.107  /  Your IP : 104.23.197.208
Web Server : Apache/2.4.63 (Ubuntu)
System : Linux adminpruebas-Virtual-Machine 6.14.0-37-generic #37-Ubuntu SMP PREEMPT_DYNAMIC Fri Nov 14 22:10:32 UTC 2025 x86_64
User : www-data ( 33)
PHP Version : 8.4.5
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : ON
Directory :  /var/www/html/bienestar/libraries/syw/src/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/html/bienestar/libraries/syw/src/Utilities.php
<?php
/**
 * @copyright	Copyright (C) 2011 Simplify Your Web, Inc. All rights reserved.
 * @license		GNU General Public License version 3 or later; see LICENSE.txt
 */

namespace SYW\Library;

defined('_JEXEC') or die;

use Joomla\CMS\Environment\Browser;
use Joomla\CMS\Filesystem\File;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\Utilities\ArrayHelper;
use SYW\Library\Vendor\MobileDetect;

class Utilities
{
	static $mobile_detector = null;
	static $is_mobile = null;
	static $is_tablet = null;

	static $SVGSprites = array();

	/*
	 * Determines if the device is mobile
	 */
	static public function isMobile($use_joomla_library = false)
	{
		if (!isset(self::$is_mobile)) {

			if ($use_joomla_library) {
				$browser = Browser::getInstance();
				self::$is_mobile = $browser->isMobile();
			} else {
				self::$is_mobile = self::getMobileDetector()->isMobile();
			}
		}

		return self::$is_mobile;
	}

	/*
	 * Determines if the device is a tablet
	 */
	static public function isTablet()
	{
		if (!isset(self::$is_tablet)) {
			self::$is_tablet = self::getMobileDetector()->isTablet();
		}

		return self::$is_tablet;
	}

	/**
	 * Get the mobile detector object
	 *
	 * @return \SYW\Library\Vendor\MobileDetect
	 */
	static protected function getMobileDetector()
	{
		if (!isset(self::$mobile_detector)) {
			self::$mobile_detector = new MobileDetect;
		}

		return self::$mobile_detector;
	}

	/*
	* Returns the google font found in a font family
	* The returned font is of format "Google Font"
	* 
	* @deprecated use Fonts::getWebfontFromFamily
	*/
	static function getGoogleFont($font_family)
	{
		$google_font = '';

		$standard_fonts = array();
		$standard_fonts[] = "Palatino Linotype";
		$standard_fonts[] = "Book Antiqua";
		$standard_fonts[] = "MS Serif";
		$standard_fonts[] = "New York";
		$standard_fonts[] = "Times New Roman";
		$standard_fonts[] = "Arial Black";
		$standard_fonts[] = "Comic Sans MS";
		$standard_fonts[] = "Lucida Sans Unicode";
		$standard_fonts[] = "Lucida Grande";
		$standard_fonts[] = "Trebuchet MS";
		$standard_fonts[] = "MS Sans Serif";
		$standard_fonts[] = "Courier New";
		$standard_fonts[] = "Lucida Console";

		$fonts = explode(',', $font_family);
		foreach ($fonts as $font) {
			if (substr_count($font, '"') == 2) { // found a font with 2 quotes
				$font = trim($font, '"');
				foreach ($standard_fonts as $standard_font) {
					if (strcasecmp($standard_font, $font) == 0) { // identical fonts
						return '';
					}
				}
				$google_font = $font;
			}
		}

		return $google_font;
	}

	/*
	 * Transform "Google Font" into Google+Font for use in <link> tag
	 * 
	 * @deprecated use Fonts::getSafeWebfont
	 */
	static function getSafeGoogleFont($google_font)
	{
		$font = str_replace(' ', '+', $google_font); // replace spaces with +
		return trim($font, '"');
	}

	/*
	 * Convert a hexa decimal color code to its RGB equivalent
	 *
	 * @param string $hexStr (hexadecimal color value)
	 * @param boolean $returnAsString (if set true, returns the value separated by the separator character. Otherwise returns associative array)
	 * @param string $seperator separator of RGB values. Applicable only if second parameter is true.
	 * 
	 * @return array or string (depending on second parameter. Returns False if invalid hex color value)
	 */
	static function hex2RGB($hexStr, $returnAsString = false, $seperator = ',')
	{
	    $hexStr = preg_replace("/[^0-9A-Fa-f]/", '', $hexStr); // Gets a proper hex string
	    $rgbArray = array();
	    if (strlen($hexStr) == 6) { // if a proper hex code, convert using bitwise operation. No overhead... faster
	        $colorVal = hexdec($hexStr);
	        $rgbArray['red'] = 0xFF & ($colorVal >> 0x10);
	        $rgbArray['green'] = 0xFF & ($colorVal >> 0x8);
	        $rgbArray['blue'] = 0xFF & $colorVal;
	    } elseif (strlen($hexStr) == 3) { // if shorthand notation, need some string manipulations
	        $rgbArray['red'] = hexdec(str_repeat(substr($hexStr, 0, 1), 2));
	        $rgbArray['green'] = hexdec(str_repeat(substr($hexStr, 1, 1), 2));
	        $rgbArray['blue'] = hexdec(str_repeat(substr($hexStr, 2, 1), 2));
	    } else {
	        return false; //Invalid hex color code
	    }

	    return $returnAsString ? implode($seperator, $rgbArray) : $rgbArray; // returns the rgb string or the associative array
	}
	
	/**
	 * Convert a HSL color into RGB
	 * 
	 * @param string $hslStr color value eg: hsl(216, 98%, 52%)
	 * @param boolean $returnAsString (if set true, returns the value separated by the separator character. Otherwise returns associative array)
	 * @param string $seperator separator of RGB values. Applicable only if second parameter is true.
	 * 
	 * @return array or string (depending on second parameter. Returns False if invalid hex color value)
	 */
	static function HSL2RGB($hslStr, $returnAsString = false, $seperator = ',')
	{
		$hsl_string = str_replace('hsl', '', $hslStr);
		$hsl_string = trim($hsl_string, '()');
		
		$hsl_array = explode(',', $hsl_string);
		foreach ($hsl_array as $key => $value) {
			$value = trim($value, ' %');
			if (empty($value)) {
				unset($key);
			}
		}
		
		$h = (float)$hsl_array[0] / 360;
		$s = (float)$hsl_array[1] / 100;
		$l = (float)$hsl_array[2] / 100;
		
		$r = $l;
		$g = $l;
		$b = $l;
		$v = ($l <= 0.5) ? ($l * (1.0 + $s)) : ($l + $s - $l * $s);
		
		if ($v > 0) {
			
			$m = $l + $l - $v;
			$sv = ($v - $m ) / $v;
			$h *= 6.0;
			$sextant = floor($h);
			$fract = $h - $sextant;
			$vsf = $v * $sv * $fract;
			$mid1 = $m + $vsf;
			$mid2 = $v - $vsf;
			
			switch ($sextant)
			{
				case 0:
					$r = $v;
					$g = $mid1;
					$b = $m;
					break;
				case 1:
					$r = $mid2;
					$g = $v;
					$b = $m;
					break;
				case 2:
					$r = $m;
					$g = $v;
					$b = $mid1;
					break;
				case 3:
					$r = $m;
					$g = $mid2;
					$b = $v;
					break;
				case 4:
					$r = $mid1;
					$g = $m;
					$b = $v;
					break;
				case 5:
					$r = $v;
					$g = $m;
					$b = $mid2;
					break;
			}
		}
		
		$rgbArray = array('red' => round($r * 255.0), 'green' => round($g * 255.0), 'blue' => round($b * 255.0));
		
		return $returnAsString ? implode($seperator, $rgbArray) : $rgbArray; // returns the rgb string or the associative array
	}

	/*
	 * Bootstrap conversion function (handles Bootstrap 2, 3, 4 and 5)
	 * returns default class if Bootstrap version is unknown (or 0)
	 */
	static function getBootstrapProperty($property_string, $bootstrap_version = 5)
	{
		$bootstrap_version = intval($bootstrap_version);

		$properties = explode(' ', $property_string); // may get properties like 'label label-info'

		$converted_properties = array();

		foreach ($properties as $property) {
			switch ($property) {

				// buttons

				case 'btn': $converted_properties[] = 'btn'; break; // exists for all versions

				case 'btn-default': // no default in B2, B4 nor B5
					if ($bootstrap_version == 0 || $bootstrap_version == 3) { $converted_properties[] = 'btn-default'; }
					break;
				case 'btn-primary': $converted_properties[] = 'btn-primary'; break;
				case 'btn-secondary': // not in B2 nor B3
					if ($bootstrap_version == 0 || $bootstrap_version >= 4) { $converted_properties[] = 'btn-secondary'; }
					break;
				case 'btn-info': $converted_properties[] = 'btn-info'; break;
				case 'btn-warning': $converted_properties[] = 'btn-warning'; break;
				case 'btn-danger': $converted_properties[] = 'btn-danger'; break;
				case 'btn-success': $converted_properties[] = 'btn-success'; break;
				case 'btn-link': $converted_properties[] = 'btn-link'; break;
				case 'btn-inverse': // no inverse for B3, B4 and B5
					if ($bootstrap_version == 0 || $bootstrap_version == 2) { $converted_properties[] = 'btn-inverse'; }
					break;
				case 'btn-light': // not in B2 nor B3
					if ($bootstrap_version == 0 || $bootstrap_version >= 4) { $converted_properties[] = 'btn-light'; }
					break;
				case 'btn-dark': // not in B2 nor B3
					if ($bootstrap_version == 0 || $bootstrap_version >= 4) { $converted_properties[] = 'btn-dark'; }
					break;
		        case 'btn-block': // removed in B5
		        	if ($bootstrap_version <= 4) { $converted_properties[] = 'btn-block'; } else { $converted_properties[] = 'w-100'; }
					break;
				case 'btn-large':
		        	if ($bootstrap_version == 2) { $converted_properties[] = 'btn-large'; } else { $converted_properties[] = 'btn-lg'; }
					break;
				case 'btn-small':
		        	if ($bootstrap_version == 2) { $converted_properties[] = 'btn-small'; } else { $converted_properties[] = 'btn-sm'; }
					break;
		        case 'btn-mini': // no xs in B4 nor B5
		        	if ($bootstrap_version == 2) { $converted_properties[] = 'btn-mini'; }
		        	if ($bootstrap_version == 0 || $bootstrap_version == 3) { $converted_properties[] = 'btn-xs'; }
		        	if ($bootstrap_version >= 4) { $converted_properties[] = 'btn-sm'; }
					break;

				// labels

				case 'label':
		        	if ($bootstrap_version < 4) { $converted_properties[] = 'label'; } else { $converted_properties[] = 'badge'; }
					break;
				case 'label-default': // no default in B2, B4 nor B5
					if ($bootstrap_version == 0 || $bootstrap_version == 3) { $converted_properties[] = 'label-default'; }
					break;
				case 'label-primary': // no primary in B2
					if ($bootstrap_version == 0 || $bootstrap_version == 3) { $converted_properties[] = 'label-primary'; }
					if ($bootstrap_version == 4) { $converted_properties[] = 'badge-primary'; }
					if ($bootstrap_version == 5) { $converted_properties[] = 'bg-primary'; }
					break;
				case 'label-secondary': // not in B2 nor B3
					if ($bootstrap_version == 0 || $bootstrap_version == 4) { $converted_properties[] = 'badge-secondary'; }
					if ($bootstrap_version == 5) { $converted_properties[] = 'bg-secondary'; }
					break;
				case 'label-info':
					if ($bootstrap_version < 4) { $converted_properties[] = 'label-info'; }
					if ($bootstrap_version == 4) { $converted_properties[] = 'badge-info'; }
					if ($bootstrap_version == 5) { $converted_properties[] = 'bg-info text-dark'; }
					break;
				case 'label-warning':
					if ($bootstrap_version < 4) { $converted_properties[] = 'label-warning'; }
					if ($bootstrap_version == 4) { $converted_properties[] = 'badge-warning'; }
					if ($bootstrap_version == 5) { $converted_properties[] = 'bg-warning text-dark'; }
					break;
				case 'label-important':
					if ($bootstrap_version == 0 || $bootstrap_version == 2) { $converted_properties[] = 'label-important'; }
					if ($bootstrap_version == 3) { $converted_properties[] = 'label-danger'; }
					if ($bootstrap_version == 4) { $converted_properties[] = 'badge-danger'; }
					if ($bootstrap_version == 5) { $converted_properties[] = 'bg-danger'; }
					break;
				case 'label-success':
					if ($bootstrap_version < 4) { $converted_properties[] = 'label-success'; }
					if ($bootstrap_version == 4) { $converted_properties[] = 'badge-success'; }
					if ($bootstrap_version == 5) { $converted_properties[] = 'bg-success'; }
					break;
				case 'label-inverse': // no inverse for B3, B4 and B5
					if ($bootstrap_version == 0 || $bootstrap_version == 2) { $converted_properties[] = 'label-inverse'; }
					break;
				case 'label-light': // not in B2 nor B3
					if ($bootstrap_version == 0) { $converted_properties[] = 'label-light'; }
					if ($bootstrap_version == 4) { $converted_properties[] = 'badge-light'; }
					if ($bootstrap_version == 5) { $converted_properties[] = 'bg-light text-dark'; }
					break;
				case 'label-dark': // not in B2 nor B3
					if ($bootstrap_version == 0) { $converted_properties[] = 'label-dark'; }
					if ($bootstrap_version == 4) { $converted_properties[] = 'badge-dark'; }
					if ($bootstrap_version == 5) { $converted_properties[] = 'bg-dark'; }
					break;

				// badges-pills

				case 'badge':
					if ($bootstrap_version < 4) { $converted_properties[] = 'badge'; }
					if ($bootstrap_version == 4) { $converted_properties[] = 'badge badge-pill'; }
					if ($bootstrap_version == 5) { $converted_properties[] = 'badge rounded-pill'; }
					break;
				case 'badge-default': // no default in B2, B3, B4 or B5
					if ($bootstrap_version == 0) { $converted_properties[] = 'badge-default'; }
					break;
				case 'badge-primary': // not in B2 nor B3
					if ($bootstrap_version == 0 || $bootstrap_version == 4) { $converted_properties[] = 'badge-primary'; }
					if ($bootstrap_version == 5) { $converted_properties[] = 'bg-primary'; }
					break;
				case 'badge-secondary': // not in B2 nor B3
					if ($bootstrap_version == 0 || $bootstrap_version == 4) { $converted_properties[] = 'badge-secondary'; }
					if ($bootstrap_version == 5) { $converted_properties[] = 'bg-secondary'; }
					break;
				case 'badge-info': // not in B3
					if ($bootstrap_version == 0 || $bootstrap_version == 2 || $bootstrap_version == 4) { $converted_properties[] = 'badge-info'; }
					if ($bootstrap_version == 5) { $converted_properties[] = 'bg-info text-dark'; }
					break;
				case 'badge-warning': // not in B3
					if ($bootstrap_version == 0 || $bootstrap_version == 2 || $bootstrap_version == 4) { $converted_properties[] = 'badge-warning'; }
					if ($bootstrap_version == 5) { $converted_properties[] = 'bg-warning text-dark'; }
					break;
				case 'badge-important': // not in B3
					if ($bootstrap_version == 0 || $bootstrap_version == 2) { $converted_properties[] = 'badge-important'; }
					if ($bootstrap_version == 4) { $converted_properties[] = 'badge-danger'; }
					if ($bootstrap_version == 5) { $converted_properties[] = 'bg-danger'; }
					break;
				case 'badge-success': // not in B3
					if ($bootstrap_version == 0 || $bootstrap_version == 2 || $bootstrap_version == 4) { $converted_properties[] = 'badge-success'; }
					if ($bootstrap_version == 5) { $converted_properties[] = 'bg-success'; }
					break;
				case 'badge-inverse': // no inverse for B3, B4 and B5
					if ($bootstrap_version == 0 || $bootstrap_version == 2) { $converted_properties[] = 'badge-inverse'; }
					break;
				case 'badge-light': // not in B2 nor B3
					if ($bootstrap_version == 0 || $bootstrap_version == 4) { $converted_properties[] = 'badge-light'; }
					if ($bootstrap_version == 5) { $converted_properties[] = 'bg-light text-dark'; }
					break;
				case 'badge-dark': // not in B2 nor B3
					if ($bootstrap_version == 0 || $bootstrap_version == 4) { $converted_properties[] = 'badge-dark'; }
					if ($bootstrap_version == 5) { $converted_properties[] = 'bg-dark'; }
					break;

				// alerts

				case 'alert': $converted_properties[] = 'alert'; break; // exists for all versions

				case 'alert-primary': // not in B2 nor B3
					if ($bootstrap_version == 0 || $bootstrap_version >= 4) { $converted_properties[] = 'alert-primary'; }
					break;
				case 'alert-secondary': // not in B2 nor B3
					if ($bootstrap_version == 0 || $bootstrap_version >= 4) { $converted_properties[] = 'alert-secondary'; }
					break;
				case 'alert-info': $converted_properties[] = 'alert-info'; break;
				case 'alert-success': $converted_properties[] = 'alert-success'; break;
				case 'alert-warning': // no B2
					if ($bootstrap_version == 0 || $bootstrap_version >= 3) { $converted_properties[] = 'alert-warning'; }
					break;
				case 'alert-error':
		        	if ($bootstrap_version == 0 || $bootstrap_version == 2) { $converted_properties[] = 'alert-error'; } else { $converted_properties[] = 'alert-danger'; }
					break;
				case 'alert-light': // not in B2 nor B3
					if ($bootstrap_version == 0 || $bootstrap_version >= 4) { $converted_properties[] = 'alert-light'; }
					break;
				case 'alert-dark': // not in B2 nor B3
					if ($bootstrap_version == 0 || $bootstrap_version >= 4) { $converted_properties[] = 'alert-dark'; }
					break;

				// pagination

				case 'pagination': $converted_properties[] = 'pagination'; break; // exists for all versions

				case 'pagination-large':
		        	if ($bootstrap_version == 2) { $converted_properties[] = 'pagination-large'; } else { $converted_properties[] = 'pagination-lg'; }
					break;
				case 'pagination-small':
		        	if ($bootstrap_version == 2) { $converted_properties[] = 'pagination-small'; } else { $converted_properties[] = 'pagination-sm'; }
					break;
				case 'pagination-mini':
		        	if ($bootstrap_version == 0) { $converted_properties[] = 'pagination-xs'; }
		        	if ($bootstrap_version == 2) { $converted_properties[] = 'pagination-mini'; }
		        	if ($bootstrap_version >= 3) { $converted_properties[] = 'pagination-sm'; }
					break;
				case 'pagination-left': // not in Bootstrap
					if ($bootstrap_version == 0) { $converted_properties[] = 'pagination-left'; }
					break;
				case 'pagination-center': // not in B2 nor B3
					if ($bootstrap_version == 0) { $converted_properties[] = 'pagination-center'; }
					if ($bootstrap_version >= 4) { $converted_properties[] = 'justify-content-center'; }
					break;
				case 'pagination-right': // not in B2 nor B3
					if ($bootstrap_version == 0) { $converted_properties[] = 'pagination-right'; }
					if ($bootstrap_version >= 4) { $converted_properties[] = 'justify-content-end'; }
					break;

				// align

				case 'float-right':
					if ($bootstrap_version == 2 || $bootstrap_version == 3) { $converted_properties[] = 'pull-right'; }
					if ($bootstrap_version == 0 || $bootstrap_version == 4) { $converted_properties[] = 'float-right'; }
					if ($bootstrap_version == 5) { $converted_properties[] = 'float-end'; }
					break;
				case 'float-left':
					if ($bootstrap_version == 2 || $bootstrap_version == 3) { $converted_properties[] = 'pull-left'; }
					if ($bootstrap_version == 0 || $bootstrap_version == 4) { $converted_properties[] = 'float-left'; }
					if ($bootstrap_version == 5) { $converted_properties[] = 'float-start'; }
					break;
				case 'float-none':
					if ($bootstrap_version == 0 || $bootstrap_version >= 4) { $converted_properties[] = 'float-none'; }
					break;

				// clearfix exists for all versions

				// visibility

				case 'visually-hidden':
					switch ($bootstrap_version) {
						case 0: case 2: $converted_properties[] = 'element-invisible'; break;
						case 3: case 4: $converted_properties[] = 'sr-only'; break;
						case 5: $converted_properties[] = 'visually-hidden'; break;
					}
					break;

				// hidden on the phone (for tables)

				case 'hidden-phone':
					switch ($bootstrap_version) {
						case 0: case 2: $converted_properties[] = 'hidden-phone'; break;
						case 3: $converted_properties[] = 'hidden-xs'; break;
						default: $converted_properties[] = 'd-none d-sm-table-cell'; break;
					}
					break;
			}
		}

		return implode(' ', $converted_properties);
	}

	/**
	 * output inline svg with reusable sprites and avoid duplicate code
	 *
	 * @param string $spriteId
	 * @param array $svg_attributes
	 * @param array $path_attributes
	 */
	//static function getInlineSVG($spriteName, $path = JURI::root(true).'/media/syw/svg')
	static function getInlineSVG($spriteId, $svg_attributes, $path_attributes)
	{
		$output = '';

		if (!isset(self::$SVGSprites['syw_' .$spriteId])) {

			$output .= '<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">';

			$attributes = '';
			if (isset($svg_attributes['viewbox'])) {
				$attributes .= ' viewBox="' . $svg_attributes['viewbox'] . '"';
			}

			$output .= '<symbol id="' . $spriteId . '"' . $attributes . '>';

			$attributes = '';
			foreach ($path_attributes as $attribute => $value) {
				$attributes .= ' ' . $attribute . '="' . $value . '"';
			}

			$output .= '<path' . $attributes . '></path>';

			$output .= '</symbol>';

			$output .= '</svg>';

			self::$SVGSprites['syw_' .$spriteId] = true;
		}

		$attributes = '';
		foreach ($svg_attributes as $attribute => $value) {
			if ($attribute != 'viewbox') {
				$attributes .= ' ' . $attribute . '="' . $value . '"';
			}
		}

		$output .= '<svg' . $attributes . '>';

		$output .= '<use xlink:href="#' . $spriteId . '" />';

		$output .= '</svg>';

		return $output;
	}

	/**
	 * Output the <picture> or <img> HTML element according to the image source
	 * Follows web standards and ensures proper fallbacks
	 * If the image extension is webp, it adds a png fallback
	 *
	 * @param string $src the image source
	 * @param string $alt the image alt attribute
	 * @param array $attributes attributes to be added to the <img> element (can contain width and height for the image)
	 * @param boolean $lazy_load lazy load the image
	 * @param boolean $high_resolution handle high resolution devices
	 * @param array breakpoints the possible breakpoints to use for media queries (ordered from lower to higher)
	 * @param boolean check the file existence, use when full control over the creation of images
	 * @return string the <picture> or <img> element
	 */
	public static function getImageElement($src, $alt, $attributes = array(), $lazy_load = false, $high_resolution = false, $breakpoints = null, $check_files = true, $version = '')
	{
		$html = '';

		$extensions_needing_fallbacks = array('webp', 'avif');
		$mime_types = array('jpg' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'png' => 'image/png', 'gif' => 'image/gif', 'webp' => 'image/webp', 'avif' => 'image/avif');
		$possible_fallback_extensions = array('png', 'jpg');

		if ($version) {
		    if (strpos($src, '?') === false) {
		        $version = '?' . $version; // stay homogeneous with the way Joomla adds versions (or use ?version=)
		    } else {
		        $version = '';
		    }
		}

// 		$version = '';
// 		$hash = hash_file('md5', JPATH_ROOT . '/' . $src);
// 		if ($hash !== false) {
// 		    $version = '?version=' . $hash;
// 		}

		// clean the src path and grab useful info
		// src may be something like images/default.png#joomlaImage://local-images/default.png?width=500&height=500

		$image_object = HTMLHelper::cleanImageURL($src);
		$src = $image_object->url;

		if (!isset($attributes['width']) && $image_object->attributes['width'] > 0) {
		    $attributes['width'] = $image_object->attributes['width'];
		}

		if (!isset($attributes['height']) && $image_object->attributes['height'] > 0) {
		    $attributes['height'] = $image_object->attributes['height'];
		}

		// get the image extension and the image path from $src
		$source_path = File::stripExt($src);
		$source_extension = File::getExt($src);

		if ($lazy_load && isset($attributes['width'])) {
		    $attributes['loading'] = 'lazy';
		} else {
		    $attributes['loading'] = 'eager';
		}

		if (!empty($breakpoints)) {

			$html .= '<picture>';

			foreach ($breakpoints as $breakpoint) {

				$source_highres_breakpoint = false;
				if ($high_resolution) {
					if ($check_files) {
						if (File::exists(JPATH_SITE . '/' . $source_path . '_' . $breakpoint . '@2x.' . $source_extension)) {
							$source_highres_breakpoint = true;
						}
					} else {
						$source_highres_breakpoint = true;
					}
				}

				$fallback_breakpoint = false;
				$fallback_extension_breakpoint = 'png';
				$fallback_highres_breakpoint = false;

				if (in_array($source_extension, $extensions_needing_fallbacks)) {

					if ($check_files) {
						foreach ($possible_fallback_extensions as $possible_fallback_extension) {
							if (File::exists(JPATH_SITE . '/' . $source_path . '_' . $breakpoint . '.' . $possible_fallback_extension)) {
								$fallback_breakpoint = true;
								$fallback_extension_breakpoint = $possible_fallback_extension;
								if ($high_resolution && File::exists(JPATH_SITE . '/' . $source_path . '_' . $breakpoint . '@2x.' . $possible_fallback_extension)) {
									$fallback_highres_breakpoint = true;
								}
								break;
							}
						}
					} else {
						$fallback_breakpoint = true;
						if ($high_resolution) {
							$fallback_highres_breakpoint = true;
						}
					}
				}

				$html .= '<source type="' . $mime_types[$source_extension] . '" media="(max-width: ' . $breakpoint . 'px)" srcset="' . $source_path . '_' . $breakpoint . '.' . $source_extension . $version . ($source_highres_breakpoint ? ' 1x,' . $source_path . '_' . $breakpoint . '@2x.' . $source_extension . $version . ' 2x' : '') . '">';
				if ($fallback_breakpoint) {
				    $html .= '<source type="' . $mime_types[$fallback_extension_breakpoint] . '" media="(max-width: ' . $breakpoint . 'px)" srcset="' . $source_path . '_' . $breakpoint . '.' . $fallback_extension_breakpoint . $version . ($fallback_highres_breakpoint ? ' 1x,' . $source_path . '_' . $breakpoint . '@2x.' . $fallback_extension_breakpoint . $version . ' 2x' : '') . '">';
				}
			}

			$source_highres = false;
			if ($high_resolution) {
				if ($check_files) {
					if (File::exists(JPATH_SITE . '/' . $source_path . '@2x.' . $source_extension)) {
						$source_highres = true;
					}
				} else {
					$source_highres = true;
				}
			}

			$fallback = false;
			$fallback_extension = 'png';
			$fallback_highres = false;

			if (in_array($source_extension, $extensions_needing_fallbacks)) {

				if ($check_files) {
					foreach ($possible_fallback_extensions as $possible_fallback_extension) {
						if (File::exists(JPATH_SITE . '/' . $source_path . '.' . $possible_fallback_extension)) {
							$fallback = true;
							$fallback_extension = $possible_fallback_extension;
							if ($high_resolution && File::exists(JPATH_SITE . '/' . $source_path . '@2x.' . $possible_fallback_extension)) {
								$fallback_highres = true;
							}
							break;
						}
					}
				} else {
					$fallback = true;
					if ($high_resolution) {
						$fallback_highres = true;
					}
				}
			}

			if ($fallback) {
			    $html .= '<source type="' . $mime_types[$source_extension] . '" srcset="' . $src . $version . ($source_highres ? ' 1x,' . $source_path . '@2x.' . $source_extension . $version . ' 2x' : '') . '">';
			}

			if ($fallback) {
				if ($fallback_highres) {
				    $attributes['srcset'] = $source_path . '@2x.' . $fallback_extension . $version . ' 2x';
				}
			} else {
				if ($source_highres) {
				    $attributes['srcset'] = $source_path . '@2x.' . $source_extension . $version . ' 2x';
				}
			}

            $html .= '<img src="' . ($fallback ? $source_path . '.' . $fallback_extension . $version : $src . $version) . '" alt="' . $alt . '" ' . trim(ArrayHelper::toString($attributes)) . '>';

			$html .= '</picture>';

		} else {

			$source_highres = false;
			if ($high_resolution) {
				if ($check_files) {
					if (File::exists(JPATH_SITE . '/' . $source_path . '@2x.' . $source_extension)) {
						$source_highres = true;
					}
				} else {
					$source_highres = true;
				}
			}

			$fallback = false;
			$fallback_extension = 'png';
			$fallback_highres = false;

			if (in_array($source_extension, $extensions_needing_fallbacks)) {

				if ($check_files) {
					foreach ($possible_fallback_extensions as $possible_fallback_extension) {
						if (File::exists(JPATH_SITE . '/' . $source_path . '.' . $possible_fallback_extension)) {
							$fallback = true;
							$fallback_extension = $possible_fallback_extension;
							if ($high_resolution && File::exists(JPATH_SITE . '/' . $source_path . '@2x.' . $possible_fallback_extension)) {
								$fallback_highres = true;
							}
							break;
						}
					}
				} else {
					$fallback = true;
					if ($high_resolution) {
						$fallback_highres = true;
					}
				}
			}

			if ($fallback) {
				$html .= '<picture>';
			}

			if ($fallback) {
			    $html .= '<source type="' . $mime_types[$source_extension] . '" srcset="' . $src . $version . ($source_highres ? ' 1x,' . $source_path . '@2x.' . $source_extension . $version . ' 2x' : '') . '">';
			}

			if ($fallback) {
				if ($fallback_highres) {
				    $attributes['srcset'] = $source_path . '@2x.' . $fallback_extension . $version . ' 2x';
				}
			} else {
				if ($source_highres) {
				    $attributes['srcset'] = $source_path . '@2x.' . $source_extension . $version . ' 2x';
				}
			}

            $html .= '<img src="' . ($fallback ? $source_path . '.' . $fallback_extension . $version : $src . $version) . '" alt="' . $alt . '" ' . trim(ArrayHelper::toString($attributes)) . '>';

			if ($fallback) {
				$html .= '</picture>';
			}
		}

		return $html;
	}

	/**
	 * Replace old icon name (missing SYWicon- prefix) with the prefixed counterpart
	 * for B/C compatibility with old way of getting icons
	 *
	 * icomoon-tada returns icon-tada
	 * tada returns SYWicon-tada
	 * fas fa-tada remains unchanged because 'fas fa' is part of the prefixes that are ignored
	 *
	 * @param string $icon
	 * @param array $ignore_prefix
	 * @return string
	 */
	public static function getIconFullname($icon, $ignore_prefix = array())
	{
		if (empty($icon))
		{
			return $icon;
		}

		$icon_full_name = $icon;

		$temp_value = explode('-', $icon);

		$ignore = array_merge(array('SYWicon', 'icon', 'bi bi', 'fa fa', 'fas fa', 'fal fa', 'fab fa', 'far fa', 'fad fa'), $ignore_prefix);

		if (!in_array($temp_value[0], $ignore))
		{
			$count_replacements = 0;
			$icon_full_name = str_replace('icomoon-', 'icon-', $icon, $count_replacements);

			if ($count_replacements <= 0)
			{
				$icon_full_name = 'SYWicon-' . $icon;
			}
		}

		return $icon_full_name;
	}
	
	public static function loadPureTreePreset($classes_array = [])
	{
	    $preset = ['prefix' => '', 'retracted' => '', 'expanded' => ''];
	    
	    if (empty($classes_array)) {
	        return $preset;
	    }

	    $presets = [];
	    $presets['fa-caret'] = ['prefix' => 'fas', 'retracted' => 'fa-caret-down', 'expanded' => 'fa-caret-up'];
	    $presets['fa-square-caret'] = ['prefix' => 'fas', 'retracted' => 'fa-square-caret-down', 'expanded' => 'fa-square-caret-up'];
	    $presets['fa-angle'] = ['prefix' => 'fas', 'retracted' => 'fa-angle-down', 'expanded' => 'fa-angle-up'];
	    $presets['fa-angles'] = ['prefix' => 'fas', 'retracted' => 'fa-angles-down', 'expanded' => 'fa-angles-up'];
	    
	    if (in_array('fa-caret', $classes_array)) {
	        $preset = $presets['fa-caret'];
	    } else if (in_array('fa-square-caret', $classes_array)) {
	        $preset = $presets['fa-square-caret'];
	    } else if (in_array('fa-angle', $classes_array)) {
	        $preset = $presets['fa-angle'];
	    } else if (in_array('fa-angles', $classes_array)) {
	        $preset = $presets['fa-angles'];
	    }
	    
	    return $preset;
	}

}

Youez - 2016 - github.com/yon3zu
LinuXploit