$curr_block_name ) { $js_assets = ( isset( $blocks[ $curr_block_name ]['js_assets'] ) ) ? $blocks[ $curr_block_name ]['js_assets'] : array(); $css_assets = ( isset( $blocks[ $curr_block_name ]['css_assets'] ) ) ? $blocks[ $curr_block_name ]['css_assets'] : array(); foreach ( $js_assets as $asset_handle => $val ) { // Scripts. if ( 'wpsp-faq-js' === $val ) { if ( self::$wpsp_faq_layout ) { wp_enqueue_script( 'wpsp-faq-js' ); } } else { wp_enqueue_script( $val ); } } foreach ( $css_assets as $asset_handle => $val ) { // Styles. wp_enqueue_style( $val ); } } } /** * Print the Script in footer. */ public function print_script() { ob_start(); ?> $gfont_values ) { if ( ! empty( $link ) ) { $link .= '%7C'; // Append a new font to the string. } $link .= $gfont_values['fontfamily']; if ( ! empty( $gfont_values['fontvariants'] ) ) { $link .= ':'; $link .= implode( ',', $gfont_values['fontvariants'] ); } if ( ! empty( $gfont_values['fontsubsets'] ) ) { foreach ( $gfont_values['fontsubsets'] as $subset ) { if ( ! in_array( $subset, $subsets, true ) ) { array_push( $subsets, $subset ); } } } } if ( ! empty( $subsets ) ) { $link .= '&subset=' . implode( ',', $subsets ); } if ( isset( $link ) && ! empty( $link ) ) { echo ''; //phpcs:ignore WordPress.WP.EnqueuedResources.NonEnqueuedStylesheet } } /** * Parse CSS into correct CSS syntax. * * @param array $selectors The block selectors. * @param string $id The selector ID. * @since 2.2.0 */ public static function generate_css( $selectors, $id ) { $styling_css = ''; if ( empty( $selectors ) ) { return ''; } foreach ( $selectors as $key => $value ) { $css = ''; foreach ( $value as $j => $val ) { if ( 'font-family' === $j && 'Default' === $val ) { continue; } if ( ! empty( $val ) || 0 === $val ) { if ( 'font-family' === $j ) { $css .= $j . ': "' . $val . '";'; } else { $css .= $j . ': ' . $val . ';'; } } } if ( ! empty( $css ) ) { $styling_css .= $id; $styling_css .= $key . '{'; $styling_css .= $css . '}'; } } return $styling_css; } /** * Get CSS value * * Syntax: * * get_css_value( VALUE, UNIT ); * * E.g. * * get_css_value( VALUE, 'em' ); * * @param string $value CSS value. * @param string $unit CSS unit. * @since 2.2.0 */ public static function get_css_value( $value = '', $unit = '' ) { if ( '' == $value ) { // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison return $value; } $css_val = ''; if ( ! empty( $value ) ) { $css_val = esc_attr( $value ) . $unit; } return $css_val; } /** * Generates CSS recurrsively. * * @param object $block The block object. * @since 2.2.0 */ public function get_block_css_and_js( $block ) { $block = (array) $block; $name = $block['blockName']; $css = array(); $js = ''; $block_id = ''; if ( ! isset( $name ) ) { return array( 'css' => array(), 'js' => '', ); } $blockattr = array(); if ( isset( $block['attrs'] ) && is_array( $block['attrs'] ) ) { $blockattr = $block['attrs']; if ( isset( $blockattr['block_id'] ) ) { $block_id = $blockattr['block_id']; } } self::$current_block_list[] = $name; if ( strpos( $name, 'wpsp/' ) !== false ) { self::$wpsp_flag = true; } switch ( $name ) { case 'wpsp/faq': if ( ! empty( $blockattr ) ) { $css = BSF_SP_Block_Helper::get_faq_css( $blockattr, $block_id ); if ( ! isset( $blockattr['layout'] ) ) { self::$wpsp_faq_layout = true; } BSF_SP_Block_JS::blocks_faq_gfont( $blockattr ); } break; case 'wpsp/how-to': if ( ! empty( $blockattr ) ) { $css += BSF_SP_Block_Helper::get_how_to_css( $blockattr, $block_id ); BSF_SP_Block_JS::blocks_how_to_gfont( $blockattr ); } break; case 'wpsp/how-to-child': if ( ! empty( $blockattr ) ) { $css += BSF_SP_Block_Helper::get_how_to_child_css( $blockattr, $block_id ); BSF_SP_Block_JS::blocks_how_to_child_gfont( $blockattr ); } break; default: // Nothing to do here. break; } if ( isset( $block['innerBlocks'] ) ) { foreach ( $block['innerBlocks'] as $j => $inner_block ) { if ( 'core/block' === $inner_block['blockName'] ) { $id = ( isset( $inner_block['attrs']['ref'] ) ) ? $inner_block['attrs']['ref'] : 0; if ( $id ) { $content = get_post_field( 'post_content', $id ); $reusable_blocks = $this->parse( $content ); $assets = $this->get_assets( $reusable_blocks ); self::$stylesheet .= $assets['css']; self::$script .= $assets['js']; } } else { // Get CSS for the Block. $inner_assets = $this->get_block_css_and_js( $inner_block ); $inner_block_css = $inner_assets['css']; $css_desktop = ( isset( $css['desktop'] ) ? $css['desktop'] : '' ); $css_tablet = ( isset( $css['tablet'] ) ? $css['tablet'] : '' ); $css_mobile = ( isset( $css['mobile'] ) ? $css['mobile'] : '' ); if ( isset( $inner_block_css['desktop'] ) ) { $css['desktop'] = $css_desktop . $inner_block_css['desktop']; $css['tablet'] = $css_tablet . $inner_block_css['tablet']; $css['mobile'] = $css_mobile . $inner_block_css['mobile']; } $js .= $inner_assets['js']; } } } self::$current_block_list = array_unique( self::$current_block_list ); return array( 'css' => $css, 'js' => $js, ); } /** * Adds Google fonts all blocks. * * @param array $load_google_font the blocks attr. * @param array $font_family the blocks attr. * @param array $font_weight the blocks attr. * @param array $font_subset the blocks attr. */ public static function blocks_google_font( $load_google_font, $font_family, $font_weight, $font_subset ) { if ( true === $load_google_font ) { if ( ! array_key_exists( $font_family, self::$gfonts ) ) { $add_font = array( 'fontfamily' => $font_family, 'fontvariants' => ( isset( $font_weight ) && ! empty( $font_weight ) ? array( $font_weight ) : array() ), 'fontsubsets' => ( isset( $font_subset ) && ! empty( $font_subset ) ? array( $font_subset ) : array() ), ); self::$gfonts[ $font_family ] = $add_font; } else { if ( isset( $font_weight ) && ! empty( $font_weight ) && ! in_array( $font_weight, self::$gfonts[ $font_family ]['fontvariants'], true ) ) { array_push( self::$gfonts[ $font_family ]['fontvariants'], $font_weight ); } if ( isset( $font_subset ) && ! empty( $font_subset ) && ! in_array( $font_subset, self::$gfonts[ $font_family ]['fontsubsets'], true ) ) { array_push( self::$gfonts[ $font_family ]['fontsubsets'], $font_subset ); } } } } /** * Generates stylesheet and appends in head tag. * * @since 2.2.0 */ public function generate_assets() { $this_post = array(); global $post; $this_post = $post; if ( ! is_object( $this_post ) ) { return; } /** * Filters the post to build stylesheet for. * * @param \WP_Post $this_post The global post. */ $this_post = apply_filters( 'wpsp_post_for_stylesheet', $this_post ); $this->get_generated_stylesheet( $this_post ); } /** * Generates stylesheet in loop. * * @param object $this_post Current Post Object. * @since 2.2.0 */ public function get_generated_stylesheet( $this_post ) { if ( ! is_object( $this_post ) ) { return; } if ( ! isset( $this_post->ID ) ) { return; } if ( function_exists( 'has_blocks' ) && has_blocks( $this_post->ID ) && isset( $this_post->post_content ) ) { $blocks = $this->parse( $this_post->post_content ); self::$page_blocks = $blocks; if ( ! is_array( $blocks ) || empty( $blocks ) ) { return; } $assets = $this->get_assets( $blocks ); self::$stylesheet .= $assets['css']; self::$script .= $assets['js']; } } /** * Parse Guten Block. * * @param string $content the content string. * @since 2.2.0 */ public function parse( $content ) { global $wp_version; return ( version_compare( $wp_version, '5', '>=' ) ) ? parse_blocks( $content ) : gutenberg_parse_blocks( $content ); } /** * Generates stylesheet for reusable blocks. * * @param array $blocks Blocks array. * @since 2.2.0 */ public function get_assets( $blocks ) { $desktop = ''; $tablet = ''; $mobile = ''; $tab_styling_css = ''; $mob_styling_css = ''; $js = ''; foreach ( $blocks as $i => $block ) { if ( is_array( $block ) ) { if ( '' === $block['blockName'] ) { continue; } if ( 'core/block' === $block['blockName'] ) { $id = ( isset( $block['attrs']['ref'] ) ) ? $block['attrs']['ref'] : 0; if ( $id ) { $content = get_post_field( 'post_content', $id ); $reusable_blocks = $this->parse( $content ); $assets = $this->get_assets( $reusable_blocks ); self::$stylesheet .= $assets['css']; self::$script .= $assets['js']; } } else { $block_assets = $this->get_block_css_and_js( $block ); // Get CSS for the Block. $css = $block_assets['css']; if ( isset( $css['desktop'] ) ) { $desktop .= $css['desktop']; $tablet .= $css['tablet']; $mobile .= $css['mobile']; } $js .= $block_assets['js']; } } } if ( ! empty( $tablet ) ) { $tab_styling_css .= '@media only screen and (max-width: ' . WPSP_TABLET_BREAKPOINT . 'px) {'; $tab_styling_css .= $tablet; $tab_styling_css .= '}'; } if ( ! empty( $mobile ) ) { $mob_styling_css .= '@media only screen and (max-width: ' . WPSP_MOBILE_BREAKPOINT . 'px) {'; $mob_styling_css .= $mobile; $mob_styling_css .= '}'; } return array( 'css' => $desktop . $tab_styling_css . $mob_styling_css, 'js' => $js, ); } /** * Get Typography Dynamic CSS. * * @param array $attr The Attribute array. * @param string $slug The field slug. * @param string $selector The selector array. * @param array $combined_selectors The combined selector array. * @since 2.2.0 * @return bool|string */ public static function get_typography_css( $attr, $slug, $selector, $combined_selectors ) { $typo_css_desktop = array(); $typo_css_tablet = array(); $typo_css_mobile = array(); $already_selectors_desktop = ( isset( $combined_selectors['desktop'][ $selector ] ) ) ? $combined_selectors['desktop'][ $selector ] : array(); $already_selectors_tablet = ( isset( $combined_selectors['tablet'][ $selector ] ) ) ? $combined_selectors['tablet'][ $selector ] : array(); $already_selectors_mobile = ( isset( $combined_selectors['mobile'][ $selector ] ) ) ? $combined_selectors['mobile'][ $selector ] : array(); $family_slug = ( '' === $slug ) ? 'fontFamily' : $slug . 'FontFamily'; $weight_slug = ( '' === $slug ) ? 'fontWeight' : $slug . 'FontWeight'; $l_ht_slug = ( '' === $slug ) ? 'lineHeight' : $slug . 'LineHeight'; $f_sz_slug = ( '' === $slug ) ? 'fontSize' : $slug . 'FontSize'; $l_ht_type_slug = ( '' === $slug ) ? 'lineHeightType' : $slug . 'LineHeightType'; $f_sz_type_slug = ( '' === $slug ) ? 'fontSizeType' : $slug . 'FontSizeType'; $typo_css_desktop[ $selector ] = array( 'font-family' => $attr[ $family_slug ], 'font-weight' => $attr[ $weight_slug ], 'font-size' => ( isset( $attr[ $f_sz_slug ] ) ) ? self::get_css_value( $attr[ $f_sz_slug ], $attr[ $f_sz_type_slug ] ) : '', 'line-height' => ( isset( $attr[ $l_ht_slug ] ) ) ? self::get_css_value( $attr[ $l_ht_slug ], $attr[ $l_ht_type_slug ] ) : '', ); $typo_css_desktop[ $selector ] = array_merge( $typo_css_desktop[ $selector ], $already_selectors_desktop ); $typo_css_tablet[ $selector ] = array( 'font-size' => ( isset( $attr[ $f_sz_slug . 'Tablet' ] ) ) ? self::get_css_value( $attr[ $f_sz_slug . 'Tablet' ], $attr[ $f_sz_type_slug ] ) : '', 'line-height' => ( isset( $attr[ $l_ht_slug . 'Tablet' ] ) ) ? self::get_css_value( $attr[ $l_ht_slug . 'Tablet' ], $attr[ $l_ht_type_slug ] ) : '', ); $typo_css_tablet[ $selector ] = array_merge( $typo_css_tablet[ $selector ], $already_selectors_tablet ); $typo_css_mobile[ $selector ] = array( 'font-size' => ( isset( $attr[ $f_sz_slug . 'Mobile' ] ) ) ? self::get_css_value( $attr[ $f_sz_slug . 'Mobile' ], $attr[ $f_sz_type_slug ] ) : '', 'line-height' => ( isset( $attr[ $l_ht_slug . 'Mobile' ] ) ) ? self::get_css_value( $attr[ $l_ht_slug . 'Mobile' ], $attr[ $l_ht_type_slug ] ) : '', ); $typo_css_mobile[ $selector ] = array_merge( $typo_css_mobile[ $selector ], $already_selectors_mobile ); return array( 'desktop' => array_merge( $combined_selectors['desktop'], $typo_css_desktop ), 'tablet' => array_merge( $combined_selectors['tablet'], $typo_css_tablet ), 'mobile' => array_merge( $combined_selectors['mobile'], $typo_css_mobile ), ); } /** * Parse CSS into correct CSS syntax. * * @param array $combined_selectors The combined selector array. * @param string $id The selector ID. * @since 2.2.0 */ public static function generate_all_css( $combined_selectors, $id ) { return array( 'desktop' => self::generate_css( $combined_selectors['desktop'], $id ), 'tablet' => self::generate_css( $combined_selectors['tablet'], $id ), 'mobile' => self::generate_css( $combined_selectors['mobile'], $id ), ); } /** * Get an instance of WP_Filesystem_Direct. * * @since 1.14.4 * @return object A WP_Filesystem_Direct instance. */ public function get_filesystem() { global $wp_filesystem; require_once ABSPATH . '/wp-admin/includes/file.php'; WP_Filesystem(); return $wp_filesystem; } } /** * Prepare if class 'BSF_SP_Helper' exist. * Kicking this off by calling 'get_instance()' method */ BSF_SP_Helper::get_instance(); }