1 | <?php |
||
2 | /** |
||
3 | * Generates the styles for the frontend. |
||
4 | * Handles the 'output' argument of fields |
||
5 | * |
||
6 | * @package Kirki |
||
7 | * @category Core |
||
8 | * @author Aristeides Stathopoulos |
||
9 | * @copyright Copyright (c) 2017, Aristeides Stathopoulos |
||
10 | * @license https://opensource.org/licenses/MIT |
||
11 | * @since 1.0 |
||
12 | */ |
||
13 | |||
14 | // Exit if accessed directly. |
||
15 | if ( ! defined( 'ABSPATH' ) ) { |
||
16 | exit; |
||
17 | } |
||
18 | |||
19 | /** |
||
20 | * Handles CSS output. |
||
21 | */ |
||
22 | final class Kirki_Modules_CSS_Generator { |
||
23 | |||
24 | /** |
||
25 | * The instance of this class (singleton pattern). |
||
26 | * |
||
27 | * @static |
||
28 | * @access public |
||
29 | * @var null|object |
||
30 | */ |
||
31 | public static $instance = null; |
||
32 | |||
33 | /** |
||
34 | * Settings. |
||
35 | * |
||
36 | * @static |
||
37 | * @access public |
||
38 | * @var null|string|array |
||
39 | */ |
||
40 | public static $settings = null; |
||
41 | |||
42 | /** |
||
43 | * Output. |
||
44 | * |
||
45 | * @static |
||
46 | * @access public |
||
47 | * @var array |
||
48 | */ |
||
49 | public static $output = array(); |
||
50 | |||
51 | /** |
||
52 | * Callback. |
||
53 | * |
||
54 | * @static |
||
55 | * @access public |
||
56 | * @var null|string|array |
||
57 | */ |
||
58 | public static $callback = null; |
||
59 | |||
60 | /** |
||
61 | * Option Name. |
||
62 | * |
||
63 | * @static |
||
64 | * @access public |
||
65 | * @var null|string |
||
66 | */ |
||
67 | public static $option_name = null; |
||
68 | |||
69 | /** |
||
70 | * Field Type. |
||
71 | * |
||
72 | * @static |
||
73 | * @access public |
||
74 | * @var string |
||
75 | */ |
||
76 | public static $field_type = null; |
||
77 | |||
78 | /** |
||
79 | * Google Fonts |
||
80 | * |
||
81 | * @static |
||
82 | * @access public |
||
83 | * @var array |
||
84 | */ |
||
85 | public static $google_fonts = null; |
||
86 | |||
87 | /** |
||
88 | * Standard Fonts |
||
89 | * |
||
90 | * @static |
||
91 | * @access public |
||
92 | * @var array |
||
93 | */ |
||
94 | public static $backup_fonts = null; |
||
95 | |||
96 | /** |
||
97 | * CSS |
||
98 | * |
||
99 | * @static |
||
100 | * @access public |
||
101 | * @var string |
||
102 | */ |
||
103 | public static $css; |
||
104 | |||
105 | /** |
||
106 | * Value |
||
107 | * |
||
108 | * @static |
||
109 | * @access public |
||
110 | * @var mixed |
||
111 | */ |
||
112 | public static $value = null; |
||
113 | |||
114 | /** |
||
115 | * The class constructor. |
||
116 | */ |
||
117 | private function __construct() { |
||
118 | if ( is_null( self::$google_fonts ) ) { |
||
0 ignored issues
–
show
introduced
by
Loading history...
|
|||
119 | self::$google_fonts = Kirki_Fonts::get_google_fonts(); |
||
120 | } |
||
121 | if ( is_null( self::$backup_fonts ) ) { |
||
0 ignored issues
–
show
|
|||
122 | self::$backup_fonts = Kirki_Fonts::get_backup_fonts(); |
||
123 | } |
||
124 | } |
||
125 | |||
126 | /** |
||
127 | * Get a single instance of this class |
||
128 | * |
||
129 | * @return object |
||
130 | */ |
||
131 | public static function get_instance() { |
||
132 | if ( null === self::$instance ) { |
||
133 | self::$instance = new self(); |
||
134 | } |
||
135 | return self::$instance; |
||
136 | } |
||
137 | |||
138 | /** |
||
139 | * Get the CSS for a field. |
||
140 | * |
||
141 | * @static |
||
142 | * @access public |
||
143 | * @param array $field The field. |
||
144 | * @return array |
||
145 | */ |
||
146 | public static function css( $field ) { |
||
147 | |||
148 | // Set class vars. |
||
149 | self::$settings = $field['settings']; |
||
150 | self::$callback = $field['sanitize_callback']; |
||
151 | self::$field_type = $field['type']; |
||
152 | self::$output = $field['output']; |
||
153 | if ( ! is_array( self::$output ) ) { |
||
154 | self::$output = array( |
||
155 | array( |
||
156 | 'element' => self::$output, |
||
157 | 'sanitize_callback' => null, |
||
158 | ), |
||
159 | ); |
||
160 | } |
||
161 | |||
162 | // Get the value of this field. |
||
163 | self::$value = Kirki_Values::get_sanitized_field_value( $field ); |
||
164 | |||
165 | // Find the class that will handle the outpout for this field. |
||
166 | $classname = 'Kirki_Output'; |
||
167 | $field_output_classes = apply_filters( |
||
168 | "kirki_{$field['kirki_config']}_output_control_classnames", array( |
||
169 | 'kirki-background' => 'Kirki_Output_Field_Background', |
||
170 | 'kirki-dimensions' => 'Kirki_Output_Field_Dimensions', |
||
171 | 'kirki-image' => 'Kirki_Output_Field_Image', |
||
172 | 'kirki-typography' => 'Kirki_Output_Field_Typography', |
||
173 | 'kirki-multicolor' => 'Kirki_Output_Field_Multicolor', |
||
174 | ) |
||
175 | ); |
||
176 | if ( array_key_exists( self::$field_type, $field_output_classes ) ) { |
||
177 | $classname = $field_output_classes[ self::$field_type ]; |
||
178 | } |
||
179 | $obj = new $classname( $field['kirki_config'], self::$output, self::$value, $field ); |
||
180 | return $obj->get_styles(); |
||
181 | } |
||
182 | |||
183 | /** |
||
184 | * Gets the array of generated styles and creates the minimized, inline CSS. |
||
185 | * |
||
186 | * @static |
||
187 | * @access public |
||
188 | * @param array $css The CSS definitions array. |
||
189 | * @return string The generated CSS. |
||
190 | */ |
||
191 | public static function styles_parse( $css = array() ) { |
||
192 | |||
193 | // Pass our styles from the kirki_styles_array filter. |
||
194 | $css = apply_filters( 'kirki_styles_array', $css ); |
||
195 | |||
196 | // Process the array of CSS properties and produce the final CSS. |
||
197 | $final_css = ''; |
||
198 | if ( ! is_array( $css ) || empty( $css ) ) { |
||
199 | return ''; |
||
200 | } |
||
201 | foreach ( $css as $media_query => $styles ) { |
||
202 | $final_css .= ( 'global' !== $media_query ) ? $media_query . '{' : ''; |
||
203 | foreach ( $styles as $style => $style_array ) { |
||
204 | $css_for_style = ''; |
||
205 | |||
206 | foreach ( $style_array as $property => $value ) { |
||
207 | if ( is_string( $value ) && '' !== $value ) { |
||
208 | $css_for_style .= $property . ':' . $value . ';'; |
||
209 | } elseif ( is_array( $value ) ) { |
||
210 | foreach ( $value as $subvalue ) { |
||
211 | if ( is_string( $subvalue ) && '' !== $subvalue ) { |
||
212 | $css_for_style .= $property . ':' . $subvalue . ';'; |
||
213 | } |
||
214 | } |
||
215 | } |
||
216 | $value = ( is_string( $value ) ) ? $value : ''; |
||
217 | } |
||
218 | if ( '' !== $css_for_style ) { |
||
219 | $final_css .= $style . '{' . $css_for_style . '}'; |
||
220 | } |
||
221 | } |
||
222 | $final_css .= ( 'global' !== $media_query ) ? '}' : ''; |
||
223 | } |
||
224 | return $final_css; |
||
225 | } |
||
226 | |||
227 | /** |
||
228 | * Add prefixes if necessary. |
||
229 | * |
||
230 | * @param array $css The CSS definitions array. |
||
231 | * @return array |
||
232 | */ |
||
233 | public static function add_prefixes( $css ) { |
||
234 | if ( is_array( $css ) ) { |
||
0 ignored issues
–
show
|
|||
235 | foreach ( $css as $media_query => $elements ) { |
||
236 | foreach ( $elements as $element => $style_array ) { |
||
237 | foreach ( $style_array as $property => $value ) { |
||
238 | |||
239 | // Add -webkit-* and -moz-*. |
||
240 | if ( is_string( $property ) && in_array( |
||
241 | $property, array( |
||
242 | 'border-radius', |
||
243 | 'box-shadow', |
||
244 | 'box-sizing', |
||
245 | 'text-shadow', |
||
246 | 'transform', |
||
247 | 'background-size', |
||
248 | 'transition', |
||
249 | 'transition-property', |
||
250 | ), true |
||
251 | ) ) { |
||
252 | unset( $css[ $media_query ][ $element ][ $property ] ); |
||
253 | $css[ $media_query ][ $element ][ '-webkit-' . $property ] = $value; |
||
254 | $css[ $media_query ][ $element ][ '-moz-' . $property ] = $value; |
||
255 | $css[ $media_query ][ $element ][ $property ] = $value; |
||
256 | } |
||
257 | |||
258 | // Add -ms-* and -o-*. |
||
259 | if ( is_string( $property ) && in_array( |
||
260 | $property, array( |
||
261 | 'transform', |
||
262 | 'background-size', |
||
263 | 'transition', |
||
264 | 'transition-property', |
||
265 | ), true |
||
266 | ) ) { |
||
267 | unset( $css[ $media_query ][ $element ][ $property ] ); |
||
268 | $css[ $media_query ][ $element ][ '-ms-' . $property ] = $value; |
||
269 | $css[ $media_query ][ $element ][ '-o-' . $property ] = $value; |
||
270 | $css[ $media_query ][ $element ][ $property ] = $value; |
||
271 | } |
||
272 | } |
||
273 | } |
||
274 | } |
||
275 | } |
||
276 | return $css; |
||
277 | } |
||
278 | } |
||
279 |