| Current Path : /var/www/html/libraries/noboss/src/Util/ |
| 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);
}
}