PluginProbe
BlockSpare – Gutenberg Blocks, AI Content Generator & Site Builder for News, Magazine & Blogs / 5.0.1
BlockSpare – Gutenberg Blocks, AI Content Generator & Site Builder for News, Magazine & Blogs v5.0.1
5.0.1 4.1.0 trunk 1.0.0 1.0.1 1.0.2 1.0.3 1.0.4 1.0.5 1.1.0 1.1.1 1.1.2 1.2.0 1.2.1 1.2.2 1.2.3 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 2.1.2 2.5.0 2.5.3 All 39 releases
← All changes | inc/fonts.php +107 -92 2.1.2 → 5.0.1 View file →
@@ -1,115 +1,130 @@
1 1 <?php
2 2
3 3 // Exit if accessed directly.
4 -if ( ! defined( 'ABSPATH' ) ) {
5 - exit;
4 +if (! defined('ABSPATH')) {
5 + exit;
6 6 }
7 +if (! function_exists('bs_ends_with')) {
8 + /**
9 + * This function is only available in PHP 8.0 and above.
10 + *
11 + * @param {string} $haystack
12 + * @param {string} $needle
13 + * @return {boolean}
14 + */
15 + function bs_ends_with($haystack, $needle)
16 + {
17 + $needle_len = strlen($needle);
18 + return ($needle_len === 0 || 0 === substr_compare($haystack, $needle, -$needle_len));
19 + }
20 +}
7 21
8 -if ( ! class_exists( 'blockspare_Google_Fonts' ) ) {
9 - class blockspare_Google_Fonts {
22 +if (! class_exists('blockspare_Google_Fonts')) {
23 + class blockspare_Google_Fonts
24 + {
10 25
11 - function __construct() {
12 - add_action( 'wp_head', array( $this, 'enqueue_frontend_block_fonts' ), 100 );
13 - }
26 + public static $google_fonts = [];
14 27
15 - public function enqueue_frontend_block_fonts() {
16 -
17 -
18 -
19 - if ( ! apply_filters( 'blockspare_enqueue_fonts', true ) ) {
20 - return;
21 - }
28 + function __construct()
29 + {
22 30
23 - if ( is_single() || is_page() || is_404() ) {
24 - global $post;
25 - if ( is_object( $post ) && property_exists( $post, 'post_content' ) ) {
26 - $this->_enqueue_frontend_block_fonts( $post->post_content );
27 - }
28 - } elseif ( is_archive() || is_home() || is_search() ) {
29 - global $wp_query;
30 - foreach ( $wp_query as $post ) {
31 - if ( is_object( $post ) && property_exists( $post, 'post_content' ) ) {
32 - $this->_enqueue_frontend_block_fonts( $post->post_content );
33 - }
34 - }
35 - }
36 - }
31 + add_filter('render_block', array($this, 'bs_gather_google_fonts'), 10, 2);
32 + }
37 33
38 - public function _enqueue_frontend_block_fonts( $content ) {
39 - $blocks = parse_blocks( $content );
40 - $google_fonts = $this->gather_google_fonts( $blocks );
41 - $this->enqueue_google_fonts( $google_fonts );
42 - }
34 + public function bs_gather_google_fonts($block_content, $block)
35 + {
36 + if ($block_content === null) {
37 + return $block_content;
38 + }
43 39
44 - public function is_web_font( $font_name ) {
45 -
46 - return ! in_array( $font_name , [ 'Arial', 'Times New Roman', 'Helvetica', 'Georgia' ] );
47 - }
40 + $block_name = isset($block['blockName']) ? $block['blockName'] : '';
41 + if ($this->is_blockspare_block($block_name) && is_array($block['attrs'])) {
42 + // if (stripos($block_content, 'family') !== false) {
43 + foreach ($block['attrs'] as $attr_name => $font_name) {
44 + if (bs_ends_with(strtolower($attr_name), 'fontfamily')) {
45 + self::register_font($font_name);
46 + }
47 + }
48 + //}
49 + }
48 50
49 - public function is_blockspare_block( $block_name ) {
50 - return strpos( $block_name, 'blockspare/' ) === 0;
51 - }
51 + return $block_content;
52 + }
52 53
53 - public function gather_google_fonts( $blocks ) {
54 - $google_fonts = array();
55 - foreach ( $blocks as $block ) {
54 + public static function enqueue_frontend_block_fonts()
55 + {
56 + self::enqueue_google_fonts(array_unique(self::$google_fonts));
57 + }
56 58
57 - // Gather all "fontFamily" attribute values
58 - if ( $this->is_blockspare_block( $block['blockName'] ) ) {
59 - foreach ( $block['attrs'] as $attr_name => $font_name ) {
60 - if ( preg_match( '/fontFamily$/i', $attr_name ) ) {
61 - if ( ! $this->is_web_font( $font_name ) ) {
62 - continue;
63 - }
64 - if ( ! in_array( $font_name, $google_fonts ) ) {
65 - $google_fonts[] = $font_name;
66 - }
67 - }
68 - }
69 - }
70 - if ( ! empty( $block['innerBlocks'] ) ) {
71 - $google_fonts = array_unique( array_merge( $google_fonts, $this->gather_google_fonts( $block['innerBlocks'] ) ) );
72 - }
73 - }
59 + public static function is_web_font($font_name)
60 + {
74 61
75 - return $google_fonts;
76 - }
62 + return ! in_array(strtolower($font_name), ['Arial', 'Times New Roman', 'Helvetica', 'Georgia']);
63 + }
77 64
78 - /**
79 - * Based on: https://github.com/elementor/elementor/blob/bc251b81afb626c4c47029aea8a762566524a811/includes/frontend.php#L647
80 - */
81 - public function enqueue_google_fonts( $google_fonts ) {
82 - if ( ! count( $google_fonts) ) {
83 - return;
84 - }
65 + public static function is_blockspare_block($block_name)
66 + {
67 + if (!empty($block_name)) {
68 + return strpos($block_name, 'blockspare/') === 0;
69 + }
70 + return false;
71 + }
85 72
86 - foreach ( $google_fonts as &$font ) {
87 - $font = str_replace( ' ', '+', $font ) . ':100,100italic,200,200italic,300,300italic,400,400italic,500,500italic,600,600italic,700,700italic,800,800italic,900,900italic';
88 - }
73 + public static function register_font($font_name)
74 + {
75 + if (! self::is_web_font($font_name)) {
76 + return;
77 + }
89 78
90 - $fonts_url = sprintf( 'https://fonts.googleapis.com/css?family=%s', implode( rawurlencode( '|' ), $google_fonts ) );
79 + if (! in_array($font_name, self::$google_fonts)) {
80 + // Allow themes to disable enqueuing fonts, helpful for custom fonts.
81 + if (apply_filters('blockspare_enqueue_font', true, $font_name)) {
82 + self::$google_fonts[] = $font_name;
91 83
92 - $subsets = [
93 - 'ru_RU' => 'cyrillic',
94 - 'bg_BG' => 'cyrillic',
95 - 'he_IL' => 'hebrew',
96 - 'el' => 'greek',
97 - 'vi' => 'vietnamese',
98 - 'uk' => 'cyrillic',
99 - 'cs_CZ' => 'latin-ext',
100 - 'ro_RO' => 'latin-ext',
101 - 'pl_PL' => 'latin-ext',
102 - ];
84 + // Enqueue the fonts in the footer.
85 + add_filter('wp_footer', array('blockspare_Google_Fonts', 'enqueue_frontend_block_fonts'));
86 + }
87 + }
88 + }
103 89
104 - $locale = get_locale();
105 - if ( isset( $subsets[ $locale ] ) ) {
106 - $fonts_url .= '&subset=' . $subsets[ $locale ];
107 - }
108 90
109 - wp_enqueue_style( 'blockspare-google-fonts', $fonts_url ); // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.MissingVersion
110 - }
111 91
112 - }
113 92
114 - new blockspare_Google_Fonts();
93 + /**
94 + * Based on: https://github.com/elementor/elementor/blob/bc251b81afb626c4c47029aea8a762566524a811/includes/frontend.php#L647
95 + */
96 + public static function enqueue_google_fonts($google_fonts, $handle = 'blockspare-google-fonts')
97 + {
98 + if (! count($google_fonts)) {
99 + return;
100 + }
101 +
102 + foreach ($google_fonts as &$font) {
103 + $font = str_replace(' ', '+', $font) . ':100,100italic,200,200italic,300,300italic,400,400italic,500,500italic,600,600italic,700,700italic,800,800italic,900,900italic';
104 + }
105 +
106 + $fonts_url = sprintf('https://fonts.googleapis.com/css?family=%s', implode(rawurlencode('|'), $google_fonts));
107 +
108 + $subsets = [
109 + 'ru_RU' => 'cyrillic',
110 + 'bg_BG' => 'cyrillic',
111 + 'he_IL' => 'hebrew',
112 + 'el' => 'greek',
113 + 'vi' => 'vietnamese',
114 + 'uk' => 'cyrillic',
115 + 'cs_CZ' => 'latin-ext',
116 + 'ro_RO' => 'latin-ext',
117 + 'pl_PL' => 'latin-ext',
118 + ];
119 +
120 + $locale = get_locale();
121 + if (isset($subsets[$locale])) {
122 + $fonts_url .= '&subset=' . $subsets[$locale];
123 + }
124 +
125 + wp_enqueue_style($handle, $fonts_url); // phpcs:ignore WordPress.WP.EnqueuedResourceParameters.MissingVersion
126 + }
127 + }
128 +
129 + new blockspare_Google_Fonts();
115 130 }