elementor
/
modules
/
atomic-widgets
/
props-resolver
/
transformers
/
styles
/
font-family-transformer.php
font-family-transformer.php in Elementor Website Builder – more than just a page builder 4.3.2, at modules/atomic-widgets/props-resolver/transformers/styles/font-family-transformer.php
| 1 | <?php |
| 2 | |
| 3 | namespace Elementor\Modules\AtomicWidgets\PropsResolver\Transformers\Styles; |
| 4 | |
| 5 | use Elementor\Modules\AtomicWidgets\PropsResolver\Props_Resolver_Context; |
| 6 | use Elementor\Modules\AtomicWidgets\PropsResolver\Transformer_Base; |
| 7 | |
| 8 | if ( ! defined( 'ABSPATH' ) ) { |
| 9 | exit; // Exit if accessed directly. |
| 10 | } |
| 11 | |
| 12 | class Font_Family_Transformer extends Transformer_Base { |
| 13 | /** |
| 14 | * Per the CSS spec, font-family values only need to be quoted when they contain whitespace |
| 15 | * or special characters. Quoting is actively harmful for: |
| 16 | * - CSS variable references (`var(--x)` becomes a literal string, breaking resolution) |
| 17 | * - Generic families (`"sans-serif"` becomes a font named "sans-serif", not the generic) |
| 18 | * - CSS-wide keywords (`inherit`, `initial`, `unset`) |
| 19 | * - Any other CSS function like `local(...)` |
| 20 | * |
| 21 | * We only wrap values that actually need it (multi-word font names like "Open Sans"). |
| 22 | */ |
| 23 | public function transform( $value, Props_Resolver_Context $context ) { |
| 24 | if ( ! is_string( $value ) ) { |
| 25 | return null; |
| 26 | } |
| 27 | |
| 28 | $trimmed = trim( $value ); |
| 29 | |
| 30 | if ( '' === $trimmed || $this->is_already_quoted( $trimmed ) ) { |
| 31 | return $trimmed; |
| 32 | } |
| 33 | |
| 34 | // Only multi-word font names (e.g. `Open Sans`) need to be wrapped in quotes. |
| 35 | // Single-token values like `var(--x)`, `sans-serif` or `inherit` must stay unquoted to remain valid CSS. |
| 36 | return preg_match( '/\s/', $trimmed ) |
| 37 | ? '"' . $trimmed . '"' |
| 38 | : $trimmed; |
| 39 | } |
| 40 | |
| 41 | private function is_already_quoted( string $value ): bool { |
| 42 | return ( str_starts_with( $value, '"' ) && str_ends_with( $value, '"' ) ) |
| 43 | || ( str_starts_with( $value, "'" ) && str_ends_with( $value, "'" ) ); |
| 44 | } |
| 45 | } |
| 46 |