Completed
Push — update/editor-blocks-icon-colo... ( 093ab2...3cfb5e )
by
unknown
08:47
created

slideshow.php ➔ bullets()   A

Complexity

Conditions 2
Paths 1

Size

Total Lines 24

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
nc 1
nop 2
dl 0
loc 24
rs 9.536
c 0
b 0
f 0
1
<?php
2
/**
3
 * Slideshow Block.
4
 *
5
 * @since 7.1.0
6
 *
7
 * @package Jetpack
8
 */
9
10
namespace Automattic\Jetpack\Extensions\Slideshow;
11
12
use Jetpack_AMP_Support;
13
use Jetpack_Gutenberg;
14
15
const FEATURE_NAME = 'slideshow';
16
const BLOCK_NAME   = 'jetpack/' . FEATURE_NAME;
17
18
/**
19
 * Registers the block for use in Gutenberg
20
 * This is done via an action so that we can disable
21
 * registration if we need to.
22
 */
23
function register_block() {
24
	jetpack_register_block(
25
		BLOCK_NAME,
26
		array( 'render_callback' => __NAMESPACE__ . '\load_assets' )
27
	);
28
}
29
add_action( 'init', __NAMESPACE__ . '\register_block' );
30
31
/**
32
 * Slideshow block registration/dependency declaration.
33
 *
34
 * @param array  $attr    Array containing the slideshow block attributes.
35
 * @param string $content String containing the slideshow block content.
36
 *
37
 * @return string
38
 */
39 View Code Duplication
function load_assets( $attr, $content ) {
0 ignored issues
show
Duplication introduced by
This function seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
40
	Jetpack_Gutenberg::load_assets_as_required( FEATURE_NAME );
41
	if ( class_exists( 'Jetpack_AMP_Support' ) && Jetpack_AMP_Support::is_amp_request() ) {
42
		return render_amp( $attr );
43
	}
44
	return $content;
45
}
46
47
/**
48
 * Render slideshow block for AMP
49
 *
50
 * @param array $attr Array containing the slideshow block attributes.
51
 *
52
 * @return string
53
 */
54
function render_amp( $attr ) {
55
	if ( empty( $attr['ids'] ) ) {
56
		return '';
57
	}
58
59
	static $wp_block_jetpack_slideshow_id = 0;
60
	$wp_block_jetpack_slideshow_id++;
61
62
	$ids      = $attr['ids'];
63
	$autoplay = empty( $attr['autoplay'] ) ? false : true;
64
	$extras   = array(
65
		'wp-amp-block',
66
		$autoplay ? 'wp-block-jetpack-slideshow__autoplay' : null,
67
		$autoplay ? 'wp-block-jetpack-slideshow__autoplay-playing' : null,
68
	);
69
	$classes  = Jetpack_Gutenberg::block_classes( FEATURE_NAME, $attr, $extras );
70
71
	return sprintf(
72
		'<div class="%1$s" id="wp-block-jetpack-slideshow__%2$d"><div class="wp-block-jetpack-slideshow_container swiper-container">%3$s%4$s%5$s</div></div>',
73
		esc_attr( $classes ),
74
		absint( $wp_block_jetpack_slideshow_id ),
75
		amp_carousel( $attr, $wp_block_jetpack_slideshow_id ),
76
		$autoplay ? autoplay_ui( $wp_block_jetpack_slideshow_id ) : '',
77
		bullets( $ids, $wp_block_jetpack_slideshow_id )
78
	);
79
}
80
81
/**
82
 * Generate amp-carousel markup
83
 *
84
 * @param array $attr Array of block attributes.
85
 * @param int   $block_ordinal The ordinal number of the block, used in unique ID.
86
 *
87
 * @return string amp-carousel markup.
88
 */
89
function amp_carousel( $attr, $block_ordinal ) {
90
	$ids         = empty( $attr['ids'] ) ? array() : $attr['ids'];
91
	$first_image = wp_get_attachment_metadata( $ids[0] );
92
	$delay       = empty( $attr['delay'] ) ? 3 : absint( $attr['delay'] );
93
	$autoplay    = empty( $attr['autoplay'] ) ? false : $attr['autoplay'];
94
	$width       = empty( $first_image['width'] ) ? 800 : $first_image['width'];
95
	$height      = empty( $first_image['height'] ) ? 600 : $first_image['height'];
96
	return sprintf(
97
		'<amp-carousel width="%1$d" height="%2$d" layout="responsive" type="slides" data-next-button-aria-label="%3$s" data-prev-button-aria-label="%4$s" controls loop %5$s id="wp-block-jetpack-slideshow__amp-carousel__%6$s" on="slideChange:wp-block-jetpack-slideshow__amp-pagination__%6$s.toggle(index=event.index, value=true)">%7$s</amp-carousel>',
98
		esc_attr( $width ),
99
		esc_attr( $height ),
100
		esc_attr__( 'Next Slide', 'jetpack' ),
101
		esc_attr__( 'Previous Slide', 'jetpack' ),
102
		$autoplay ? 'autoplay delay=' . esc_attr( $delay * 1000 ) : '',
103
		absint( $block_ordinal ),
104
		implode( '', slides( $ids, $width, $height ) )
105
	);
106
}
107
108
/**
109
 * Generate array of slides markup
110
 *
111
 * @param array $ids Array of image ids.
112
 * @param int   $width Width of the container.
113
 * @param int   $height Height of the container.
114
 *
115
 * @return array Array of slides markup.
116
 */
