PluginProbe
Gutenberg / 23.2.0
Gutenberg v23.2.0
24.0.0 23.9.1 23.9.0 23.8.0 23.7.2 23.7.1 23.7.0 23.6.1 23.6.2 23.6.0 23.5.3 23.5.2 23.5.1 23.5.0 23.4.0 23.3.2 23.3.1 23.3.0 23.2.0 23.2.1 23.2.2 23.1.1 23.1.0 23.0.1 12.6.0 All 403 releases
gutenberg / build / scripts / block-library / playlist.php
build/scripts/block-library
accordion 6 months ago accordion-heading 9 months ago accordion-item 4 months ago accordion-panel 7 months ago archives 7 months ago audio 10 months ago avatar 7 months ago block 7 months ago breadcrumbs 7 months ago button 6 months ago buttons 7 months ago calendar 7 months ago categories 7 months ago code 10 months ago column 10 months ago columns 10 months ago comment-author-avatar 10 months ago comment-author-name 7 months ago comment-content 7 months ago comment-date 7 months ago comment-edit-link 7 months ago comment-reply-link 7 months ago comment-template 7 months ago comments 7 months ago comments-pagination 7 months ago comments-pagination-next 7 months ago comments-pagination-numbers 7 months ago comments-pagination-previous 7 months ago comments-title 7 months ago cover 10 months ago details 10 months ago embed 7 months ago file 10 months ago footnotes 7 months ago form 4 months ago form-input 4 months ago form-submission-notification 4 months ago form-submit-button 4 months ago freeform 7 months ago gallery 6 months ago group 4 months ago heading 7 months ago home-link 7 months ago html 5 months ago icon 5 months ago image 6 months ago latest-comments 7 months ago latest-posts 7 months ago list 7 months ago list-item 5 months ago loginout 7 months ago math 7 months ago media-text 10 months ago missing 7 months ago more 7 months ago navigation 6 months ago navigation-link 5 months ago navigation-overlay-close 6 months ago navigation-submenu 6 months ago nextpage 5 months ago page-list 6 months ago page-list-item 6 months ago paragraph 6 months ago pattern 9 months ago playlist 6 months ago playlist-track 6 months ago post-author 6 months ago post-author-biography 6 months ago post-author-name 6 months ago post-comment 10 months ago post-comments-count 6 months ago post-comments-form 6 months ago post-comments-link 6 months ago post-content 7 months ago post-date 5 months ago post-excerpt 5 months ago post-featured-image 7 months ago post-navigation-link 6 months ago post-template 7 months ago post-terms 6 months ago post-time-to-read 6 months ago post-title 6 months ago preformatted 10 months ago pullquote 4 months ago query 6 months ago query-no-results 7 months ago query-pagination 7 months ago query-pagination-next 7 months ago query-pagination-numbers 7 months ago query-pagination-previous 7 months ago query-title 6 months ago query-total 7 months ago quote 10 months ago read-more 7 months ago rss 7 months ago search 4 months ago separator 10 months ago shortcode 5 months ago site-logo 7 months ago site-tagline 6 months ago site-title 6 months ago social-link 7 months ago social-links 7 months ago spacer 10 months ago tab 4 months ago tab-list 4 months ago tab-panel 4 months ago tab-panels 4 months ago table 10 months ago table-of-contents 7 months ago tabs 4 months ago tag-cloud 7 months ago template-part 10 months ago term-count 7 months ago term-description 6 months ago term-name 7 months ago term-template 7 months ago terms-query 7 months ago text-columns 10 months ago verse 6 months ago video 10 months ago accordion-item.php 2.9 KB 5 months ago accordion.php 1.2 KB 10 months ago archives.php 4.4 KB 7 months ago avatar.php 5.6 KB 7 months ago block.php 4.1 KB 10 months ago blocks-manifest.php 213.3 KB 4 months ago breadcrumbs.php 19.0 KB 7 months ago button.php 4.2 KB 6 months ago calendar.php 6.1 KB 10 months ago categories.php 4.9 KB 7 months ago comment-author-avatar.php 2.5 KB 7 months ago comment-author-name.php 2.1 KB 10 months ago comment-content.php 2.4 KB 10 months ago comment-date.php 1.9 KB 10 months ago comment-edit-link.php 1.7 KB 10 months ago comment-reply-link.php 2.1 KB 10 months ago comment-template.php 4.5 KB 10 months ago comments-pagination-next.php 1.9 KB 10 months ago comments-pagination-numbers.php 1.6 KB 10 months ago comments-pagination-previous.php 1.8 KB 10 months ago comments-pagination.php 1.3 KB 10 months ago comments-title.php 2.8 KB 7 months ago comments.php 6.7 KB 10 months ago cover.php 7.3 KB 5 months ago details.php 1.5 KB 5 months ago file.php 1.9 KB 10 months ago footnotes.php 3.8 KB 7 months ago form-input.php 1.2 KB 10 months ago form-submission-notification.php 1.5 KB 10 months ago form.php 5.8 KB 10 months ago gallery.php 8.9 KB 6 months ago heading.php 1.3 KB 10 months ago home-link.php 4.9 KB 5 months ago icon.php 4.0 KB 6 months ago image.php 17.4 KB 4 months ago index.js 2.6 MB 3 months ago index.js.map 3.9 MB 3 months ago index.min.asset.php 696 B 3 months ago index.min.js 1.1 MB 3 months ago index.min.js.map 4.0 MB 3 months ago latest-comments.php 5.4 KB 7 months ago latest-posts.php 8.7 KB 4 months ago list.php 1.3 KB 10 months ago loginout.php 2.1 KB 5 months ago media-text.php 4.2 KB 6 months ago navigation-link.php 15.3 KB 5 months ago navigation-overlay-close.php 1.8 KB 6 months ago navigation-submenu.php 11.0 KB 5 months ago navigation.php 63.6 KB 3 months ago page-list-item.php 385 B 10 months ago page-list.php 14.3 KB 5 months ago paragraph.php 1.2 KB 7 months ago pattern.php 1.8 KB 10 months ago playlist-track.php 2.1 KB 6 months ago playlist.php 4.6 KB 6 months ago post-author-biography.php 1.5 KB 10 months ago post-author-name.php 1.9 KB 10 months ago post-author.php 2.7 KB 10 months ago post-comment.php 429 B 10 months ago post-comments-count.php 1.3 KB 10 months ago post-comments-form.php 2.8 KB 10 months ago post-comments-link.php 2.2 KB 10 months ago post-content.php 2.3 KB 10 months ago post-date.php 3.6 KB 7 months ago post-excerpt.php 4.3 KB 7 months ago post-featured-image.php 9.1 KB 6 months ago post-navigation-link.php 4.7 KB 7 months ago post-template.php 5.9 KB 4 months ago post-terms.php 3.6 KB 10 months ago post-time-to-read.php 6.3 KB 7 months ago post-title.php 2.1 KB 7 months ago query-no-results.php 1.8 KB 10 months ago query-pagination-next.php 3.6 KB 6 months ago query-pagination-numbers.php 4.6 KB 6 months ago query-pagination-previous.php 3.4 KB 6 months ago query-pagination.php 1.2 KB 10 months ago query-title.php 2.7 KB 6 months ago query-total.php 2.5 KB 6 months ago query.php 5.6 KB 10 months ago read-more.php 1.8 KB 10 months ago rss.php 4.5 KB 10 months ago search.php 24.1 KB 4 months ago shortcode.php 779 B 10 months ago site-logo.php 6.4 KB 10 months ago site-tagline.php 1.2 KB 10 months ago site-title.php 1.9 KB 10 months ago social-link.php 66.2 KB 7 months ago tab-list.php 2.1 KB 4 months ago tab-panel.php 2.1 KB 4 months ago tab.php 2.1 KB 4 months ago table-of-contents.php 1.2 KB 10 months ago tabs.php 4.6 KB 4 months ago tag-cloud.php 1.6 KB 10 months ago template-part.php 10.3 KB 6 months ago term-count.php 1.8 KB 10 months ago term-description.php 1.8 KB 10 months ago term-name.php 2.0 KB 7 months ago term-template.php 4.5 KB 7 months ago video.php 2.7 KB 10 months ago

