-
Notifications
You must be signed in to change notification settings - Fork 4.2k
/
compat.php
149 lines (131 loc) · 4.26 KB
/
compat.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
<?php
/**
* PHP and WordPress configuration compatibility functions for the Gutenberg
* editor plugin.
*
* @package gutenberg
*/
if ( ! defined( 'ABSPATH' ) ) {
die( 'Silence is golden.' );
}
/**
* Splits a UTF-8 string into an array of UTF-8-encoded codepoints.
*
* @since 0.5.0
*
* Based on WordPress' _mb_substr() compat function.
*
* @param string $str The string to split.
* @return array
*/
function _gutenberg_utf8_split( $str ) {
if ( _wp_can_use_pcre_u() ) {
// Use the regex unicode support to separate the UTF-8 characters into
// an array.
preg_match_all( '/./us', $str, $match );
return $match[0];
}
$regex = '/(
[\x00-\x7F] # single-byte sequences 0xxxxxxx
| [\xC2-\xDF][\x80-\xBF] # double-byte sequences 110xxxxx 10xxxxxx
| \xE0[\xA0-\xBF][\x80-\xBF] # triple-byte sequences 1110xxxx 10xxxxxx * 2
| [\xE1-\xEC][\x80-\xBF]{2}
| \xED[\x80-\x9F][\x80-\xBF]
| [\xEE-\xEF][\x80-\xBF]{2}
| \xF0[\x90-\xBF][\x80-\xBF]{2} # four-byte sequences 11110xxx 10xxxxxx * 3
| [\xF1-\xF3][\x80-\xBF]{3}
| \xF4[\x80-\x8F][\x80-\xBF]{2}
)/x';
// Start with 1 element instead of 0 since the first thing we do is pop.
$chars = array( '' );
do {
// We had some string left over from the last round, but we counted it
// in that last round.
array_pop( $chars );
// Split by UTF-8 character, limit to 1000 characters (last array
// element will contain the rest of the string).
$pieces = preg_split(
$regex,
$str,
1000,
PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY
);
$chars = array_merge( $chars, $pieces );
// If there's anything left over, repeat the loop.
if ( count( $pieces ) > 1 ) {
$str = array_pop( $pieces );
} else {
break;
}
} while ( $str );
return $chars;
}
/**
* Disables wpautop behavior in classic editor when post contains blocks, to
* prevent removep from invalidating paragraph blocks.
*
* @param array $settings Original editor settings.
* @return array Filtered settings.
*/
function gutenberg_disable_editor_settings_wpautop( $settings ) {
$post = get_post();
if ( is_object( $post ) && gutenberg_post_has_blocks( $post ) ) {
$settings['wpautop'] = false;
}
return $settings;
}
add_filter( 'wp_editor_settings', 'gutenberg_disable_editor_settings_wpautop' );
/**
* Add TinyMCE fixes for the Classic Editor.
*
* @see https://core.trac.wordpress.org/ticket/44308
*/
function gutenberg_add_classic_editor_fixes() {
// Temp add the fix for not creating paragraphs from HTML comments.
// TODO: remove after 4.9.7, this should be in core.
$script = <<<JS
jQuery( document ).on( 'tinymce-editor-setup', function( event, editor ) {
var hasWpautop = ( window.wp && window.wp.editor && window.wp.editor.autop && editor.getParam( 'wpautop', true ) );
editor.on( 'BeforeSetContent', function( event ) {
if ( event.load && event.format !== 'raw' && ! hasWpautop ) {
// Prevent creation of paragraphs out of multiple HTML comments.
event.content = event.content.replace( /-->\s+<!--/g, '--><!--' );
}
});
editor.on( 'SaveContent', function( event ) {
if ( ! hasWpautop ) {
// Restore formatting of block boundaries.
event.content = event.content.replace( /-->\s*<!-- wp:/g, '-->\\n\\n<!-- wp:' );
}
});
});
JS;
wp_add_inline_script( 'editor', $script, 'before' );
}
add_action( 'init', 'gutenberg_add_classic_editor_fixes' );
/**
* Add rest nonce to the heartbeat response.
*
* @param array $response Original heartbeat response.
* @return array New heartbeat response.
*/
function gutenberg_add_rest_nonce_to_heartbeat_response_headers( $response ) {
$response['rest-nonce'] = wp_create_nonce( 'wp_rest' );
return $response;
}
add_filter( 'wp_refresh_nonces', 'gutenberg_add_rest_nonce_to_heartbeat_response_headers' );
/**
* As a substitute for the default content `wpautop` filter, applies autop
* behavior only for posts where content does not contain blocks.
*
* @param string $content Post content.
* @return string Paragraph-converted text if non-block content.
*/
function gutenberg_wpautop( $content ) {
if ( gutenberg_content_has_blocks( $content ) ) {
return $content;
}
return wpautop( $content );
}
remove_filter( 'the_content', 'wpautop' );
add_filter( 'the_content', 'gutenberg_wpautop', 8 );