Your IP : 216.73.216.224


Current Path : /var/www/html/libraries/noboss/src/Util/
Upload File :
Current File : /var/www/html/libraries/noboss/src/Util/NbFontsUtil.php

<?php
/**
 * @package			No Boss Extensions
 * @subpackage  	No Boss Library
 * @author			No Boss Technology <contact@nobosstechnology.com>
 * @copyright		Copyright (C) 2026 No Boss Technology. All rights reserved.
 * @license			GNU Lesser General Public License version 3 or later; see <https://www.gnu.org/licenses/lgpl-3.0.en.html>
 */

namespace Noboss\Library\Util;

use Joomla\CMS\Factory;
use Joomla\CMS\Uri\Uri;

// phpcs:disable PSR1.Files.SideEffects
\defined('_JEXEC') or die;
// phpcs:enable PSR1.Files.SideEffects

class NbFontsUtil {
    /**
    * Decodifica um valor do campo NbFontList (JSON) em objeto PHP.
     *
    * @param mixed $value Valor bruto do campo NbFontList.
     *
    * @return object|null Retorna objeto decodificado quando válido; caso contrário, null.
     */
    private static function decodeNobossfontlistValue($value)
    {
        if (!is_string($value) || $value === '') {
            return null;
        }

        $decoded = json_decode($value);

        if (!is_object($decoded) || !property_exists($decoded, 'fontfamily')) {
            return null;
        }

        return $decoded;
    }

    /**
        * Resolve a família de fonte efetiva considerando o valor do campo pai quando houver herança.
     *
        * @param object $fontData Dados do campo atual já decodificados.
        * @param string $fatherFieldValue Valor JSON bruto do campo pai (quando definido).
     *
        * @return string Nome da família de fonte efetiva.
     */
    private static function resolveEffectiveFontFamily($fontData, $fatherFieldValue)
    {
        if (!isset($fontData->fontfamily) || $fontData->fontfamily !== 'inherit') {
            return isset($fontData->fontfamily) ? $fontData->fontfamily : '';
        }

        $fatherData = self::decodeNobossfontlistValue($fatherFieldValue);
        if (!$fatherData || empty($fatherData->fontfamily) || $fatherData->fontfamily === 'inherit') {
            return 'inherit';
        }

        return $fatherData->fontfamily;
    }

	/**
     * Obtém o valor bruto (JSON) do campo pai de um NbFontList usando aliasfieldfather.
     *
     * @param mixed $fieldValue Valor bruto do campo filho NbFontList.
     * @param object $paramsObject Objeto com todos os parâmetros da extensão.
     *
     * @return string Retorna o valor JSON do campo pai quando encontrado; caso contrário, string vazia.
     */
    public static function getNobossfontlistFatherValue($fieldValue, $paramsObject)
    {
        if (!is_string($fieldValue) || $fieldValue === '') {
            return '';
        }

        $decoded = json_decode($fieldValue);

        if (!is_object($decoded) || empty($decoded->aliasfieldfather)) {
            return '';
        }

        $fatherAlias = (string) $decoded->aliasfieldfather;

        if (!is_object($paramsObject) || !property_exists($paramsObject, $fatherAlias) || !is_string($paramsObject->$fatherAlias)) {
            return '';
        }

        return $paramsObject->$fatherAlias;
    }

