Skip to content

Commit 7bf7e4a

Browse files
committed
pulled upstream
1 parent e12ddb3 commit 7bf7e4a

149 files changed

Lines changed: 104739 additions & 0 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
<?php
2+
3+
/**
4+
* Server-side rendering of the `core/accordion-item` block.
5+
*
6+
* @package WordPress
7+
* @since 6.9.0
8+
*
9+
* @param array $attributes The block attributes.
10+
* @param string $content The block content.
11+
*
12+
* @return string Returns the updated markup.
13+
*/
14+
function block_core_accordion_item_render( $attributes, $content ) {
15+
if ( ! $content ) {
16+
return $content;
17+
}
18+
19+
$p = new WP_HTML_Tag_Processor( $content );
20+
$unique_id = wp_unique_id( 'accordion-item-' );
21+
22+
// Initialize the state of the item on the server using a closure,
23+
// since we need to get derived state based on the current context.
24+
wp_interactivity_state(
25+
'core/accordion',
26+
array(
27+
'isOpen' => function () {
28+
$context = wp_interactivity_get_context();
29+
return $context['openByDefault'];
30+
},
31+
)
32+
);
33+
34+
if ( $p->next_tag( array( 'class_name' => 'wp-block-accordion-item' ) ) ) {
35+
$open_by_default = $attributes['openByDefault'] ? 'true' : 'false';
36+
$p->set_attribute( 'data-wp-context', '{ "id": "' . $unique_id . '", "openByDefault": ' . $open_by_default . ' }' );
37+
$p->set_attribute( 'data-wp-class--is-open', 'state.isOpen' );
38+
$p->set_attribute( 'data-wp-init', 'callbacks.initAccordionItems' );
39+
$p->set_attribute( 'data-wp-on-window--hashchange', 'callbacks.hashChange' );
40+
41+
if ( $p->next_tag( array( 'class_name' => 'wp-block-accordion-heading__toggle' ) ) ) {
42+
$p->set_attribute( 'data-wp-on--click', 'actions.toggle' );
43+
$p->set_attribute( 'data-wp-on--keydown', 'actions.handleKeyDown' );
44+
$p->set_attribute( 'id', $unique_id );
45+
$p->set_attribute( 'aria-controls', $unique_id . '-panel' );
46+
$p->set_attribute( 'data-wp-bind--aria-expanded', 'state.isOpen' );
47+
48+
if ( $p->next_tag( array( 'class_name' => 'wp-block-accordion-panel' ) ) ) {
49+
$p->set_attribute( 'id', $unique_id . '-panel' );
50+
$p->set_attribute( 'aria-labelledby', $unique_id );
51+
$p->set_attribute( 'data-wp-bind--inert', '!state.isOpen' );
52+
53+
// Only modify content if all directives have been set.
54+
$content = $p->get_updated_html();
55+
}
56+
}
57+
}
58+
59+
return $content;
60+
}
61+
62+
/**
63+
* Registers the `core/accordion-item` block on server.
64+
*
65+
* @since 6.9.0
66+
*/
67+
function register_block_core_accordion_item() {
68+
register_block_type_from_metadata(
69+
__DIR__ . '/accordion-item',
70+
array(
71+
'render_callback' => 'block_core_accordion_item_render',
72+
)
73+
);
74+
}
75+
add_action( 'init', 'register_block_core_accordion_item' );
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?php
2+
/**
3+
* Server-side rendering of the `core/accordion` block.
4+
*
5+
* @package WordPress
6+
* @since 6.9.0
7+
*
8+
* @param array $attributes The block attributes.
9+
* @param string $content The block content.
10+
*
11+
* @return string Returns the updated markup.
12+
*/
13+
function render_block_core_accordion( $attributes, $content ) {
14+
if ( ! $content ) {
15+
return $content;
16+
}
17+
18+
$p = new WP_HTML_Tag_Processor( $content );
19+
$autoclose = $attributes['autoclose'] ? 'true' : 'false';
20+
21+
if ( $p->next_tag( array( 'class_name' => 'wp-block-accordion' ) ) ) {
22+
$p->set_attribute( 'data-wp-interactive', 'core/accordion' );
23+
$p->set_attribute( 'data-wp-context', '{ "autoclose": ' . $autoclose . ', "accordionItems": [] }' );
24+
25+
// Only modify content if directives have been set.
26+
$content = $p->get_updated_html();
27+
}
28+
29+
return $content;
30+
}
31+
32+
/**
33+
* Registers the `core/accordion` block on server.
34+
*
35+
* @since 6.9.0
36+
*/
37+
function register_block_core_accordion() {
38+
register_block_type_from_metadata(
39+
__DIR__ . '/accordion',
40+
array(
41+
'render_callback' => 'render_block_core_accordion',
42+
)
43+
);
44+
}
45+
add_action( 'init', 'register_block_core_accordion' );
Lines changed: 174 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,174 @@
1+
<?php
2+
/**
3+
* Server-side rendering of the `core/archives` block.
4+
*
5+
* @package WordPress
6+
*/
7+
8+
/**
9+
* Renders the `core/archives` block on server.
10+
*
11+
* @since 5.0.0
12+
*
13+
* @see WP_Widget_Archives
14+
*
15+
* @param array $attributes The block attributes.
16+
*
17+
* @return string Returns the post content with archives added.
18+
*/
19+
function render_block_core_archives( $attributes ) {
20+
$show_post_count = ! empty( $attributes['showPostCounts'] );
21+
$type = $attributes['type'] ?? 'monthly';
22+
23+
$class = 'wp-block-archives-list';
24+
25+
if ( ! empty( $attributes['displayAsDropdown'] ) ) {
26+
27+
$class = 'wp-block-archives-dropdown';
28+
29+
$dropdown_id = wp_unique_id( 'wp-block-archives-' );
30+
$title = __( 'Archives' );
31+
32+
/** This filter is documented in wp-includes/widgets/class-wp-widget-archives.php */
33+
$dropdown_args = apply_filters(
34+
'widget_archives_dropdown_args',
35+
array(
36+
'type' => $type,
37+
'format' => 'option',
38+
'show_post_count' => $show_post_count,
39+
)
40+
);
41+
42+
$dropdown_args['echo'] = 0;
43+
44+
$archives = wp_get_archives( $dropdown_args );
45+
46+
$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $class ) );
47+
48+
switch ( $dropdown_args['type'] ) {
49+
case 'yearly':
50+
$label = __( 'Select Year' );
51+
break;
52+
case 'monthly':
53+
$label = __( 'Select Month' );
54+
break;
55+
case 'daily':
56+
$label = __( 'Select Day' );
57+
break;
58+
case 'weekly':
59+
$label = __( 'Select Week' );
60+
break;
61+
default:
62+
$label = __( 'Select Post' );
63+
break;
64+
}
65+
66+
$show_label = empty( $attributes['showLabel'] ) ? ' screen-reader-text' : '';
67+
68+
$block_content = '<label for="' . $dropdown_id . '" class="wp-block-archives__label' . $show_label . '">' . esc_html( $title ) . '</label>
69+
<select id="' . esc_attr( $dropdown_id ) . '" name="archive-dropdown">
70+
<option value="">' . esc_html( $label ) . '</option>' . $archives . '</select>';
71+
72+
// Inject the dropdown script immediately after the select dropdown.
73+
$block_content .= block_core_archives_build_dropdown_script( $dropdown_id );
74+
75+
return sprintf(
76+
'<div %1$s>%2$s</div>',
77+
$wrapper_attributes,
78+
$block_content
79+
);
80+
}
81+
82+
/** This filter is documented in wp-includes/widgets/class-wp-widget-archives.php */
83+
$archives_args = apply_filters(
84+
'widget_archives_args',
85+
array(
86+
'type' => $type,
87+
'show_post_count' => $show_post_count,
88+
)
89+
);
90+
91+
$archives_args['echo'] = 0;
92+
93+
$archives = wp_get_archives( $archives_args );
94+
95+
$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $class ) );
96+
97+
if ( empty( $archives ) ) {
98+
return sprintf(
99+
'<div %1$s>%2$s</div>',
100+
$wrapper_attributes,
101+
__( 'No archives to show.' )
102+
);
103+
}
104+
105+
return sprintf(
106+
'<ul %1$s>%2$s</ul>',
107+
$wrapper_attributes,
108+
$archives
109+
);
110+
}
111+
112+
/**
113+
* Generates the inline script for an archives dropdown field.
114+
*
115+
* @since 6.9.0
116+
*
117+
* @param string $dropdown_id ID of the dropdown field.
118+
*
119+
* @return string Returns the dropdown onChange redirection script.
120+
*/
121+
function block_core_archives_build_dropdown_script( $dropdown_id ) {
122+
ob_start();
123+
124+
$exports = array( $dropdown_id, home_url() );
125+
?>
126+
<script>
127+
( ( [ dropdownId, homeUrl ] ) => {
128+
const dropdown = document.getElementById( dropdownId );
129+
function onSelectChange() {
130+
setTimeout( () => {
131+
if ( 'escape' === dropdown.dataset.lastkey ) {
132+
return;
133+
}
134+
if ( dropdown.value ) {
135+
location.href = dropdown.value;
136+
}
137+
}, 250 );
138+
}
139+
function onKeyUp( event ) {
140+
if ( 'Escape' === event.key ) {
141+
dropdown.dataset.lastkey = 'escape';
142+
} else {
143+
delete dropdown.dataset.lastkey;
144+
}
145+
}
146+
function onClick() {
147+
delete dropdown.dataset.lastkey;
148+
}
149+
dropdown.addEventListener( 'keyup', onKeyUp );
150+
dropdown.addEventListener( 'click', onClick );
151+
dropdown.addEventListener( 'change', onSelectChange );
152+
} )( <?php echo wp_json_encode( $exports, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES ); ?> );
153+
</script>
154+
<?php
155+
return wp_get_inline_script_tag(
156+
trim( str_replace( array( '<script>', '</script>' ), '', ob_get_clean() ) ) .
157+
"\n//# sourceURL=" . rawurlencode( __FUNCTION__ )
158+
);
159+
}
160+
161+
/**
162+
* Register archives block.
163+
*
164+
* @since 5.0.0
165+
*/
166+
function register_block_core_archives() {
167+
register_block_type_from_metadata(
168+
__DIR__ . '/archives',
169+
array(
170+
'render_callback' => 'render_block_core_archives',
171+
)
172+
);
173+
}
174+
add_action( 'init', 'register_block_core_archives' );

0 commit comments

Comments
 (0)