117
function slides( $ids = array(), $width = 400, $height = 300 ) {
118
	return array_map(
119
		function( $id ) use ( $width, $height ) {
120
			$caption    = wp_get_attachment_caption( $id );
121
			$figcaption = $caption ? sprintf(
122
				'<figcaption class="wp-block-jetpack-slideshow_caption gallery-caption">%s</figcaption>',
123
				wp_kses_post( $caption )
124
			) : '';
125
			$image      = wp_get_attachment_image(
126
				$id,
127
				array( $width, $height ),
128
				false,
129
				array(
130
					'class'      => 'wp-block-jetpack-slideshow_image',
131
					'object-fit' => 'contain',
132
				)
133
			);
134
			return sprintf(
135
				'<div class="wp-block-jetpack-slideshow_slide"><figure>%s%s</figure></div>',
136
				$image,
137
				$figcaption
138
			);
139
		},
140
		$ids
141
	);
142
}
143
144
/**
145
 * Generate array of bullets markup
146
 *
147
 * @param array $ids Array of image ids.
148
 * @param int   $block_ordinal The ordinal number of the block, used in unique ID.
149
 *
150
 * @return array Array of bullets markup.
151
 */
152
function bullets( $ids = array(), $block_ordinal = 0 ) {
153
	$buttons = array_map(
154
		function( $index ) {
155
			$aria_label = sprintf(
156
				/* translators: %d: Slide number. */
157
				__( 'Go to slide %d', 'jetpack' ),
158
				absint( $index + 1 )
159
			);
160
			return sprintf(
161
				'<button option="%d" class="swiper-pagination-bullet" tabindex="0" role="button" aria-label="%s" %s></button>',
162
				absint( $index ),
163
				esc_attr( $aria_label ),
164
				0 === $index ? 'selected' : ''
165
			);
166
		},
167
		array_keys( $ids )
168
	);
169
170
	return sprintf(
171
		'<amp-selector id="wp-block-jetpack-slideshow__amp-pagination__%1$d" class="wp-block-jetpack-slideshow_pagination swiper-pagination swiper-pagination-bullets amp-pagination" on="select:wp-block-jetpack-slideshow__amp-carousel__%1$d.goToSlide(index=event.targetOption)" layout="container">%2$s</amp-selector>',
172
		absint( $block_ordinal ),
173
		implode( '', $buttons )
174
	);
175
}
176
177
/**
178
 * Generate autoplay play/pause UI.
179
 *
180
 * @param int $block_ordinal The ordinal number of the block, used in unique ID.
181
 *
182
 * @return string Autoplay UI markup.
183
 */
184
function autoplay_ui( $block_ordinal = 0 ) {
185
	$block_id        = sprintf(
186
		'wp-block-jetpack-slideshow__%d',
187
		absint( $block_ordinal )
188
	);
189
	$amp_carousel_id = sprintf(
190
		'wp-block-jetpack-slideshow__amp-carousel__%d',
191
		absint( $block_ordinal )
192
	);
193
	$autoplay_pause  = sprintf(
194
		'<a aria-label="%s" class="wp-block-jetpack-slideshow_button-pause" role="button" on="tap:%s.toggleAutoplay(toggleOn=false),%s.toggleClass(class=wp-block-jetpack-slideshow__autoplay-playing,force=false)"></a>',
195
		esc_attr__( 'Pause Slideshow', 'jetpack' ),
196
		esc_attr( $amp_carousel_id ),
197
		esc_attr( $block_id )
198
	);
199
	$autoplay_play   = sprintf(
200
		'<a aria-label="%s" class="wp-block-jetpack-slideshow_button-play" role="button" on="tap:%s.toggleAutoplay(toggleOn=true),%s.toggleClass(class=wp-block-jetpack-slideshow__autoplay-playing,force=true)"></a>',
201
		esc_attr__( 'Play Slideshow', 'jetpack' ),
202
		esc_attr( $amp_carousel_id ),
203
		esc_attr( $block_id )
204
	);
205
	return $autoplay_pause . $autoplay_play;
206
}
207