Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 37
0.00% covered (danger)
0.00%
0 / 6
CRAP
n/a
0 / 0
jetpack_rating_meta_get_symbol_low_fidelity
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
jetpack_rating_star_get_symbol_high_fidelity
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
2
jetpack_rating_meta_get_symbol_high_fidelity
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
20
jetpack_rating_get_schema_for_symbol
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
12
jetpack_rating_meta_get_symbols
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
12
jetpack_rating_meta_render_block
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 1
12
1<?php
2/**
3 * Utilities for the rating block.
4 *
5 * @since 8.0.0
6 *
7 * @package automattic/jetpack
8 */
9
10if ( ! function_exists( 'jetpack_rating_meta_get_symbol_low_fidelity' ) ) {
11    /**
12     * Returns the low fidelity symbol for the block.
13     *
14     * @return string
15     */
16    function jetpack_rating_meta_get_symbol_low_fidelity() {
17        return '<span aria-hidden="true">⭐</span>';
18    }
19}
20
21if ( ! function_exists( 'jetpack_rating_star_get_symbol_high_fidelity' ) ) {
22    /**
23     * Return the high fidelity symbol for the block.
24     *
25     * @param string $classname_whole Name of the whole symbol class.
26     * @param string $classname_half Name of the half symbol class.
27     * @param string $color Color of the block.
28     *
29     * @return string
30     */
31    function jetpack_rating_star_get_symbol_high_fidelity( $classname_whole, $classname_half, $color ) {
32        return <<<ELO
33<span>
34<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
35    <path class="{$classname_whole}" fill="{$color}" stroke="{$color}" d="M12,17.3l6.2,3.7l-1.6-7L22,9.2l-7.2-0.6L12,2L9.2,8.6L2,9.2L7.5,14l-1.6,7L12,17.3z" />
36</svg>
37</span>
38<span>
39<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
40    <path class="{$classname_half}" fill="{$color}" stroke="{$color}" d="M12,17.3l6.2,3.7l-1.6-7L22,9.2l-7.2-0.6L12,2L9.2,8.6L2,9.2L7.5,14l-1.6,7L12,17.3z" />
41</svg>
42</span>
43ELO;
44    }
45}
46
47if ( ! function_exists( 'jetpack_rating_meta_get_symbol_high_fidelity' ) ) {
48    /**
49     * Returns the high fidelity symbol for the block.
50     *
51     * @param array   $attributes Array containing the block attributes.
52     * @param integer $pos Value to render whole and half symbols.
53     * @return string
54     */
55    function jetpack_rating_meta_get_symbol_high_fidelity( $attributes, $pos ) {
56        $classname_whole = ( $attributes['rating'] >= ( $pos - 0.5 ) ) ? '' : 'is-rating-unfilled';
57        $classname_half  = ( $attributes['rating'] >= $pos ) ? '' : 'is-rating-unfilled';
58        $color           = empty( $attributes['color'] ) ? 'currentColor' : esc_attr( $attributes['color'] );
59
60        return jetpack_rating_star_get_symbol_high_fidelity( $classname_whole, $classname_half, $color );
61    }
62}
63
64if ( ! function_exists( 'jetpack_rating_get_schema_for_symbol' ) ) {
65    /**
66     * Returns an itemprop and content for rating symbols
67     *
68     * @param  integer $position   the position of the symbol.
69     * @param  integer $max_rating the maximum symbol score.
70     *
71     * @return string
72     */
73    function jetpack_rating_get_schema_for_symbol( $position, $max_rating ) {
74        $schema = '';
75        if ( 1 === $position ) {
76            $schema = 'itemprop="worstRating" content="0.5"';
77        } elseif ( $max_rating === $position ) {
78            $schema = 'itemprop="bestRating" content="' . esc_attr( $max_rating ) . '"';
79        }
80        return $schema;
81    }
82}
83
84if ( ! function_exists( 'jetpack_rating_meta_get_symbols' ) ) {
85    /**
86     * Returns the symbol for the block.
87     *
88     * @param array $attributes Array containing the block attributes.
89     *
90     * @return string
91     */
92    function jetpack_rating_meta_get_symbols( $attributes ) {
93        // Output SVGs for high fidelity contexts, then color them according to rating.
94        // These are hidden by default, then unhid when CSS loads.
95        $symbols_hifi = array();
96        for ( $pos = 1; $pos <= $attributes['maxRating']; $pos++ ) {
97            $symbols_hifi[] = '<span style="display: none;" ' . jetpack_rating_get_schema_for_symbol( $pos, $attributes['maxRating'] ) . '>' . jetpack_rating_meta_get_symbol_high_fidelity( $attributes, $pos ) . '</span>';
98        }
99
100        // Output fallback symbols for low fidelity contexts, like AMP,
101        // where CSS is not loaded so the high-fidelity symbols won't be rendered.
102        $symbols_lofi = '';
103        for ( $i = 0; $i < $attributes['rating']; $i++ ) {
104            $symbols_lofi .= jetpack_rating_meta_get_symbol_low_fidelity();
105        }
106
107        return '<p>' . $symbols_lofi . '</p>' . implode( $symbols_hifi );
108    }
109}
110
111if ( ! function_exists( 'jetpack_rating_meta_render_block' ) ) {
112    /**
113     * Dynamic rendering of the block.
114     *
115     * @param array $attributes Array containing the block attributes.
116     *
117     * @return string
118     */
119    function jetpack_rating_meta_render_block( $attributes ) {
120        $classname = empty( $attributes['className'] ) ? '' : ' ' . $attributes['className'];
121        return sprintf(
122            '<div class="%1$s" style="text-align:%4$s" itemprop="reviewRating" itemscope itemtype="http://schema.org/Rating">%2$s%3$s</div>',
123            esc_attr( 'wp-block-jetpack-rating-' . $attributes['ratingStyle'] . $classname ),
124            jetpack_rating_meta_get_symbols( $attributes ),
125            // translators: %1$s is awarded rating score, %2$s is the best possible rating.
126            '<span itemprop="ratingValue" class="screen-reader-text" content="' . esc_attr( $attributes['rating'] ) . '">' . sprintf( __( 'Rating: %1$s out of %2$s.', 'jetpack' ), esc_attr( $attributes['rating'] ), esc_attr( $attributes['maxRating'] ) ) . '</span>',
127            ( isset( $attributes['align'] ) ) ? esc_attr( $attributes['align'] ) : ''
128        );
129    }
130}