    /**
     * Importa uma fonte e retorna a declaração CSS de font-family (ou apenas o nome da fonte).
	 *
     * @param string $fontFile Nome do arquivo de fonte (ou valor especial inherit/external_linked).
     * @param string $fontUrl URL externa da fonte quando aplicável.
     * @param string $textFontStyle Estilo textual da fonte (ex.: Regular, Bold, Italic).
     * @param bool $onlyName Quando true retorna apenas o nome da fonte.
	 *
     * @return string Declaração CSS de font-family ou somente o nome da fonte.
	 */
     public static function importFont($fontFile, $fontUrl = '', $textFontStyle = 'Regular', $onlyName = false){
        $app = Factory::getApplication();
        $wa = $app->getDocument()->getWebAssetManager();

        // Herdar fonte da pagina
        if($fontFile == 'inherit'){
            $fontName = 'inherit';
        }
        // Utilizar fonte de url externa
        else if ($fontFile == 'external_linked'){
            if(!empty($fontUrl)){               
                // Obtem a url do arquivo sem a extensao
                $fontName = substr($fontUrl, 0, (strrpos($fontUrl, ".")));

                // Obtem somente o nome do arquivo
                //$fontName = substr($filename, strripos($filename, '/')+1);

                // Monta o Font Family a partir do nome do arquivo
                $fontName = 'Kalam-Bold';
    
                // Monta o código que deve ser posto na tag style
                $callCode = "@font-face { font-family: '{$fontName}'; src: url('{$fontUrl}')}\n";
        
                // Adiciona a codigo na tag style
                $wa->addInlineStyle($callCode);
            }else{
                $fontName = 'inherit';
            }
        }
        // Selecionada uma fonte da library
        else {
            $fontFormats = array(
                'ttf'   => 'truetype',
                'otf'   => 'opentype',
                'woff'  => 'woff',
                'woff2' => 'woff2',
                'svg'   => 'svg',
                'eot'   => 'embedded-opentype'
            );
            // Pega a extensão do arquivo
            $fileExt = pathinfo($fontFile, PATHINFO_EXTENSION);
            // Remove a extensão do arquivo
            $filename = substr($fontFile, 0 , (strrpos($fontFile, ".")));
            // Monta o Font Family a partir do nome do arquivo
            $fontName = str_replace('-', ' ', $filename);

            // Monta o caminho para o arquivo de fonte
            $fontPath = Uri::root().'libraries/noboss/src/Form/Field/assets/fonts/'.$fontFile;

            // Verifica se a fonte tem alguma estilização, ex. itálico ou negrito  
            if($textFontStyle != 'Regular'){               
                $styledFontFile = str_replace("Regular", $textFontStyle, $fontFile);
                $fontName = substr($styledFontFile, 0 , (strrpos($styledFontFile, ".")));

                // Monta o caminho até a fonte
                if(file_exists(JPATH_SITE.'/libraries/noboss/src/Form/Field/assets/fonts-stylized/'.$styledFontFile)){
                    // Monta o caminho até a fonte
                    $fontPath = Uri::root().'libraries/noboss/src/Form/Field/assets/fonts-stylized/'.$styledFontFile;
                }
            }

            $format = '';
            if ($fileExt != ''){
                $format = $fontFormats[$fileExt];
            }

            // Monta o código que deve ser posto na tag style
            $callCode = "@font-face { font-family: '{$fontName}'; src: url('{$fontPath}') format('{$format}')}\n";
    
            // Adiciona a codigo na tag style
            $wa->addInlineStyle($callCode);
        }
        // Verifica se deve retornar somente o nome da fonte ou a declaração css
        if (!$onlyName){
            if($fontName == "inherit"){
                // Retorna a declaracao css da fonte
                return 'font-family: ' . $fontName . ';';
            } else {
                // Retorna a declaracao css da fonte
                return 'font-family: "' . $fontName . '";';
            }
        } else {
            // Retorna o nome da fonte
            return $fontName;
        }
    }

    /**
        * Importa a fonte a partir do valor do campo NbFontList, resolvendo herança quando necessário.
     *
        * @param string $value Valor do campo NbFontList (JSON ou nome direto da fonte).
        * @param bool $onlyName Quando true retorna apenas o nome da fonte.
        * @param string $fatherFieldValue Valor JSON do campo pai.
     * 
	     * @return string Declaração CSS de font-family ou somente o nome da fonte.
     */
    public static function importNobossfontlist($value, $onlyName = false, $fatherFieldValue = ''){

        $decoded = self::decodeNobossfontlistValue($value);

        if ($decoded) {
            $effectiveFontFamily = self::resolveEffectiveFontFamily($decoded, $fatherFieldValue);
            $effectiveExternalLinked = isset($decoded->externalLinked) ? $decoded->externalLinked : '';
            $effectiveFontStyle = isset($decoded->fontStyle) ? $decoded->fontStyle : 'Regular';

            return self::importFont($effectiveFontFamily, $effectiveExternalLinked, $effectiveFontStyle, $onlyName);
        }

        return self::importFont($value, '', 'Regular', $onlyName);
    }

}