playlist.php in Gutenberg 23.2.0, at build/scripts/block-library/playlist.php

149 lines 4.6 KB Raw Download Zip
1 <?php
2 /**
3 * Server-side rendering of the `core/playlist` block.
4 *
5 * @package WordPress
6 */
7
8 /**
9 * Renders the `core/playlist` block on server.
10 *
11 * @since 6.9.0
12 *
13 * @param array $attributes The block attributes.
14 * @param string $content The block content.
15 * @param WP_Block $block The block instance.
16 *
17 * @return string Returns the Playlist.
18 */
19 function gutenberg_render_block_core_playlist( $attributes, $content, $block ) {
20 if ( empty( $attributes['currentTrack'] ) ) {
21 return '';
22 }
23
24 $current_media_id = $attributes['currentTrack'];
25 $playlist_id = wp_unique_id( 'playlist-' );
26 $playlist_tracks = array();
27 $tracks_data = array();
28 $current_unique_id = null;
29
30 // Parse inner blocks to extract track data.
31 // This approach avoids duplicating track data in the HTML output.
32 if ( ! empty( $block->inner_blocks ) ) {
33 foreach ( $block->inner_blocks as $inner_block ) {
34 if ( 'core/playlist-track' === $inner_block->name ) {
35 $inner_block->context['playlistId'] = $playlist_id;
36
37 $track_attributes = $inner_block->attributes;
38 $unique_id = $track_attributes['uniqueId'] ?? wp_unique_id( 'playlist-track-' );
39 $playlist_tracks[] = $unique_id;
40
41 $inner_block->attributes['uniqueId'] = $unique_id;
42
43 // Extract track metadata from block attributes.
44 $title = isset( $track_attributes['title'] ) && ! empty( $track_attributes['title'] ) ? $track_attributes['title'] : __( 'Unknown title' );
45 $artist = $track_attributes['artist'] ?? '';
46 $album = $track_attributes['album'] ?? '';
47 $image = $track_attributes['image'] ?? '';
48 $url = $track_attributes['src'] ?? '';
49 $aria_label = $title;
50
51 if ( $title && $artist && $album ) {
52 $aria_label = sprintf(
53 /* translators: %1$s: track title, %2$s artist name, %3$s: album name. */
54 _x( '%1$s by %2$s from the album %3$s', 'track title, artist name, album name' ),
55 $title,
56 $artist,
57 $album
58 );
59 }
60
61 // Data is passed to wp_interactivity_state() which JSON-encodes it,
62 // so we use wp_strip_all_tags() instead of esc_html() to prevent
63 // HTML injection without double-encoding. URLs still use esc_url().
64 $tracks_data[ $unique_id ] = array(
65 'url' => esc_url( $url ),
66 'title' => wp_strip_all_tags( $title ),
67 'artist' => wp_strip_all_tags( $artist ),
68 'album' => wp_strip_all_tags( $album ),
69 'image' => esc_url( $image ),
70 'ariaLabel' => wp_strip_all_tags( $aria_label ),
71 );
72
73 if ( $unique_id === $current_media_id ) {
74 $current_unique_id = $unique_id;
75 }
76 }
77 }
78 }
79
80 // If there are no tracks but there is a currentTrack set, do not render the block.
81 // This can happen for example if the currentTrack was not deleted correctly
82 // or if the block is manually edited in the code editor mode.
83 if ( empty( $playlist_tracks ) || ! in_array( $current_media_id, $playlist_tracks, true ) ) {
84 return '';
85 }
86
87 wp_enqueue_script_module( '@wordpress/block-library/playlist/view' );
88
89 // Add the playlist tracks to the global state,
90 // but keep them isolated from other playlists with the help of playlistId.
91 wp_interactivity_state(
92 'core/playlist',
93 array(
94 'playlists' => array(
95 $playlist_id => array(
96 'tracks' => $tracks_data,
97 ),
98 ),
99 )
100 );
101
102 // Add waveform player container with translated button labels.
103 $label_play = esc_attr__( 'Play' );
104 $label_pause = esc_attr__( 'Pause' );
105 $html = '<div class="wp-block-playlist__waveform-player"
106 data-wp-watch="callbacks.initWaveformPlayer"
107 data-label-play="' . $label_play . '"
108 data-label-pause="' . $label_pause . '"
109 ></div>';
110
111 // Add the HTML for the current track inside the figure.
112 $figure = null;
113 preg_match( '/<figure[^>]*>/', $content, $figure );
114 if ( ! empty( $figure[0] ) ) {
115 $content = preg_replace( '/(<figure[^>]*>)/', '$1' . $html, $content, 1 );
116 }
117
118 $processor = new WP_HTML_Tag_Processor( $content );
119 $processor->next_tag( 'figure' );
120 $processor->set_attribute( 'data-wp-interactive', 'core/playlist' );
121 $processor->set_attribute(
122 'data-wp-context',
123 json_encode(
124 array(
125 'playlistId' => $playlist_id,
126 'currentId' => $current_unique_id,
127 'tracks' => $playlist_tracks,
128 )
129 )
130 );
131
132 return $processor->get_updated_html();
133 }
134
135 /**
136 * Registers the `core/playlist` block on server.
137 *
138 * @since 6.9.0
139 */
140 function gutenberg_register_block_core_playlist() {
141 register_block_type_from_metadata(
142 __DIR__ . '/playlist',
143 array(
144 'render_callback' => 'gutenberg_render_block_core_playlist',
145 )
146 );
147 }
148 add_action( 'init', 'gutenberg_register_block_core_playlist', 20 );
149