Current File : /home/pacjaorg/public_html/kmm/libraries/regularlabs/src/Uri.php
<?php
/**
 * @package         Regular Labs Library
 * @version         23.9.3039
 * 
 * @author          Peter van Westen <info@regularlabs.com>
 * @link            https://regularlabs.com
 * @copyright       Copyright © 2023 Regular Labs All Rights Reserved
 * @license         GNU General Public License version 2 or later
 */

namespace RegularLabs\Library;

defined('_JEXEC') or die;

use Joomla\CMS\Factory as JFactory;
use Joomla\CMS\Router\Route as JRoute;
use Joomla\CMS\Uri\Uri as JUri;

class Uri
{
    /**
     * adds the given url parameter (key + value) to the url or replaces it already exists
     *
     * @param string $url
     * @param string $key
     * @param string $value
     * @param bool   $replace
     *
     * @return string
     */
    public static function addParameter($url, $key, $value = '', $replace = true)
    {
        if (empty($key))
        {
            return $url;
        }

        $uri   = parse_url($url);
        $query = self::parse_query($uri['query'] ?? '');

        if ( ! $replace && isset($query[$key]))
        {
            return $url;
        }

        $query[$key] = $value;

        $uri['query'] = http_build_query($query);

        return self::createUrlFromArray($uri);
    }

    /**
     * Appends the given hash to the url or replaces it if there is already one
     *
     * @param string $url
     * @param string $hash
     *
     * @return string
     */
    public static function appendHash($url = '', $hash = '')
    {
        if (empty($hash))
        {
            return $url;
        }

        $uri = parse_url($url);

        $uri['fragment'] = $hash;

        return self::createUrlFromArray($uri);
    }

//    public static function createCompressedAttributes($string)
//    {
//        $parameters = [];
//
//        $compressed   = base64_encode(gzdeflate($string));
//        $chunk_length = ceil(strlen($compressed) / 10);
//        $chunks       = str_split($compressed, $chunk_length);
//
//        foreach ($chunks as $i => $chunk)
//        {
//            $parameters[] = 'rlatt_' . $i . '=' . urlencode($chunk);
//        }
//
//        return implode('&', $parameters);
//    }

    /**
     * Converts an array of url parts (like made by parse_url) to a string
     *
     * @param array $uri
     *
     * @return string
     */
    public static function createUrlFromArray($uri)
    {
        $user = $uri['user'] ?? '';
        $pass = ! empty($uri['pass']) ? ':' . $uri['pass'] : '';

        return (! empty($uri['scheme']) ? $uri['scheme'] . '://' : '')
            . (($user || $pass) ? $user . $pass . '@' : '')
            . (! empty($uri['host']) ? $uri['host'] : '')
            . (! empty($uri['port']) ? ':' . $uri['port'] : '')
            . (! empty($uri['path']) ? $uri['path'] : '')
            . (! empty($uri['query']) ? '?' . $uri['query'] : '')
            . (! empty($uri['fragment']) ? '#' . $uri['fragment'] : '');
    }

    public static function decode($string, $urldecode = true)
    {
        if ($urldecode)
        {
            $string = urldecode($string);
        }

        $string = base64_decode($string);

        $deflated = @gzinflate($string);

        if ($string === $deflated || ! $deflated)
        {
            return $string;
        }

        return $deflated;
    }

    public static function encode($string, $urlencode = true)
    {
        $string = base64_encode(gzdeflate($string));

        if ($urlencode)
        {
            $string = urlencode($string);
        }

        return $string;
    }

    /**
     * Returns the full uri and optionally adds/replaces the hash
     *
     * @param string $hash
     *
     * @return string
     */
    public static function get($hash = '')
    {
        $url = JUri::getInstance()->toString();

        if ($hash == '')
        {
            return $url;
        }

        return self::appendHash($url, $hash);
    }

    public static function getCompressedAttributes()
    {
        $input = JFactory::getApplication()->input;

        $compressed = '';

        for ($i = 0; $i < 10; $i++)
        {
            $compressed .= $input->getString('rlatt_' . $i, '');
        }

        return self::decode($compressed, false);
    }

    /**
     * get the value of a given url parameter from the url
     *
     * @param string $url
     * @param string $key
     *
     * @return string
     */
    public static function getParameter($url, $key)
    {
        if (empty($key))
        {
            return '';
        }

        $uri = parse_url($url);

        if ( ! isset($uri['query']))
        {
            return '';
        }

        $query = self::parse_query($uri['query']);

        return $query[$key] ?? '';
    }

    /**
     * get all url parameters from the url
     *
     * @param string $url
     *
     * @return object
     */
    public static function getParameters($url)
    {
        $uri = parse_url($url);

        if ( ! isset($uri['query']))
        {
            return (object) [];
        }

        $query = self::parse_query($uri['query']);

        return (object) $query;
    }

    public static function isExternal($url)
    {
        if (strpos($url, '://') === false)
        {
            return false;
        }

        // hostname: give preference to SERVER_NAME, because this includes subdomains
        $hostname = ($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : $_SERVER['HTTP_HOST'];

        return ! (strpos(RegEx::replace('^.*?://', '', $url), $hostname) === 0);
    }

    /**
     * removes the given url parameter from the url
     *
     * @param string $url
     * @param string $key
     *
     * @return string
     */
    public static function removeParameter($url, $key)
    {
        if (empty($key))
        {
            return $url;
        }

        $uri = parse_url($url);

        if ( ! isset($uri['query']))
        {
            return $url;
        }

        $query = self::parse_query($uri['query']);
        unset($query[$key]);

        $uri['query'] = http_build_query($query);

        return self::createUrlFromArray($uri);
    }

    public static function route($url)
    {
        return JRoute::_(JUri::root(true) . '/' . $url);
    }

    /**
     * Parse a query string into an associative array.
     *
     * @param string $string
     *
     * @return array
     */
    private static function parse_query($string)
    {
        $result = [];

        if ($string === '')
        {
            return $result;
        }

        $decoder = fn($value) => rawurldecode(str_replace('+', ' ', $value));

        foreach (explode('&', $string) as $kvp)
        {
            $parts = explode('=', $kvp, 2);

            $key   = $decoder($parts[0]);
            $value = isset($parts[1]) ? $decoder($parts[1]) : null;

            if ( ! isset($result[$key]))
            {
                $result[$key] = $value;
                continue;
            }

            if ( ! is_array($result[$key]))
            {
                $result[$key] = [$result[$key]];
            }

            $result[$key][] = $value;
        }

        return $result;
    }
}
Site is undergoing maintenance

PACJA Events

Maintenance mode is on

Site will be available soon. Thank you for your patience!