angelovcom.net

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

script-loader.php (108457B)


      1 <?php
      2 /**
      3  * WordPress scripts and styles default loader.
      4  *
      5  * Several constants are used to manage the loading, concatenating and compression of scripts and CSS:
      6  * define('SCRIPT_DEBUG', true); loads the development (non-minified) versions of all scripts and CSS, and disables compression and concatenation,
      7  * define('CONCATENATE_SCRIPTS', false); disables compression and concatenation of scripts and CSS,
      8  * define('COMPRESS_SCRIPTS', false); disables compression of scripts,
      9  * define('COMPRESS_CSS', false); disables compression of CSS,
     10  * define('ENFORCE_GZIP', true); forces gzip for compression (default is deflate).
     11  *
     12  * The globals $concatenate_scripts, $compress_scripts and $compress_css can be set by plugins
     13  * to temporarily override the above settings. Also a compression test is run once and the result is saved
     14  * as option 'can_compress_scripts' (0/1). The test will run again if that option is deleted.
     15  *
     16  * @package WordPress
     17  */
     18 
     19 /** WordPress Dependency Class */
     20 require ABSPATH . WPINC . '/class-wp-dependency.php';
     21 
     22 /** WordPress Dependencies Class */
     23 require ABSPATH . WPINC . '/class.wp-dependencies.php';
     24 
     25 /** WordPress Scripts Class */
     26 require ABSPATH . WPINC . '/class.wp-scripts.php';
     27 
     28 /** WordPress Scripts Functions */
     29 require ABSPATH . WPINC . '/functions.wp-scripts.php';
     30 
     31 /** WordPress Styles Class */
     32 require ABSPATH . WPINC . '/class.wp-styles.php';
     33 
     34 /** WordPress Styles Functions */
     35 require ABSPATH . WPINC . '/functions.wp-styles.php';
     36 
     37 /**
     38  * Registers TinyMCE scripts.
     39  *
     40  * @since 5.0.0
     41  *
     42  * @param WP_Scripts $scripts            WP_Scripts object.
     43  * @param bool       $force_uncompressed Whether to forcibly prevent gzip compression. Default false.
     44  */
     45 function wp_register_tinymce_scripts( $scripts, $force_uncompressed = false ) {
     46 	global $tinymce_version, $concatenate_scripts, $compress_scripts;
     47 	$suffix     = wp_scripts_get_suffix();
     48 	$dev_suffix = wp_scripts_get_suffix( 'dev' );
     49 
     50 	script_concat_settings();
     51 
     52 	$compressed = $compress_scripts && $concatenate_scripts && isset( $_SERVER['HTTP_ACCEPT_ENCODING'] )
     53 		&& false !== stripos( $_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip' ) && ! $force_uncompressed;
     54 
     55 	// Load tinymce.js when running from /src, otherwise load wp-tinymce.js.gz (in production)
     56 	// or tinymce.min.js (when SCRIPT_DEBUG is true).
     57 	if ( $compressed ) {
     58 		$scripts->add( 'wp-tinymce', includes_url( 'js/tinymce/' ) . 'wp-tinymce.js', array(), $tinymce_version );
     59 	} else {
     60 		$scripts->add( 'wp-tinymce-root', includes_url( 'js/tinymce/' ) . "tinymce$dev_suffix.js", array(), $tinymce_version );
     61 		$scripts->add( 'wp-tinymce', includes_url( 'js/tinymce/' ) . "plugins/compat3x/plugin$dev_suffix.js", array( 'wp-tinymce-root' ), $tinymce_version );
     62 	}
     63 
     64 	$scripts->add( 'wp-tinymce-lists', includes_url( "js/tinymce/plugins/lists/plugin$suffix.js" ), array( 'wp-tinymce' ), $tinymce_version );
     65 }
     66 
     67 /**
     68  * Registers all the WordPress vendor scripts that are in the standardized
     69  * `js/dist/vendor/` location.
     70  *
     71  * For the order of `$scripts->add` see `wp_default_scripts`.
     72  *
     73  * @since 5.0.0
     74  *
     75  * @param WP_Scripts $scripts WP_Scripts object.
     76  */
     77 function wp_default_packages_vendor( $scripts ) {
     78 	global $wp_locale;
     79 
     80 	$suffix = wp_scripts_get_suffix();
     81 
     82 	$vendor_scripts = array(
     83 		'react'       => array( 'wp-polyfill' ),
     84 		'react-dom'   => array( 'react' ),
     85 		'regenerator-runtime',
     86 		'moment',
     87 		'lodash',
     88 		'wp-polyfill-fetch',
     89 		'wp-polyfill-formdata',
     90 		'wp-polyfill-node-contains',
     91 		'wp-polyfill-url',
     92 		'wp-polyfill-dom-rect',
     93 		'wp-polyfill-element-closest',
     94 		'wp-polyfill-object-fit',
     95 		'wp-polyfill' => array( 'regenerator-runtime' ),
     96 	);
     97 
     98 	$vendor_scripts_versions = array(
     99 		'react'                       => '16.13.1',
    100 		'react-dom'                   => '16.13.1',
    101 		'regenerator-runtime'         => '0.13.7',
    102 		'moment'                      => '2.29.1',
    103 		'lodash'                      => '4.17.19',
    104 		'wp-polyfill-fetch'           => '3.0.0',
    105 		'wp-polyfill-formdata'        => '4.0.0',
    106 		'wp-polyfill-node-contains'   => '3.105.0',
    107 		'wp-polyfill-url'             => '3.6.4',
    108 		'wp-polyfill-dom-rect'        => '3.104.0',
    109 		'wp-polyfill-element-closest' => '2.0.2',
    110 		'wp-polyfill-object-fit'      => '2.3.5',
    111 		'wp-polyfill'                 => '3.15.0',
    112 	);
    113 
    114 	foreach ( $vendor_scripts as $handle => $dependencies ) {
    115 		if ( is_string( $dependencies ) ) {
    116 			$handle       = $dependencies;
    117 			$dependencies = array();
    118 		}
    119 
    120 		$path    = "/wp-includes/js/dist/vendor/$handle$suffix.js";
    121 		$version = $vendor_scripts_versions[ $handle ];
    122 
    123 		$scripts->add( $handle, $path, $dependencies, $version, 1 );
    124 	}
    125 
    126 	did_action( 'init' ) && $scripts->add_inline_script( 'lodash', 'window.lodash = _.noConflict();' );
    127 
    128 	did_action( 'init' ) && $scripts->add_inline_script(
    129 		'moment',
    130 		sprintf(
    131 			"moment.updateLocale( '%s', %s );",
    132 			get_user_locale(),
    133 			wp_json_encode(
    134 				array(
    135 					'months'         => array_values( $wp_locale->month ),
    136 					'monthsShort'    => array_values( $wp_locale->month_abbrev ),
    137 					'weekdays'       => array_values( $wp_locale->weekday ),
    138 					'weekdaysShort'  => array_values( $wp_locale->weekday_abbrev ),
    139 					'week'           => array(
    140 						'dow' => (int) get_option( 'start_of_week', 0 ),
    141 					),
    142 					'longDateFormat' => array(
    143 						'LT'   => get_option( 'time_format', __( 'g:i a' ) ),
    144 						'LTS'  => null,
    145 						'L'    => null,
    146 						'LL'   => get_option( 'date_format', __( 'F j, Y' ) ),
    147 						'LLL'  => __( 'F j, Y g:i a' ),
    148 						'LLLL' => null,
    149 					),
    150 				)
    151 			)
    152 		),
    153 		'after'
    154 	);
    155 }
    156 
    157 /**
    158  * Returns contents of an inline script used in appending polyfill scripts for
    159  * browsers which fail the provided tests. The provided array is a mapping from
    160  * a condition to verify feature support to its polyfill script handle.
    161  *
    162  * @since 5.0.0
    163  *
    164  * @param WP_Scripts $scripts WP_Scripts object.
    165  * @param array      $tests   Features to detect.
    166  * @return string Conditional polyfill inline script.
    167  */
    168 function wp_get_script_polyfill( $scripts, $tests ) {
    169 	$polyfill = '';
    170 	foreach ( $tests as $test => $handle ) {
    171 		if ( ! array_key_exists( $handle, $scripts->registered ) ) {
    172 			continue;
    173 		}
    174 
    175 		$src = $scripts->registered[ $handle ]->src;
    176 		$ver = $scripts->registered[ $handle ]->ver;
    177 
    178 		if ( ! preg_match( '|^(https?:)?//|', $src ) && ! ( $scripts->content_url && 0 === strpos( $src, $scripts->content_url ) ) ) {
    179 			$src = $scripts->base_url . $src;
    180 		}
    181 
    182 		if ( ! empty( $ver ) ) {
    183 			$src = add_query_arg( 'ver', $ver, $src );
    184 		}
    185 
    186 		/** This filter is documented in wp-includes/class.wp-scripts.php */
    187 		$src = esc_url( apply_filters( 'script_loader_src', $src, $handle ) );
    188 
    189 		if ( ! $src ) {
    190 			continue;
    191 		}
    192 
    193 		$polyfill .= (
    194 			// Test presence of feature...
    195 			'( ' . $test . ' ) || ' .
    196 			/*
    197 			 * ...appending polyfill on any failures. Cautious viewers may balk
    198 			 * at the `document.write`. Its caveat of synchronous mid-stream
    199 			 * blocking write is exactly the behavior we need though.
    200 			 */
    201 			'document.write( \'<script src="' .
    202 			$src .
    203 			'"></scr\' + \'ipt>\' );'
    204 		);
    205 	}
    206 
    207 	return $polyfill;
    208 }
    209 
    210 /**
    211  * Registers all the WordPress packages scripts that are in the standardized
    212  * `js/dist/` location.
    213  *
    214  * For the order of `$scripts->add` see `wp_default_scripts`.
    215  *
    216  * @since 5.0.0
    217  *
    218  * @param WP_Scripts $scripts WP_Scripts object.
    219  */
    220 function wp_default_packages_scripts( $scripts ) {
    221 	$suffix = wp_scripts_get_suffix();
    222 
    223 	// Expects multidimensional array like:
    224 	//	'a11y.js' => array('dependencies' => array(...), 'version' => '...'),
    225 	//	'annotations.js' => array('dependencies' => array(...), 'version' => '...'),
    226 	//	'api-fetch.js' => array(...
    227 	$assets = include ABSPATH . WPINC . '/assets/script-loader-packages.php';
    228 
    229 	foreach ( $assets as $package_name => $package_data ) {
    230 		$basename = basename( $package_name, '.js' );
    231 		$handle   = 'wp-' . $basename;
    232 		$path     = "/wp-includes/js/dist/{$basename}{$suffix}.js";
    233 
    234 		if ( ! empty( $package_data['dependencies'] ) ) {
    235 			$dependencies = $package_data['dependencies'];
    236 		} else {
    237 			$dependencies = array();
    238 		}
    239 
    240 		// Add dependencies that cannot be detected and generated by build tools.
    241 		switch ( $handle ) {
    242 			case 'wp-block-library':
    243 				array_push( $dependencies, 'editor' );
    244 				break;
    245 			case 'wp-edit-post':
    246 				array_push( $dependencies, 'media-models', 'media-views', 'postbox', 'wp-dom-ready' );
    247 				break;
    248 		}
    249 
    250 		$scripts->add( $handle, $path, $dependencies, $package_data['version'], 1 );
    251 
    252 		if ( in_array( 'wp-i18n', $dependencies, true ) ) {
    253 			$scripts->set_translations( $handle );
    254 		}
    255 
    256 		/*
    257 		 * Manually set the text direction localization after wp-i18n is printed.
    258 		 * This ensures that wp.i18n.isRTL() returns true in RTL languages.
    259 		 * We cannot use $scripts->set_translations( 'wp-i18n' ) to do this
    260 		 * because WordPress prints a script's translations *before* the script,
    261 		 * which means, in the case of wp-i18n, that wp.i18n.setLocaleData()
    262 		 * is called before wp.i18n is defined.
    263 		 */
    264 		if ( 'wp-i18n' === $handle ) {
    265 			$ltr    = _x( 'ltr', 'text direction' );
    266 			$script = sprintf( "wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ '%s' ] } );", $ltr );
    267 			$scripts->add_inline_script( $handle, $script, 'after' );
    268 		}
    269 	}
    270 }
    271 
    272 /**
    273  * Adds inline scripts required for the WordPress JavaScript packages.
    274  *
    275  * @since 5.0.0
    276  *
    277  * @param WP_Scripts $scripts WP_Scripts object.
    278  */
    279 function wp_default_packages_inline_scripts( $scripts ) {
    280 	global $wp_locale;
    281 
    282 	if ( isset( $scripts->registered['wp-api-fetch'] ) ) {
    283 		$scripts->registered['wp-api-fetch']->deps[] = 'wp-hooks';
    284 	}
    285 	$scripts->add_inline_script(
    286 		'wp-api-fetch',
    287 		sprintf(
    288 			'wp.apiFetch.use( wp.apiFetch.createRootURLMiddleware( "%s" ) );',
    289 			esc_url_raw( get_rest_url() )
    290 		),
    291 		'after'
    292 	);
    293 	$scripts->add_inline_script(
    294 		'wp-api-fetch',
    295 		implode(
    296 			"\n",
    297 			array(
    298 				sprintf(
    299 					'wp.apiFetch.nonceMiddleware = wp.apiFetch.createNonceMiddleware( "%s" );',
    300 					( wp_installing() && ! is_multisite() ) ? '' : wp_create_nonce( 'wp_rest' )
    301 				),
    302 				'wp.apiFetch.use( wp.apiFetch.nonceMiddleware );',
    303 				'wp.apiFetch.use( wp.apiFetch.mediaUploadMiddleware );',
    304 				sprintf(
    305 					'wp.apiFetch.nonceEndpoint = "%s";',
    306 					admin_url( 'admin-ajax.php?action=rest-nonce' )
    307 				),
    308 			)
    309 		),
    310 		'after'
    311 	);
    312 	$scripts->add_inline_script(
    313 		'wp-data',
    314 		implode(
    315 			"\n",
    316 			array(
    317 				'( function() {',
    318 				'	var userId = ' . get_current_user_ID() . ';',
    319 				'	var storageKey = "WP_DATA_USER_" + userId;',
    320 				'	wp.data',
    321 				'		.use( wp.data.plugins.persistence, { storageKey: storageKey } );',
    322 				'	wp.data.plugins.persistence.__unstableMigrate( { storageKey: storageKey } );',
    323 				'} )();',
    324 			)
    325 		)
    326 	);
    327 
    328 	// Calculate the timezone abbr (EDT, PST) if possible.
    329 	$timezone_string = get_option( 'timezone_string', 'UTC' );
    330 	$timezone_abbr   = '';
    331 
    332 	if ( ! empty( $timezone_string ) ) {
    333 		$timezone_date = new DateTime( null, new DateTimeZone( $timezone_string ) );
    334 		$timezone_abbr = $timezone_date->format( 'T' );
    335 	}
    336 
    337 	$scripts->add_inline_script(
    338 		'wp-date',
    339 		sprintf(
    340 			'wp.date.setSettings( %s );',
    341 			wp_json_encode(
    342 				array(
    343 					'l10n'     => array(
    344 						'locale'        => get_user_locale(),
    345 						'months'        => array_values( $wp_locale->month ),
    346 						'monthsShort'   => array_values( $wp_locale->month_abbrev ),
    347 						'weekdays'      => array_values( $wp_locale->weekday ),
    348 						'weekdaysShort' => array_values( $wp_locale->weekday_abbrev ),
    349 						'meridiem'      => (object) $wp_locale->meridiem,
    350 						'relative'      => array(
    351 							/* translators: %s: Duration. */
    352 							'future' => __( '%s from now' ),
    353 							/* translators: %s: Duration. */
    354 							'past'   => __( '%s ago' ),
    355 						),
    356 					),
    357 					'formats'  => array(
    358 						/* translators: Time format, see https://www.php.net/manual/datetime.format.php */
    359 						'time'                => get_option( 'time_format', __( 'g:i a' ) ),
    360 						/* translators: Date format, see https://www.php.net/manual/datetime.format.php */
    361 						'date'                => get_option( 'date_format', __( 'F j, Y' ) ),
    362 						/* translators: Date/Time format, see https://www.php.net/manual/datetime.format.php */
    363 						'datetime'            => __( 'F j, Y g:i a' ),
    364 						/* translators: Abbreviated date/time format, see https://www.php.net/manual/datetime.format.php */
    365 						'datetimeAbbreviated' => __( 'M j, Y g:i a' ),
    366 					),
    367 					'timezone' => array(
    368 						'offset' => get_option( 'gmt_offset', 0 ),
    369 						'string' => $timezone_string,
    370 						'abbr'   => $timezone_abbr,
    371 					),
    372 				)
    373 			)
    374 		),
    375 		'after'
    376 	);
    377 
    378 	// Loading the old editor and its config to ensure the classic block works as expected.
    379 	$scripts->add_inline_script(
    380 		'editor',
    381 		'window.wp.oldEditor = window.wp.editor;',
    382 		'after'
    383 	);
    384 
    385 	/*
    386 	 * wp-editor module is exposed as window.wp.editor.
    387 	 * Problem: there is quite some code expecting window.wp.oldEditor object available under window.wp.editor.
    388 	 * Solution: fuse the two objects together to maintain backward compatibility.
    389 	 * For more context, see https://github.com/WordPress/gutenberg/issues/33203.
    390 	 */
    391 	$scripts->add_inline_script(
    392 		'wp-editor',
    393 		'Object.assign( window.wp.editor, window.wp.oldEditor );',
    394 		'after'
    395 	);
    396 }
    397 
    398 /**
    399  * Adds inline scripts required for the TinyMCE in the block editor.
    400  *
    401  * These TinyMCE init settings are used to extend and override the default settings
    402  * from `_WP_Editors::default_settings()` for the Classic block.
    403  *
    404  * @since 5.0.0
    405  *
    406  * @global WP_Scripts $wp_scripts
    407  */
    408 function wp_tinymce_inline_scripts() {
    409 	global $wp_scripts;
    410 
    411 	/** This filter is documented in wp-includes/class-wp-editor.php */
    412 	$editor_settings = apply_filters( 'wp_editor_settings', array( 'tinymce' => true ), 'classic-block' );
    413 
    414 	$tinymce_plugins = array(
    415 		'charmap',
    416 		'colorpicker',
    417 		'hr',
    418 		'lists',
    419 		'media',
    420 		'paste',
    421 		'tabfocus',
    422 		'textcolor',
    423 		'fullscreen',
    424 		'wordpress',
    425 		'wpautoresize',
    426 		'wpeditimage',
    427 		'wpemoji',
    428 		'wpgallery',
    429 		'wplink',
    430 		'wpdialogs',
    431 		'wptextpattern',
    432 		'wpview',
    433 	);
    434 
    435 	/** This filter is documented in wp-includes/class-wp-editor.php */
    436 	$tinymce_plugins = apply_filters( 'tiny_mce_plugins', $tinymce_plugins, 'classic-block' );
    437 	$tinymce_plugins = array_unique( $tinymce_plugins );
    438 
    439 	$disable_captions = false;
    440 	// Runs after `tiny_mce_plugins` but before `mce_buttons`.
    441 	/** This filter is documented in wp-admin/includes/media.php */
    442 	if ( apply_filters( 'disable_captions', '' ) ) {
    443 		$disable_captions = true;
    444 	}
    445 
    446 	$toolbar1 = array(
    447 		'formatselect',
    448 		'bold',
    449 		'italic',
    450 		'bullist',
    451 		'numlist',
    452 		'blockquote',
    453 		'alignleft',
    454 		'aligncenter',
    455 		'alignright',
    456 		'link',
    457 		'unlink',
    458 		'wp_more',
    459 		'spellchecker',
    460 		'wp_add_media',
    461 		'wp_adv',
    462 	);
    463 
    464 	/** This filter is documented in wp-includes/class-wp-editor.php */
    465 	$toolbar1 = apply_filters( 'mce_buttons', $toolbar1, 'classic-block' );
    466 
    467 	$toolbar2 = array(
    468 		'strikethrough',
    469 		'hr',
    470 		'forecolor',
    471 		'pastetext',
    472 		'removeformat',
    473 		'charmap',
    474 		'outdent',
    475 		'indent',
    476 		'undo',
    477 		'redo',
    478 		'wp_help',
    479 	);
    480 
    481 	/** This filter is documented in wp-includes/class-wp-editor.php */
    482 	$toolbar2 = apply_filters( 'mce_buttons_2', $toolbar2, 'classic-block' );
    483 	/** This filter is documented in wp-includes/class-wp-editor.php */
    484 	$toolbar3 = apply_filters( 'mce_buttons_3', array(), 'classic-block' );
    485 	/** This filter is documented in wp-includes/class-wp-editor.php */
    486 	$toolbar4 = apply_filters( 'mce_buttons_4', array(), 'classic-block' );
    487 	/** This filter is documented in wp-includes/class-wp-editor.php */
    488 	$external_plugins = apply_filters( 'mce_external_plugins', array(), 'classic-block' );
    489 
    490 	$tinymce_settings = array(
    491 		'plugins'              => implode( ',', $tinymce_plugins ),
    492 		'toolbar1'             => implode( ',', $toolbar1 ),
    493 		'toolbar2'             => implode( ',', $toolbar2 ),
    494 		'toolbar3'             => implode( ',', $toolbar3 ),
    495 		'toolbar4'             => implode( ',', $toolbar4 ),
    496 		'external_plugins'     => wp_json_encode( $external_plugins ),
    497 		'classic_block_editor' => true,
    498 	);
    499 
    500 	if ( $disable_captions ) {
    501 		$tinymce_settings['wpeditimage_disable_captions'] = true;
    502 	}
    503 
    504 	if ( ! empty( $editor_settings['tinymce'] ) && is_array( $editor_settings['tinymce'] ) ) {
    505 		array_merge( $tinymce_settings, $editor_settings['tinymce'] );
    506 	}
    507 
    508 	/** This filter is documented in wp-includes/class-wp-editor.php */
    509 	$tinymce_settings = apply_filters( 'tiny_mce_before_init', $tinymce_settings, 'classic-block' );
    510 
    511 	// Do "by hand" translation from PHP array to js object.
    512 	// Prevents breakage in some custom settings.
    513 	$init_obj = '';
    514 	foreach ( $tinymce_settings as $key => $value ) {
    515 		if ( is_bool( $value ) ) {
    516 			$val       = $value ? 'true' : 'false';
    517 			$init_obj .= $key . ':' . $val . ',';
    518 			continue;
    519 		} elseif ( ! empty( $value ) && is_string( $value ) && (
    520 			( '{' === $value[0] && '}' === $value[ strlen( $value ) - 1 ] ) ||
    521 			( '[' === $value[0] && ']' === $value[ strlen( $value ) - 1 ] ) ||
    522 			preg_match( '/^\(?function ?\(/', $value ) ) ) {
    523 			$init_obj .= $key . ':' . $value . ',';
    524 			continue;
    525 		}
    526 		$init_obj .= $key . ':"' . $value . '",';
    527 	}
    528 
    529 	$init_obj = '{' . trim( $init_obj, ' ,' ) . '}';
    530 
    531 	$script = 'window.wpEditorL10n = {
    532 		tinymce: {
    533 			baseURL: ' . wp_json_encode( includes_url( 'js/tinymce' ) ) . ',
    534 			suffix: ' . ( SCRIPT_DEBUG ? '""' : '".min"' ) . ',
    535 			settings: ' . $init_obj . ',
    536 		}
    537 	}';
    538 
    539 	$wp_scripts->add_inline_script( 'wp-block-library', $script, 'before' );
    540 }
    541 
    542 /**
    543  * Registers all the WordPress packages scripts.
    544  *
    545  * @since 5.0.0
    546  *
    547  * @param WP_Scripts $scripts WP_Scripts object.
    548  */
    549 function wp_default_packages( $scripts ) {
    550 	wp_default_packages_vendor( $scripts );
    551 	wp_register_tinymce_scripts( $scripts );
    552 	wp_default_packages_scripts( $scripts );
    553 
    554 	if ( did_action( 'init' ) ) {
    555 		wp_default_packages_inline_scripts( $scripts );
    556 	}
    557 }
    558 
    559 /**
    560  * Returns the suffix that can be used for the scripts.
    561  *
    562  * There are two suffix types, the normal one and the dev suffix.
    563  *
    564  * @since 5.0.0
    565  *
    566  * @param string $type The type of suffix to retrieve.
    567  * @return string The script suffix.
    568  */
    569 function wp_scripts_get_suffix( $type = '' ) {
    570 	static $suffixes;
    571 
    572 	if ( null === $suffixes ) {
    573 		// Include an unmodified $wp_version.
    574 		require ABSPATH . WPINC . '/version.php';
    575 
    576 		$develop_src = false !== strpos( $wp_version, '-src' );
    577 
    578 		if ( ! defined( 'SCRIPT_DEBUG' ) ) {
    579 			define( 'SCRIPT_DEBUG', $develop_src );
    580 		}
    581 		$suffix     = SCRIPT_DEBUG ? '' : '.min';
    582 		$dev_suffix = $develop_src ? '' : '.min';
    583 
    584 		$suffixes = array(
    585 			'suffix'     => $suffix,
    586 			'dev_suffix' => $dev_suffix,
    587 		);
    588 	}
    589 
    590 	if ( 'dev' === $type ) {
    591 		return $suffixes['dev_suffix'];
    592 	}
    593 
    594 	return $suffixes['suffix'];
    595 }
    596 
    597 /**
    598  * Register all WordPress scripts.
    599  *
    600  * Localizes some of them.
    601  * args order: `$scripts->add( 'handle', 'url', 'dependencies', 'query-string', 1 );`
    602  * when last arg === 1 queues the script for the footer
    603  *
    604  * @since 2.6.0
    605  *
    606  * @param WP_Scripts $scripts WP_Scripts object.
    607  */
    608 function wp_default_scripts( $scripts ) {
    609 	$suffix     = wp_scripts_get_suffix();
    610 	$dev_suffix = wp_scripts_get_suffix( 'dev' );
    611 	$guessurl   = site_url();
    612 
    613 	if ( ! $guessurl ) {
    614 		$guessed_url = true;
    615 		$guessurl    = wp_guess_url();
    616 	}
    617 
    618 	$scripts->base_url        = $guessurl;
    619 	$scripts->content_url     = defined( 'WP_CONTENT_URL' ) ? WP_CONTENT_URL : '';
    620 	$scripts->default_version = get_bloginfo( 'version' );
    621 	$scripts->default_dirs    = array( '/wp-admin/js/', '/wp-includes/js/' );
    622 
    623 	$scripts->add( 'utils', "/wp-includes/js/utils$suffix.js" );
    624 	did_action( 'init' ) && $scripts->localize(
    625 		'utils',
    626 		'userSettings',
    627 		array(
    628 			'url'    => (string) SITECOOKIEPATH,
    629 			'uid'    => (string) get_current_user_id(),
    630 			'time'   => (string) time(),
    631 			'secure' => (string) ( 'https' === parse_url( site_url(), PHP_URL_SCHEME ) ),
    632 		)
    633 	);
    634 
    635 	$scripts->add( 'common', "/wp-admin/js/common$suffix.js", array( 'jquery', 'hoverIntent', 'utils' ), false, 1 );
    636 	$scripts->set_translations( 'common' );
    637 
    638 	$scripts->add( 'wp-sanitize', "/wp-includes/js/wp-sanitize$suffix.js", array(), false, 1 );
    639 
    640 	$scripts->add( 'sack', "/wp-includes/js/tw-sack$suffix.js", array(), '1.6.1', 1 );
    641 
    642 	$scripts->add( 'quicktags', "/wp-includes/js/quicktags$suffix.js", array(), false, 1 );
    643 	did_action( 'init' ) && $scripts->localize(
    644 		'quicktags',
    645 		'quicktagsL10n',
    646 		array(
    647 			'closeAllOpenTags'      => __( 'Close all open tags' ),
    648 			'closeTags'             => __( 'close tags' ),
    649 			'enterURL'              => __( 'Enter the URL' ),
    650 			'enterImageURL'         => __( 'Enter the URL of the image' ),
    651 			'enterImageDescription' => __( 'Enter a description of the image' ),
    652 			'textdirection'         => __( 'text direction' ),
    653 			'toggleTextdirection'   => __( 'Toggle Editor Text Direction' ),
    654 			'dfw'                   => __( 'Distraction-free writing mode' ),
    655 			'strong'                => __( 'Bold' ),
    656 			'strongClose'           => __( 'Close bold tag' ),
    657 			'em'                    => __( 'Italic' ),
    658 			'emClose'               => __( 'Close italic tag' ),
    659 			'link'                  => __( 'Insert link' ),
    660 			'blockquote'            => __( 'Blockquote' ),
    661 			'blockquoteClose'       => __( 'Close blockquote tag' ),
    662 			'del'                   => __( 'Deleted text (strikethrough)' ),
    663 			'delClose'              => __( 'Close deleted text tag' ),
    664 			'ins'                   => __( 'Inserted text' ),
    665 			'insClose'              => __( 'Close inserted text tag' ),
    666 			'image'                 => __( 'Insert image' ),
    667 			'ul'                    => __( 'Bulleted list' ),
    668 			'ulClose'               => __( 'Close bulleted list tag' ),
    669 			'ol'                    => __( 'Numbered list' ),
    670 			'olClose'               => __( 'Close numbered list tag' ),
    671 			'li'                    => __( 'List item' ),
    672 			'liClose'               => __( 'Close list item tag' ),
    673 			'code'                  => __( 'Code' ),
    674 			'codeClose'             => __( 'Close code tag' ),
    675 			'more'                  => __( 'Insert Read More tag' ),
    676 		)
    677 	);
    678 
    679 	$scripts->add( 'colorpicker', "/wp-includes/js/colorpicker$suffix.js", array( 'prototype' ), '3517m' );
    680 
    681 	$scripts->add( 'editor', "/wp-admin/js/editor$suffix.js", array( 'utils', 'jquery' ), false, 1 );
    682 
    683 	$scripts->add( 'clipboard', "/wp-includes/js/clipboard$suffix.js", array(), false, 1 );
    684 
    685 	$scripts->add( 'wp-ajax-response', "/wp-includes/js/wp-ajax-response$suffix.js", array( 'jquery' ), false, 1 );
    686 	did_action( 'init' ) && $scripts->localize(
    687 		'wp-ajax-response',
    688 		'wpAjax',
    689 		array(
    690 			'noPerm' => __( 'Sorry, you are not allowed to do that.' ),
    691 			'broken' => __( 'Something went wrong.' ),
    692 		)
    693 	);
    694 
    695 	$scripts->add( 'wp-api-request', "/wp-includes/js/api-request$suffix.js", array( 'jquery' ), false, 1 );
    696 	// `wpApiSettings` is also used by `wp-api`, which depends on this script.
    697 	did_action( 'init' ) && $scripts->localize(
    698 		'wp-api-request',
    699 		'wpApiSettings',
    700 		array(
    701 			'root'          => esc_url_raw( get_rest_url() ),
    702 			'nonce'         => ( wp_installing() && ! is_multisite() ) ? '' : wp_create_nonce( 'wp_rest' ),
    703 			'versionString' => 'wp/v2/',
    704 		)
    705 	);
    706 
    707 	$scripts->add( 'wp-pointer', "/wp-includes/js/wp-pointer$suffix.js", array( 'jquery-ui-core' ), false, 1 );
    708 	$scripts->set_translations( 'wp-pointer' );
    709 
    710 	$scripts->add( 'autosave', "/wp-includes/js/autosave$suffix.js", array( 'heartbeat' ), false, 1 );
    711 
    712 	$scripts->add( 'heartbeat', "/wp-includes/js/heartbeat$suffix.js", array( 'jquery', 'wp-hooks' ), false, 1 );
    713 	did_action( 'init' ) && $scripts->localize(
    714 		'heartbeat',
    715 		'heartbeatSettings',
    716 		/**
    717 		 * Filters the Heartbeat settings.
    718 		 *
    719 		 * @since 3.6.0
    720 		 *
    721 		 * @param array $settings Heartbeat settings array.
    722 		 */
    723 		apply_filters( 'heartbeat_settings', array() )
    724 	);
    725 
    726 	$scripts->add( 'wp-auth-check', "/wp-includes/js/wp-auth-check$suffix.js", array( 'heartbeat' ), false, 1 );
    727 	$scripts->set_translations( 'wp-auth-check' );
    728 
    729 	$scripts->add( 'wp-lists', "/wp-includes/js/wp-lists$suffix.js", array( 'wp-ajax-response', 'jquery-color' ), false, 1 );
    730 
    731 	// WordPress no longer uses or bundles Prototype or script.aculo.us. These are now pulled from an external source.
    732 	$scripts->add( 'prototype', 'https://ajax.googleapis.com/ajax/libs/prototype/1.7.1.0/prototype.js', array(), '1.7.1' );
    733 	$scripts->add( 'scriptaculous-root', 'https://ajax.googleapis.com/ajax/libs/scriptaculous/1.9.0/scriptaculous.js', array( 'prototype' ), '1.9.0' );
    734 	$scripts->add( 'scriptaculous-builder', 'https://ajax.googleapis.com/ajax/libs/scriptaculous/1.9.0/builder.js', array( 'scriptaculous-root' ), '1.9.0' );
    735 	$scripts->add( 'scriptaculous-dragdrop', 'https://ajax.googleapis.com/ajax/libs/scriptaculous/1.9.0/dragdrop.js', array( 'scriptaculous-builder', 'scriptaculous-effects' ), '1.9.0' );
    736 	$scripts->add( 'scriptaculous-effects', 'https://ajax.googleapis.com/ajax/libs/scriptaculous/1.9.0/effects.js', array( 'scriptaculous-root' ), '1.9.0' );
    737 	$scripts->add( 'scriptaculous-slider', 'https://ajax.googleapis.com/ajax/libs/scriptaculous/1.9.0/slider.js', array( 'scriptaculous-effects' ), '1.9.0' );
    738 	$scripts->add( 'scriptaculous-sound', 'https://ajax.googleapis.com/ajax/libs/scriptaculous/1.9.0/sound.js', array( 'scriptaculous-root' ), '1.9.0' );
    739 	$scripts->add( 'scriptaculous-controls', 'https://ajax.googleapis.com/ajax/libs/scriptaculous/1.9.0/controls.js', array( 'scriptaculous-root' ), '1.9.0' );
    740 	$scripts->add( 'scriptaculous', false, array( 'scriptaculous-dragdrop', 'scriptaculous-slider', 'scriptaculous-controls' ) );
    741 
    742 	// Not used in core, replaced by Jcrop.js.
    743 	$scripts->add( 'cropper', '/wp-includes/js/crop/cropper.js', array( 'scriptaculous-dragdrop' ) );
    744 
    745 	// jQuery.
    746 	// The unminified jquery.js and jquery-migrate.js are included to facilitate debugging.
    747 	$scripts->add( 'jquery', false, array( 'jquery-core', 'jquery-migrate' ), '3.6.0' );
    748 	$scripts->add( 'jquery-core', "/wp-includes/js/jquery/jquery$suffix.js", array(), '3.6.0' );
    749 	$scripts->add( 'jquery-migrate', "/wp-includes/js/jquery/jquery-migrate$suffix.js", array(), '3.3.2' );
    750 
    751 	// Full jQuery UI.
    752 	// The build process in 1.12.1 has changed significantly.
    753 	// In order to keep backwards compatibility, and to keep the optimized loading,
    754 	// the source files were flattened and included with some modifications for AMD loading.
    755 	// A notable change is that 'jquery-ui-core' now contains 'jquery-ui-position' and 'jquery-ui-widget'.
    756 	$scripts->add( 'jquery-ui-core', "/wp-includes/js/jquery/ui/core$suffix.js", array( 'jquery' ), '1.12.1', 1 );
    757 	$scripts->add( 'jquery-effects-core', "/wp-includes/js/jquery/ui/effect$suffix.js", array( 'jquery' ), '1.12.1', 1 );
    758 
    759 	$scripts->add( 'jquery-effects-blind', "/wp-includes/js/jquery/ui/effect-blind$suffix.js", array( 'jquery-effects-core' ), '1.12.1', 1 );
    760 	$scripts->add( 'jquery-effects-bounce', "/wp-includes/js/jquery/ui/effect-bounce$suffix.js", array( 'jquery-effects-core' ), '1.12.1', 1 );
    761 	$scripts->add( 'jquery-effects-clip', "/wp-includes/js/jquery/ui/effect-clip$suffix.js", array( 'jquery-effects-core' ), '1.12.1', 1 );
    762 	$scripts->add( 'jquery-effects-drop', "/wp-includes/js/jquery/ui/effect-drop$suffix.js", array( 'jquery-effects-core' ), '1.12.1', 1 );
    763 	$scripts->add( 'jquery-effects-explode', "/wp-includes/js/jquery/ui/effect-explode$suffix.js", array( 'jquery-effects-core' ), '1.12.1', 1 );
    764 	$scripts->add( 'jquery-effects-fade', "/wp-includes/js/jquery/ui/effect-fade$suffix.js", array( 'jquery-effects-core' ), '1.12.1', 1 );
    765 	$scripts->add( 'jquery-effects-fold', "/wp-includes/js/jquery/ui/effect-fold$suffix.js", array( 'jquery-effects-core' ), '1.12.1', 1 );
    766 	$scripts->add( 'jquery-effects-highlight', "/wp-includes/js/jquery/ui/effect-highlight$suffix.js", array( 'jquery-effects-core' ), '1.12.1', 1 );
    767 	$scripts->add( 'jquery-effects-puff', "/wp-includes/js/jquery/ui/effect-puff$suffix.js", array( 'jquery-effects-core', 'jquery-effects-scale' ), '1.12.1', 1 );
    768 	$scripts->add( 'jquery-effects-pulsate', "/wp-includes/js/jquery/ui/effect-pulsate$suffix.js", array( 'jquery-effects-core' ), '1.12.1', 1 );
    769 	$scripts->add( 'jquery-effects-scale', "/wp-includes/js/jquery/ui/effect-scale$suffix.js", array( 'jquery-effects-core', 'jquery-effects-size' ), '1.12.1', 1 );
    770 	$scripts->add( 'jquery-effects-shake', "/wp-includes/js/jquery/ui/effect-shake$suffix.js", array( 'jquery-effects-core' ), '1.12.1', 1 );
    771 	$scripts->add( 'jquery-effects-size', "/wp-includes/js/jquery/ui/effect-size$suffix.js", array( 'jquery-effects-core' ), '1.12.1', 1 );
    772 	$scripts->add( 'jquery-effects-slide', "/wp-includes/js/jquery/ui/effect-slide$suffix.js", array( 'jquery-effects-core' ), '1.12.1', 1 );
    773 	$scripts->add( 'jquery-effects-transfer', "/wp-includes/js/jquery/ui/effect-transfer$suffix.js", array( 'jquery-effects-core' ), '1.12.1', 1 );
    774 
    775 	// Widgets
    776 	$scripts->add( 'jquery-ui-accordion', "/wp-includes/js/jquery/ui/accordion$suffix.js", array( 'jquery-ui-core' ), '1.12.1', 1 );
    777 	$scripts->add( 'jquery-ui-autocomplete', "/wp-includes/js/jquery/ui/autocomplete$suffix.js", array( 'jquery-ui-menu', 'wp-a11y' ), '1.12.1', 1 );
    778 	$scripts->add( 'jquery-ui-button', "/wp-includes/js/jquery/ui/button$suffix.js", array( 'jquery-ui-core', 'jquery-ui-controlgroup', 'jquery-ui-checkboxradio' ), '1.12.1', 1 );
    779 	$scripts->add( 'jquery-ui-datepicker', "/wp-includes/js/jquery/ui/datepicker$suffix.js", array( 'jquery-ui-core' ), '1.12.1', 1 );
    780 	$scripts->add( 'jquery-ui-dialog', "/wp-includes/js/jquery/ui/dialog$suffix.js", array( 'jquery-ui-resizable', 'jquery-ui-draggable', 'jquery-ui-button' ), '1.12.1', 1 );
    781 	$scripts->add( 'jquery-ui-menu', "/wp-includes/js/jquery/ui/menu$suffix.js", array( 'jquery-ui-core' ), '1.12.1', 1 );
    782 	$scripts->add( 'jquery-ui-mouse', "/wp-includes/js/jquery/ui/mouse$suffix.js", array( 'jquery-ui-core' ), '1.12.1', 1 );
    783 	$scripts->add( 'jquery-ui-progressbar', "/wp-includes/js/jquery/ui/progressbar$suffix.js", array( 'jquery-ui-core' ), '1.12.1', 1 );
    784 	$scripts->add( 'jquery-ui-selectmenu', "/wp-includes/js/jquery/ui/selectmenu$suffix.js", array( 'jquery-ui-menu' ), '1.12.1', 1 );
    785 	$scripts->add( 'jquery-ui-slider', "/wp-includes/js/jquery/ui/slider$suffix.js", array( 'jquery-ui-mouse' ), '1.12.1', 1 );
    786 	$scripts->add( 'jquery-ui-spinner', "/wp-includes/js/jquery/ui/spinner$suffix.js", array( 'jquery-ui-button' ), '1.12.1', 1 );
    787 	$scripts->add( 'jquery-ui-tabs', "/wp-includes/js/jquery/ui/tabs$suffix.js", array( 'jquery-ui-core' ), '1.12.1', 1 );
    788 	$scripts->add( 'jquery-ui-tooltip', "/wp-includes/js/jquery/ui/tooltip$suffix.js", array( 'jquery-ui-core' ), '1.12.1', 1 );
    789 
    790 	// New in 1.12.1
    791 	$scripts->add( 'jquery-ui-checkboxradio', "/wp-includes/js/jquery/ui/checkboxradio$suffix.js", array( 'jquery-ui-core' ), '1.12.1', 1 );
    792 	$scripts->add( 'jquery-ui-controlgroup', "/wp-includes/js/jquery/ui/controlgroup$suffix.js", array( 'jquery-ui-core' ), '1.12.1', 1 );
    793 
    794 	// Interactions
    795 	$scripts->add( 'jquery-ui-draggable', "/wp-includes/js/jquery/ui/draggable$suffix.js", array( 'jquery-ui-mouse' ), '1.12.1', 1 );
    796 	$scripts->add( 'jquery-ui-droppable', "/wp-includes/js/jquery/ui/droppable$suffix.js", array( 'jquery-ui-draggable' ), '1.12.1', 1 );
    797 	$scripts->add( 'jquery-ui-resizable', "/wp-includes/js/jquery/ui/resizable$suffix.js", array( 'jquery-ui-mouse' ), '1.12.1', 1 );
    798 	$scripts->add( 'jquery-ui-selectable', "/wp-includes/js/jquery/ui/selectable$suffix.js", array( 'jquery-ui-mouse' ), '1.12.1', 1 );
    799 	$scripts->add( 'jquery-ui-sortable', "/wp-includes/js/jquery/ui/sortable$suffix.js", array( 'jquery-ui-mouse' ), '1.12.1', 1 );
    800 
    801 	// As of 1.12.1 `jquery-ui-position` and `jquery-ui-widget` are part of `jquery-ui-core`.
    802 	// Listed here for back-compat.
    803 	$scripts->add( 'jquery-ui-position', false, array( 'jquery-ui-core' ), '1.12.1', 1 );
    804 	$scripts->add( 'jquery-ui-widget', false, array( 'jquery-ui-core' ), '1.12.1', 1 );
    805 
    806 	// Strings for 'jquery-ui-autocomplete' live region messages.
    807 	did_action( 'init' ) && $scripts->localize(
    808 		'jquery-ui-autocomplete',
    809 		'uiAutocompleteL10n',
    810 		array(
    811 			'noResults'    => __( 'No results found.' ),
    812 			/* translators: Number of results found when using jQuery UI Autocomplete. */
    813 			'oneResult'    => __( '1 result found. Use up and down arrow keys to navigate.' ),
    814 			/* translators: %d: Number of results found when using jQuery UI Autocomplete. */
    815 			'manyResults'  => __( '%d results found. Use up and down arrow keys to navigate.' ),
    816 			'itemSelected' => __( 'Item selected.' ),
    817 		)
    818 	);
    819 
    820 	// Deprecated, not used in core, most functionality is included in jQuery 1.3.
    821 	$scripts->add( 'jquery-form', "/wp-includes/js/jquery/jquery.form$suffix.js", array( 'jquery' ), '4.3.0', 1 );
    822 
    823 	// jQuery plugins.
    824 	$scripts->add( 'jquery-color', '/wp-includes/js/jquery/jquery.color.min.js', array( 'jquery' ), '2.1.2', 1 );
    825 	$scripts->add( 'schedule', '/wp-includes/js/jquery/jquery.schedule.js', array( 'jquery' ), '20m', 1 );
    826 	$scripts->add( 'jquery-query', '/wp-includes/js/jquery/jquery.query.js', array( 'jquery' ), '2.1.7', 1 );
    827 	$scripts->add( 'jquery-serialize-object', '/wp-includes/js/jquery/jquery.serialize-object.js', array( 'jquery' ), '0.2-wp', 1 );
    828 	$scripts->add( 'jquery-hotkeys', "/wp-includes/js/jquery/jquery.hotkeys$suffix.js", array( 'jquery' ), '0.0.2m', 1 );
    829 	$scripts->add( 'jquery-table-hotkeys', "/wp-includes/js/jquery/jquery.table-hotkeys$suffix.js", array( 'jquery', 'jquery-hotkeys' ), false, 1 );
    830 	$scripts->add( 'jquery-touch-punch', '/wp-includes/js/jquery/jquery.ui.touch-punch.js', array( 'jquery-ui-core', 'jquery-ui-mouse' ), '0.2.2', 1 );
    831 
    832 	// Not used any more, registered for backward compatibility.
    833 	$scripts->add( 'suggest', "/wp-includes/js/jquery/suggest$suffix.js", array( 'jquery' ), '1.1-20110113', 1 );
    834 
    835 	// Masonry v2 depended on jQuery. v3 does not. The older jquery-masonry handle is a shiv.
    836 	// It sets jQuery as a dependency, as the theme may have been implicitly loading it this way.
    837 	$scripts->add( 'imagesloaded', '/wp-includes/js/imagesloaded.min.js', array(), '4.1.4', 1 );
    838 	$scripts->add( 'masonry', '/wp-includes/js/masonry.min.js', array( 'imagesloaded' ), '4.2.2', 1 );
    839 	$scripts->add( 'jquery-masonry', '/wp-includes/js/jquery/jquery.masonry.min.js', array( 'jquery', 'masonry' ), '3.1.2b', 1 );
    840 
    841 	$scripts->add( 'thickbox', '/wp-includes/js/thickbox/thickbox.js', array( 'jquery' ), '3.1-20121105', 1 );
    842 	did_action( 'init' ) && $scripts->localize(
    843 		'thickbox',
    844 		'thickboxL10n',
    845 		array(
    846 			'next'             => __( 'Next &gt;' ),
    847 			'prev'             => __( '&lt; Prev' ),
    848 			'image'            => __( 'Image' ),
    849 			'of'               => __( 'of' ),
    850 			'close'            => __( 'Close' ),
    851 			'noiframes'        => __( 'This feature requires inline frames. You have iframes disabled or your browser does not support them.' ),
    852 			'loadingAnimation' => includes_url( 'js/thickbox/loadingAnimation.gif' ),
    853 		)
    854 	);
    855 
    856 	$scripts->add( 'jcrop', '/wp-includes/js/jcrop/jquery.Jcrop.min.js', array( 'jquery' ), '0.9.12' );
    857 
    858 	$scripts->add( 'swfobject', '/wp-includes/js/swfobject.js', array(), '2.2-20120417' );
    859 
    860 	// Error messages for Plupload.
    861 	$uploader_l10n = array(
    862 		'queue_limit_exceeded'      => __( 'You have attempted to queue too many files.' ),
    863 		/* translators: %s: File name. */
    864 		'file_exceeds_size_limit'   => __( '%s exceeds the maximum upload size for this site.' ),
    865 		'zero_byte_file'            => __( 'This file is empty. Please try another.' ),
    866 		'invalid_filetype'          => __( 'Sorry, this file type is not permitted for security reasons.' ),
    867 		'not_an_image'              => __( 'This file is not an image. Please try another.' ),
    868 		'image_memory_exceeded'     => __( 'Memory exceeded. Please try another smaller file.' ),
    869 		'image_dimensions_exceeded' => __( 'This is larger than the maximum size. Please try another.' ),
    870 		'default_error'             => __( 'An error occurred in the upload. Please try again later.' ),
    871 		'missing_upload_url'        => __( 'There was a configuration error. Please contact the server administrator.' ),
    872 		'upload_limit_exceeded'     => __( 'You may only upload 1 file.' ),
    873 		'http_error'                => __( 'Unexpected response from the server. The file may have been uploaded successfully. Check in the Media Library or reload the page.' ),
    874 		'http_error_image'          => __( 'Post-processing of the image failed likely because the server is busy or does not have enough resources. Uploading a smaller image may help. Suggested maximum size is 2500 pixels.' ),
    875 		'upload_failed'             => __( 'Upload failed.' ),
    876 		/* translators: 1: Opening link tag, 2: Closing link tag. */
    877 		'big_upload_failed'         => __( 'Please try uploading this file with the %1$sbrowser uploader%2$s.' ),
    878 		/* translators: %s: File name. */
    879 		'big_upload_queued'         => __( '%s exceeds the maximum upload size for the multi-file uploader when used in your browser.' ),
    880 		'io_error'                  => __( 'IO error.' ),
    881 		'security_error'            => __( 'Security error.' ),
    882 		'file_cancelled'            => __( 'File canceled.' ),
    883 		'upload_stopped'            => __( 'Upload stopped.' ),
    884 		'dismiss'                   => __( 'Dismiss' ),
    885 		'crunching'                 => __( 'Crunching&hellip;' ),
    886 		'deleted'                   => __( 'moved to the Trash.' ),
    887 		/* translators: %s: File name. */
    888 		'error_uploading'           => __( '&#8220;%s&#8221; has failed to upload.' ),
    889 		'unsupported_image'         => __( 'This image cannot be displayed in a web browser. For best results convert it to JPEG before uploading.' ),
    890 		'noneditable_image'         => __( 'This image cannot be processed by the web server. Convert it to JPEG or PNG before uploading.' ),
    891 		'file_url_copied'           => __( 'The file URL has been copied to your clipboard' ),
    892 	);
    893 
    894 	$scripts->add( 'moxiejs', "/wp-includes/js/plupload/moxie$suffix.js", array(), '1.3.5' );
    895 	$scripts->add( 'plupload', "/wp-includes/js/plupload/plupload$suffix.js", array( 'moxiejs' ), '2.1.9' );
    896 	// Back compat handles:
    897 	foreach ( array( 'all', 'html5', 'flash', 'silverlight', 'html4' ) as $handle ) {
    898 		$scripts->add( "plupload-$handle", false, array( 'plupload' ), '2.1.1' );
    899 	}
    900 
    901 	$scripts->add( 'plupload-handlers', "/wp-includes/js/plupload/handlers$suffix.js", array( 'clipboard', 'jquery', 'plupload', 'underscore', 'wp-a11y', 'wp-i18n' ) );
    902 	did_action( 'init' ) && $scripts->localize( 'plupload-handlers', 'pluploadL10n', $uploader_l10n );
    903 
    904 	$scripts->add( 'wp-plupload', "/wp-includes/js/plupload/wp-plupload$suffix.js", array( 'plupload', 'jquery', 'json2', 'media-models' ), false, 1 );
    905 	did_action( 'init' ) && $scripts->localize( 'wp-plupload', 'pluploadL10n', $uploader_l10n );
    906 
    907 	// Keep 'swfupload' for back-compat.
    908 	$scripts->add( 'swfupload', '/wp-includes/js/swfupload/swfupload.js', array(), '2201-20110113' );
    909 	$scripts->add( 'swfupload-all', false, array( 'swfupload' ), '2201' );
    910 	$scripts->add( 'swfupload-handlers', "/wp-includes/js/swfupload/handlers$suffix.js", array( 'swfupload-all', 'jquery' ), '2201-20110524' );
    911 	did_action( 'init' ) && $scripts->localize( 'swfupload-handlers', 'swfuploadL10n', $uploader_l10n );
    912 
    913 	$scripts->add( 'comment-reply', "/wp-includes/js/comment-reply$suffix.js", array(), false, 1 );
    914 
    915 	$scripts->add( 'json2', "/wp-includes/js/json2$suffix.js", array(), '2015-05-03' );
    916 	did_action( 'init' ) && $scripts->add_data( 'json2', 'conditional', 'lt IE 8' );
    917 
    918 	$scripts->add( 'underscore', "/wp-includes/js/underscore$dev_suffix.js", array(), '1.13.1', 1 );
    919 	$scripts->add( 'backbone', "/wp-includes/js/backbone$dev_suffix.js", array( 'underscore', 'jquery' ), '1.4.0', 1 );
    920 
    921 	$scripts->add( 'wp-util', "/wp-includes/js/wp-util$suffix.js", array( 'underscore', 'jquery' ), false, 1 );
    922 	did_action( 'init' ) && $scripts->localize(
    923 		'wp-util',
    924 		'_wpUtilSettings',
    925 		array(
    926 			'ajax' => array(
    927 				'url' => admin_url( 'admin-ajax.php', 'relative' ),
    928 			),
    929 		)
    930 	);
    931 
    932 	$scripts->add( 'wp-backbone', "/wp-includes/js/wp-backbone$suffix.js", array( 'backbone', 'wp-util' ), false, 1 );
    933 
    934 	$scripts->add( 'revisions', "/wp-admin/js/revisions$suffix.js", array( 'wp-backbone', 'jquery-ui-slider', 'hoverIntent' ), false, 1 );
    935 
    936 	$scripts->add( 'imgareaselect', "/wp-includes/js/imgareaselect/jquery.imgareaselect$suffix.js", array( 'jquery' ), false, 1 );
    937 
    938 	$scripts->add( 'mediaelement', false, array( 'jquery', 'mediaelement-core', 'mediaelement-migrate' ), '4.2.16', 1 );
    939 	$scripts->add( 'mediaelement-core', "/wp-includes/js/mediaelement/mediaelement-and-player$suffix.js", array(), '4.2.16', 1 );
    940 	$scripts->add( 'mediaelement-migrate', "/wp-includes/js/mediaelement/mediaelement-migrate$suffix.js", array(), false, 1 );
    941 
    942 	did_action( 'init' ) && $scripts->add_inline_script(
    943 		'mediaelement-core',
    944 		sprintf(
    945 			'var mejsL10n = %s;',
    946 			wp_json_encode(
    947 				array(
    948 					'language' => strtolower( strtok( determine_locale(), '_-' ) ),
    949 					'strings'  => array(
    950 						'mejs.download-file'       => __( 'Download File' ),
    951 						'mejs.install-flash'       => __( 'You are using a browser that does not have Flash player enabled or installed. Please turn on your Flash player plugin or download the latest version from https://get.adobe.com/flashplayer/' ),
    952 						'mejs.fullscreen'          => __( 'Fullscreen' ),
    953 						'mejs.play'                => __( 'Play' ),
    954 						'mejs.pause'               => __( 'Pause' ),
    955 						'mejs.time-slider'         => __( 'Time Slider' ),
    956 						'mejs.time-help-text'      => __( 'Use Left/Right Arrow keys to advance one second, Up/Down arrows to advance ten seconds.' ),
    957 						'mejs.live-broadcast'      => __( 'Live Broadcast' ),
    958 						'mejs.volume-help-text'    => __( 'Use Up/Down Arrow keys to increase or decrease volume.' ),
    959 						'mejs.unmute'              => __( 'Unmute' ),
    960 						'mejs.mute'                => __( 'Mute' ),
    961 						'mejs.volume-slider'       => __( 'Volume Slider' ),
    962 						'mejs.video-player'        => __( 'Video Player' ),
    963 						'mejs.audio-player'        => __( 'Audio Player' ),
    964 						'mejs.captions-subtitles'  => __( 'Captions/Subtitles' ),
    965 						'mejs.captions-chapters'   => __( 'Chapters' ),
    966 						'mejs.none'                => __( 'None' ),
    967 						'mejs.afrikaans'           => __( 'Afrikaans' ),
    968 						'mejs.albanian'            => __( 'Albanian' ),
    969 						'mejs.arabic'              => __( 'Arabic' ),
    970 						'mejs.belarusian'          => __( 'Belarusian' ),
    971 						'mejs.bulgarian'           => __( 'Bulgarian' ),
    972 						'mejs.catalan'             => __( 'Catalan' ),
    973 						'mejs.chinese'             => __( 'Chinese' ),
    974 						'mejs.chinese-simplified'  => __( 'Chinese (Simplified)' ),
    975 						'mejs.chinese-traditional' => __( 'Chinese (Traditional)' ),
    976 						'mejs.croatian'            => __( 'Croatian' ),
    977 						'mejs.czech'               => __( 'Czech' ),
    978 						'mejs.danish'              => __( 'Danish' ),
    979 						'mejs.dutch'               => __( 'Dutch' ),
    980 						'mejs.english'             => __( 'English' ),
    981 						'mejs.estonian'            => __( 'Estonian' ),
    982 						'mejs.filipino'            => __( 'Filipino' ),
    983 						'mejs.finnish'             => __( 'Finnish' ),
    984 						'mejs.french'              => __( 'French' ),
    985 						'mejs.galician'            => __( 'Galician' ),
    986 						'mejs.german'              => __( 'German' ),
    987 						'mejs.greek'               => __( 'Greek' ),
    988 						'mejs.haitian-creole'      => __( 'Haitian Creole' ),
    989 						'mejs.hebrew'              => __( 'Hebrew' ),
    990 						'mejs.hindi'               => __( 'Hindi' ),
    991 						'mejs.hungarian'           => __( 'Hungarian' ),
    992 						'mejs.icelandic'           => __( 'Icelandic' ),
    993 						'mejs.indonesian'          => __( 'Indonesian' ),
    994 						'mejs.irish'               => __( 'Irish' ),
    995 						'mejs.italian'             => __( 'Italian' ),
    996 						'mejs.japanese'            => __( 'Japanese' ),
    997 						'mejs.korean'              => __( 'Korean' ),
    998 						'mejs.latvian'             => __( 'Latvian' ),
    999 						'mejs.lithuanian'          => __( 'Lithuanian' ),
   1000 						'mejs.macedonian'          => __( 'Macedonian' ),
   1001 						'mejs.malay'               => __( 'Malay' ),
   1002 						'mejs.maltese'             => __( 'Maltese' ),
   1003 						'mejs.norwegian'           => __( 'Norwegian' ),
   1004 						'mejs.persian'             => __( 'Persian' ),
   1005 						'mejs.polish'              => __( 'Polish' ),
   1006 						'mejs.portuguese'          => __( 'Portuguese' ),
   1007 						'mejs.romanian'            => __( 'Romanian' ),
   1008 						'mejs.russian'             => __( 'Russian' ),
   1009 						'mejs.serbian'             => __( 'Serbian' ),
   1010 						'mejs.slovak'              => __( 'Slovak' ),
   1011 						'mejs.slovenian'           => __( 'Slovenian' ),
   1012 						'mejs.spanish'             => __( 'Spanish' ),
   1013 						'mejs.swahili'             => __( 'Swahili' ),
   1014 						'mejs.swedish'             => __( 'Swedish' ),
   1015 						'mejs.tagalog'             => __( 'Tagalog' ),
   1016 						'mejs.thai'                => __( 'Thai' ),
   1017 						'mejs.turkish'             => __( 'Turkish' ),
   1018 						'mejs.ukrainian'           => __( 'Ukrainian' ),
   1019 						'mejs.vietnamese'          => __( 'Vietnamese' ),
   1020 						'mejs.welsh'               => __( 'Welsh' ),
   1021 						'mejs.yiddish'             => __( 'Yiddish' ),
   1022 					),
   1023 				)
   1024 			)
   1025 		),
   1026 		'before'
   1027 	);
   1028 
   1029 	$scripts->add( 'mediaelement-vimeo', '/wp-includes/js/mediaelement/renderers/vimeo.min.js', array( 'mediaelement' ), '4.2.16', 1 );
   1030 	$scripts->add( 'wp-mediaelement', "/wp-includes/js/mediaelement/wp-mediaelement$suffix.js", array( 'mediaelement' ), false, 1 );
   1031 	$mejs_settings = array(
   1032 		'pluginPath'  => includes_url( 'js/mediaelement/', 'relative' ),
   1033 		'classPrefix' => 'mejs-',
   1034 		'stretching'  => 'responsive',
   1035 	);
   1036 	did_action( 'init' ) && $scripts->localize(
   1037 		'mediaelement',
   1038 		'_wpmejsSettings',
   1039 		/**
   1040 		 * Filters the MediaElement configuration settings.
   1041 		 *
   1042 		 * @since 4.4.0
   1043 		 *
   1044 		 * @param array $mejs_settings MediaElement settings array.
   1045 		 */
   1046 		apply_filters( 'mejs_settings', $mejs_settings )
   1047 	);
   1048 
   1049 	$scripts->add( 'wp-codemirror', '/wp-includes/js/codemirror/codemirror.min.js', array(), '5.29.1-alpha-ee20357' );
   1050 	$scripts->add( 'csslint', '/wp-includes/js/codemirror/csslint.js', array(), '1.0.5' );
   1051 	$scripts->add( 'esprima', '/wp-includes/js/codemirror/esprima.js', array(), '4.0.0' );
   1052 	$scripts->add( 'jshint', '/wp-includes/js/codemirror/fakejshint.js', array( 'esprima' ), '2.9.5' );
   1053 	$scripts->add( 'jsonlint', '/wp-includes/js/codemirror/jsonlint.js', array(), '1.6.2' );
   1054 	$scripts->add( 'htmlhint', '/wp-includes/js/codemirror/htmlhint.js', array(), '0.9.14-xwp' );
   1055 	$scripts->add( 'htmlhint-kses', '/wp-includes/js/codemirror/htmlhint-kses.js', array( 'htmlhint' ) );
   1056 	$scripts->add( 'code-editor', "/wp-admin/js/code-editor$suffix.js", array( 'jquery', 'wp-codemirror', 'underscore' ) );
   1057 	$scripts->add( 'wp-theme-plugin-editor', "/wp-admin/js/theme-plugin-editor$suffix.js", array( 'common', 'wp-util', 'wp-sanitize', 'jquery', 'jquery-ui-core', 'wp-a11y', 'underscore' ) );
   1058 	$scripts->set_translations( 'wp-theme-plugin-editor' );
   1059 
   1060 	$scripts->add( 'wp-playlist', "/wp-includes/js/mediaelement/wp-playlist$suffix.js", array( 'wp-util', 'backbone', 'mediaelement' ), false, 1 );
   1061 
   1062 	$scripts->add( 'zxcvbn-async', "/wp-includes/js/zxcvbn-async$suffix.js", array(), '1.0' );
   1063 	did_action( 'init' ) && $scripts->localize(
   1064 		'zxcvbn-async',
   1065 		'_zxcvbnSettings',
   1066 		array(
   1067 			'src' => empty( $guessed_url ) ? includes_url( '/js/zxcvbn.min.js' ) : $scripts->base_url . '/wp-includes/js/zxcvbn.min.js',
   1068 		)
   1069 	);
   1070 
   1071 	$scripts->add( 'password-strength-meter', "/wp-admin/js/password-strength-meter$suffix.js", array( 'jquery', 'zxcvbn-async' ), false, 1 );
   1072 	did_action( 'init' ) && $scripts->localize(
   1073 		'password-strength-meter',
   1074 		'pwsL10n',
   1075 		array(
   1076 			'unknown'  => _x( 'Password strength unknown', 'password strength' ),
   1077 			'short'    => _x( 'Very weak', 'password strength' ),
   1078 			'bad'      => _x( 'Weak', 'password strength' ),
   1079 			'good'     => _x( 'Medium', 'password strength' ),
   1080 			'strong'   => _x( 'Strong', 'password strength' ),
   1081 			'mismatch' => _x( 'Mismatch', 'password mismatch' ),
   1082 		)
   1083 	);
   1084 	$scripts->set_translations( 'password-strength-meter' );
   1085 
   1086 	$scripts->add( 'application-passwords', "/wp-admin/js/application-passwords$suffix.js", array( 'jquery', 'wp-util', 'wp-api-request', 'wp-date', 'wp-i18n', 'wp-hooks' ), false, 1 );
   1087 	$scripts->set_translations( 'application-passwords' );
   1088 
   1089 	$scripts->add( 'auth-app', "/wp-admin/js/auth-app$suffix.js", array( 'jquery', 'wp-api-request', 'wp-i18n', 'wp-hooks' ), false, 1 );
   1090 	$scripts->set_translations( 'auth-app' );
   1091 
   1092 	$scripts->add( 'user-profile', "/wp-admin/js/user-profile$suffix.js", array( 'jquery', 'password-strength-meter', 'wp-util' ), false, 1 );
   1093 	$scripts->set_translations( 'user-profile' );
   1094 	$user_id = isset( $_GET['user_id'] ) ? (int) $_GET['user_id'] : 0;
   1095 	did_action( 'init' ) && $scripts->localize(
   1096 		'user-profile',
   1097 		'userProfileL10n',
   1098 		array(
   1099 			'user_id' => $user_id,
   1100 			'nonce'   => ( wp_installing() && ! is_multisite() ) ? '' : wp_create_nonce( 'reset-password-for-' . $user_id ),
   1101 		)
   1102 	);
   1103 
   1104 	$scripts->add( 'language-chooser', "/wp-admin/js/language-chooser$suffix.js", array( 'jquery' ), false, 1 );
   1105 
   1106 	$scripts->add( 'user-suggest', "/wp-admin/js/user-suggest$suffix.js", array( 'jquery-ui-autocomplete' ), false, 1 );
   1107 
   1108 	$scripts->add( 'admin-bar', "/wp-includes/js/admin-bar$suffix.js", array( 'hoverintent-js' ), false, 1 );
   1109 
   1110 	$scripts->add( 'wplink', "/wp-includes/js/wplink$suffix.js", array( 'jquery', 'wp-a11y' ), false, 1 );
   1111 	did_action( 'init' ) && $scripts->localize(
   1112 		'wplink',
   1113 		'wpLinkL10n',
   1114 		array(
   1115 			'title'          => __( 'Insert/edit link' ),
   1116 			'update'         => __( 'Update' ),
   1117 			'save'           => __( 'Add Link' ),
   1118 			'noTitle'        => __( '(no title)' ),
   1119 			'noMatchesFound' => __( 'No results found.' ),
   1120 			'linkSelected'   => __( 'Link selected.' ),
   1121 			'linkInserted'   => __( 'Link inserted.' ),
   1122 			/* translators: Minimum input length in characters to start searching posts in the "Insert/edit link" modal. */
   1123 			'minInputLength' => (int) _x( '3', 'minimum input length for searching post links' ),
   1124 		)
   1125 	);
   1126 
   1127 	$scripts->add( 'wpdialogs', "/wp-includes/js/wpdialog$suffix.js", array( 'jquery-ui-dialog' ), false, 1 );
   1128 
   1129 	$scripts->add( 'word-count', "/wp-admin/js/word-count$suffix.js", array(), false, 1 );
   1130 
   1131 	$scripts->add( 'media-upload', "/wp-admin/js/media-upload$suffix.js", array( 'thickbox', 'shortcode' ), false, 1 );
   1132 
   1133 	$scripts->add( 'hoverIntent', "/wp-includes/js/hoverIntent$suffix.js", array( 'jquery' ), '1.10.1', 1 );
   1134 
   1135 	// JS-only version of hoverintent (no dependencies).
   1136 	$scripts->add( 'hoverintent-js', '/wp-includes/js/hoverintent-js.min.js', array(), '2.2.1', 1 );
   1137 
   1138 	$scripts->add( 'customize-base', "/wp-includes/js/customize-base$suffix.js", array( 'jquery', 'json2', 'underscore' ), false, 1 );
   1139 	$scripts->add( 'customize-loader', "/wp-includes/js/customize-loader$suffix.js", array( 'customize-base' ), false, 1 );
   1140 	$scripts->add( 'customize-preview', "/wp-includes/js/customize-preview$suffix.js", array( 'wp-a11y', 'customize-base' ), false, 1 );
   1141 	$scripts->add( 'customize-models', '/wp-includes/js/customize-models.js', array( 'underscore', 'backbone' ), false, 1 );
   1142 	$scripts->add( 'customize-views', '/wp-includes/js/customize-views.js', array( 'jquery', 'underscore', 'imgareaselect', 'customize-models', 'media-editor', 'media-views' ), false, 1 );
   1143 	$scripts->add( 'customize-controls', "/wp-admin/js/customize-controls$suffix.js", array( 'customize-base', 'wp-a11y', 'wp-util', 'jquery-ui-core' ), false, 1 );
   1144 	did_action( 'init' ) && $scripts->localize(
   1145 		'customize-controls',
   1146 		'_wpCustomizeControlsL10n',
   1147 		array(
   1148 			'activate'                => __( 'Activate &amp; Publish' ),
   1149 			'save'                    => __( 'Save &amp; Publish' ), // @todo Remove as not required.
   1150 			'publish'                 => __( 'Publish' ),
   1151 			'published'               => __( 'Published' ),
   1152 			'saveDraft'               => __( 'Save Draft' ),
   1153 			'draftSaved'              => __( 'Draft Saved' ),
   1154 			'updating'                => __( 'Updating' ),
   1155 			'schedule'                => _x( 'Schedule', 'customizer changeset action/button label' ),
   1156 			'scheduled'               => _x( 'Scheduled', 'customizer changeset status' ),
   1157 			'invalid'                 => __( 'Invalid' ),
   1158 			'saveBeforeShare'         => __( 'Please save your changes in order to share the preview.' ),
   1159 			'futureDateError'         => __( 'You must supply a future date to schedule.' ),
   1160 			'saveAlert'               => __( 'The changes you made will be lost if you navigate away from this page.' ),
   1161 			'saved'                   => __( 'Saved' ),
   1162 			'cancel'                  => __( 'Cancel' ),
   1163 			'close'                   => __( 'Close' ),
   1164 			'action'                  => __( 'Action' ),
   1165 			'discardChanges'          => __( 'Discard changes' ),
   1166 			'cheatin'                 => __( 'Something went wrong.' ),
   1167 			'notAllowedHeading'       => __( 'You need a higher level of permission.' ),
   1168 			'notAllowed'              => __( 'Sorry, you are not allowed to customize this site.' ),
   1169 			'previewIframeTitle'      => __( 'Site Preview' ),
   1170 			'loginIframeTitle'        => __( 'Session expired' ),
   1171 			'collapseSidebar'         => _x( 'Hide Controls', 'label for hide controls button without length constraints' ),
   1172 			'expandSidebar'           => _x( 'Show Controls', 'label for hide controls button without length constraints' ),
   1173 			'untitledBlogName'        => __( '(Untitled)' ),
   1174 			'unknownRequestFail'      => __( 'Looks like something&#8217;s gone wrong. Wait a couple seconds, and then try again.' ),
   1175 			'themeDownloading'        => __( 'Downloading your new theme&hellip;' ),
   1176 			'themePreviewWait'        => __( 'Setting up your live preview. This may take a bit.' ),
   1177 			'revertingChanges'        => __( 'Reverting unpublished changes&hellip;' ),
   1178 			'trashConfirm'            => __( 'Are you sure you want to discard your unpublished changes?' ),
   1179 			/* translators: %s: Display name of the user who has taken over the changeset in customizer. */
   1180 			'takenOverMessage'        => __( '%s has taken over and is currently customizing.' ),
   1181 			/* translators: %s: URL to the Customizer to load the autosaved version. */
   1182 			'autosaveNotice'          => __( 'There is a more recent autosave of your changes than the one you are previewing. <a href="%s">Restore the autosave</a>' ),
   1183 			'videoHeaderNotice'       => __( 'This theme doesn&#8217;t support video headers on this page. Navigate to the front page or another page that supports video headers.' ),
   1184 			// Used for overriding the file types allowed in Plupload.
   1185 			'allowedFiles'            => __( 'Allowed Files' ),
   1186 			'customCssError'          => array(
   1187 				/* translators: %d: Error count. */
   1188 				'singular' => _n( 'There is %d error which must be fixed before you can save.', 'There are %d errors which must be fixed before you can save.', 1 ),
   1189 				/* translators: %d: Error count. */
   1190 				'plural'   => _n( 'There is %d error which must be fixed before you can save.', 'There are %d errors which must be fixed before you can save.', 2 ),
   1191 				// @todo This is lacking, as some languages have a dedicated dual form. For proper handling of plurals in JS, see #20491.
   1192 			),
   1193 			'pageOnFrontError'        => __( 'Homepage and posts page must be different.' ),
   1194 			'saveBlockedError'        => array(
   1195 				/* translators: %s: Number of invalid settings. */
   1196 				'singular' => _n( 'Unable to save due to %s invalid setting.', 'Unable to save due to %s invalid settings.', 1 ),
   1197 				/* translators: %s: Number of invalid settings. */
   1198 				'plural'   => _n( 'Unable to save due to %s invalid setting.', 'Unable to save due to %s invalid settings.', 2 ),
   1199 				// @todo This is lacking, as some languages have a dedicated dual form. For proper handling of plurals in JS, see #20491.
   1200 			),
   1201 			'scheduleDescription'     => __( 'Schedule your customization changes to publish ("go live") at a future date.' ),
   1202 			'themePreviewUnavailable' => __( 'Sorry, you can&#8217;t preview new themes when you have changes scheduled or saved as a draft. Please publish your changes, or wait until they publish to preview new themes.' ),
   1203 			'themeInstallUnavailable' => sprintf(
   1204 				/* translators: %s: URL to Add Themes admin screen. */
   1205 				__( 'You won&#8217;t be able to install new themes from here yet since your install requires SFTP credentials. For now, please <a href="%s">add themes in the admin</a>.' ),
   1206 				esc_url( admin_url( 'theme-install.php' ) )
   1207 			),
   1208 			'publishSettings'         => __( 'Publish Settings' ),
   1209 			'invalidDate'             => __( 'Invalid date.' ),
   1210 			'invalidValue'            => __( 'Invalid value.' ),
   1211 		)
   1212 	);
   1213 	$scripts->add( 'customize-selective-refresh', "/wp-includes/js/customize-selective-refresh$suffix.js", array( 'jquery', 'wp-util', 'customize-preview' ), false, 1 );
   1214 
   1215 	$scripts->add( 'customize-widgets', "/wp-admin/js/customize-widgets$suffix.js", array( 'jquery', 'jquery-ui-sortable', 'jquery-ui-droppable', 'wp-backbone', 'customize-controls' ), false, 1 );
   1216 	$scripts->add( 'customize-preview-widgets', "/wp-includes/js/customize-preview-widgets$suffix.js", array( 'jquery', 'wp-util', 'customize-preview', 'customize-selective-refresh' ), false, 1 );
   1217 
   1218 	$scripts->add( 'customize-nav-menus', "/wp-admin/js/customize-nav-menus$suffix.js", array( 'jquery', 'wp-backbone', 'customize-controls', 'accordion', 'nav-menu', 'wp-sanitize' ), false, 1 );
   1219 	$scripts->add( 'customize-preview-nav-menus', "/wp-includes/js/customize-preview-nav-menus$suffix.js", array( 'jquery', 'wp-util', 'customize-preview', 'customize-selective-refresh' ), false, 1 );
   1220 
   1221 	$scripts->add( 'wp-custom-header', "/wp-includes/js/wp-custom-header$suffix.js", array( 'wp-a11y' ), false, 1 );
   1222 
   1223 	$scripts->add( 'accordion', "/wp-admin/js/accordion$suffix.js", array( 'jquery' ), false, 1 );
   1224 
   1225 	$scripts->add( 'shortcode', "/wp-includes/js/shortcode$suffix.js", array( 'underscore' ), false, 1 );
   1226 	$scripts->add( 'media-models', "/wp-includes/js/media-models$suffix.js", array( 'wp-backbone' ), false, 1 );
   1227 	did_action( 'init' ) && $scripts->localize(
   1228 		'media-models',
   1229 		'_wpMediaModelsL10n',
   1230 		array(
   1231 			'settings' => array(
   1232 				'ajaxurl' => admin_url( 'admin-ajax.php', 'relative' ),
   1233 				'post'    => array( 'id' => 0 ),
   1234 			),
   1235 		)
   1236 	);
   1237 
   1238 	$scripts->add( 'wp-embed', "/wp-includes/js/wp-embed$suffix.js" );
   1239 
   1240 	// To enqueue media-views or media-editor, call wp_enqueue_media().
   1241 	// Both rely on numerous settings, styles, and templates to operate correctly.
   1242 	$scripts->add( 'media-views', "/wp-includes/js/media-views$suffix.js", array( 'utils', 'media-models', 'wp-plupload', 'jquery-ui-sortable', 'wp-mediaelement', 'wp-api-request', 'wp-a11y', 'clipboard' ), false, 1 );
   1243 	$scripts->set_translations( 'media-views' );
   1244 
   1245 	$scripts->add( 'media-editor', "/wp-includes/js/media-editor$suffix.js", array( 'shortcode', 'media-views' ), false, 1 );
   1246 	$scripts->set_translations( 'media-editor' );
   1247 	$scripts->add( 'media-audiovideo', "/wp-includes/js/media-audiovideo$suffix.js", array( 'media-editor' ), false, 1 );
   1248 	$scripts->add( 'mce-view', "/wp-includes/js/mce-view$suffix.js", array( 'shortcode', 'jquery', 'media-views', 'media-audiovideo' ), false, 1 );
   1249 
   1250 	$scripts->add( 'wp-api', "/wp-includes/js/wp-api$suffix.js", array( 'jquery', 'backbone', 'underscore', 'wp-api-request' ), false, 1 );
   1251 
   1252 	if ( is_admin() ) {
   1253 		$scripts->add( 'admin-tags', "/wp-admin/js/tags$suffix.js", array( 'jquery', 'wp-ajax-response' ), false, 1 );
   1254 		$scripts->set_translations( 'admin-tags' );
   1255 
   1256 		$scripts->add( 'admin-comments', "/wp-admin/js/edit-comments$suffix.js", array( 'wp-lists', 'quicktags', 'jquery-query' ), false, 1 );
   1257 		$scripts->set_translations( 'admin-comments' );
   1258 		did_action( 'init' ) && $scripts->localize(
   1259 			'admin-comments',
   1260 			'adminCommentsSettings',
   1261 			array(
   1262 				'hotkeys_highlight_first' => isset( $_GET['hotkeys_highlight_first'] ),
   1263 				'hotkeys_highlight_last'  => isset( $_GET['hotkeys_highlight_last'] ),
   1264 			)
   1265 		);
   1266 
   1267 		$scripts->add( 'xfn', "/wp-admin/js/xfn$suffix.js", array( 'jquery' ), false, 1 );
   1268 
   1269 		$scripts->add( 'postbox', "/wp-admin/js/postbox$suffix.js", array( 'jquery-ui-sortable', 'wp-a11y' ), false, 1 );
   1270 		$scripts->set_translations( 'postbox' );
   1271 
   1272 		$scripts->add( 'tags-box', "/wp-admin/js/tags-box$suffix.js", array( 'jquery', 'tags-suggest' ), false, 1 );
   1273 		$scripts->set_translations( 'tags-box' );
   1274 
   1275 		$scripts->add( 'tags-suggest', "/wp-admin/js/tags-suggest$suffix.js", array( 'jquery-ui-autocomplete', 'wp-a11y' ), false, 1 );
   1276 		$scripts->set_translations( 'tags-suggest' );
   1277 
   1278 		$scripts->add( 'post', "/wp-admin/js/post$suffix.js", array( 'suggest', 'wp-lists', 'postbox', 'tags-box', 'underscore', 'word-count', 'wp-a11y', 'wp-sanitize', 'clipboard' ), false, 1 );
   1279 		$scripts->set_translations( 'post' );
   1280 
   1281 		$scripts->add( 'editor-expand', "/wp-admin/js/editor-expand$suffix.js", array( 'jquery', 'underscore' ), false, 1 );
   1282 
   1283 		$scripts->add( 'link', "/wp-admin/js/link$suffix.js", array( 'wp-lists', 'postbox' ), false, 1 );
   1284 
   1285 		$scripts->add( 'comment', "/wp-admin/js/comment$suffix.js", array( 'jquery', 'postbox' ), false, 1 );
   1286 		$scripts->set_translations( 'comment' );
   1287 
   1288 		$scripts->add( 'admin-gallery', "/wp-admin/js/gallery$suffix.js", array( 'jquery-ui-sortable' ) );
   1289 
   1290 		$scripts->add( 'admin-widgets', "/wp-admin/js/widgets$suffix.js", array( 'jquery-ui-sortable', 'jquery-ui-draggable', 'jquery-ui-droppable', 'wp-a11y' ), false, 1 );
   1291 		$scripts->set_translations( 'admin-widgets' );
   1292 
   1293 		$scripts->add( 'media-widgets', "/wp-admin/js/widgets/media-widgets$suffix.js", array( 'jquery', 'media-models', 'media-views', 'wp-api-request' ) );
   1294 		$scripts->add_inline_script( 'media-widgets', 'wp.mediaWidgets.init();', 'after' );
   1295 
   1296 		$scripts->add( 'media-audio-widget', "/wp-admin/js/widgets/media-audio-widget$suffix.js", array( 'media-widgets', 'media-audiovideo' ) );
   1297 		$scripts->add( 'media-image-widget', "/wp-admin/js/widgets/media-image-widget$suffix.js", array( 'media-widgets' ) );
   1298 		$scripts->add( 'media-gallery-widget', "/wp-admin/js/widgets/media-gallery-widget$suffix.js", array( 'media-widgets' ) );
   1299 		$scripts->add( 'media-video-widget', "/wp-admin/js/widgets/media-video-widget$suffix.js", array( 'media-widgets', 'media-audiovideo', 'wp-api-request' ) );
   1300 		$scripts->add( 'text-widgets', "/wp-admin/js/widgets/text-widgets$suffix.js", array( 'jquery', 'backbone', 'editor', 'wp-util', 'wp-a11y' ) );
   1301 		$scripts->add( 'custom-html-widgets', "/wp-admin/js/widgets/custom-html-widgets$suffix.js", array( 'jquery', 'backbone', 'wp-util', 'jquery-ui-core', 'wp-a11y' ) );
   1302 
   1303 		$scripts->add( 'theme', "/wp-admin/js/theme$suffix.js", array( 'wp-backbone', 'wp-a11y', 'customize-base' ), false, 1 );
   1304 
   1305 		$scripts->add( 'inline-edit-post', "/wp-admin/js/inline-edit-post$suffix.js", array( 'jquery', 'tags-suggest', 'wp-a11y' ), false, 1 );
   1306 		$scripts->set_translations( 'inline-edit-post' );
   1307 
   1308 		$scripts->add( 'inline-edit-tax', "/wp-admin/js/inline-edit-tax$suffix.js", array( 'jquery', 'wp-a11y' ), false, 1 );
   1309 		$scripts->set_translations( 'inline-edit-tax' );
   1310 
   1311 		$scripts->add( 'plugin-install', "/wp-admin/js/plugin-install$suffix.js", array( 'jquery', 'jquery-ui-core', 'thickbox' ), false, 1 );
   1312 		$scripts->set_translations( 'plugin-install' );
   1313 
   1314 		$scripts->add( 'site-health', "/wp-admin/js/site-health$suffix.js", array( 'clipboard', 'jquery', 'wp-util', 'wp-a11y', 'wp-api-request', 'wp-url', 'wp-i18n', 'wp-hooks' ), false, 1 );
   1315 		$scripts->set_translations( 'site-health' );
   1316 
   1317 		$scripts->add( 'privacy-tools', "/wp-admin/js/privacy-tools$suffix.js", array( 'jquery', 'wp-a11y' ), false, 1 );
   1318 		$scripts->set_translations( 'privacy-tools' );
   1319 
   1320 		$scripts->add( 'updates', "/wp-admin/js/updates$suffix.js", array( 'common', 'jquery', 'wp-util', 'wp-a11y', 'wp-sanitize' ), false, 1 );
   1321 		$scripts->set_translations( 'updates' );
   1322 		did_action( 'init' ) && $scripts->localize(
   1323 			'updates',
   1324 			'_wpUpdatesSettings',
   1325 			array(
   1326 				'ajax_nonce' => wp_create_nonce( 'updates' ),
   1327 			)
   1328 		);
   1329 
   1330 		$scripts->add( 'farbtastic', '/wp-admin/js/farbtastic.js', array( 'jquery' ), '1.2' );
   1331 
   1332 		$scripts->add( 'iris', '/wp-admin/js/iris.min.js', array( 'jquery-ui-draggable', 'jquery-ui-slider', 'jquery-touch-punch' ), '1.0.7', 1 );
   1333 		$scripts->add( 'wp-color-picker', "/wp-admin/js/color-picker$suffix.js", array( 'iris' ), false, 1 );
   1334 		$scripts->set_translations( 'wp-color-picker' );
   1335 
   1336 		$scripts->add( 'dashboard', "/wp-admin/js/dashboard$suffix.js", array( 'jquery', 'admin-comments', 'postbox', 'wp-util', 'wp-a11y', 'wp-date' ), false, 1 );
   1337 		$scripts->set_translations( 'dashboard' );
   1338 
   1339 		$scripts->add( 'list-revisions', "/wp-includes/js/wp-list-revisions$suffix.js" );
   1340 
   1341 		$scripts->add( 'media-grid', "/wp-includes/js/media-grid$suffix.js", array( 'media-editor' ), false, 1 );
   1342 		$scripts->add( 'media', "/wp-admin/js/media$suffix.js", array( 'jquery' ), false, 1 );
   1343 		$scripts->set_translations( 'media' );
   1344 
   1345 		$scripts->add( 'image-edit', "/wp-admin/js/image-edit$suffix.js", array( 'jquery', 'jquery-ui-core', 'json2', 'imgareaselect', 'wp-a11y' ), false, 1 );
   1346 		$scripts->set_translations( 'image-edit' );
   1347 
   1348 		$scripts->add( 'set-post-thumbnail', "/wp-admin/js/set-post-thumbnail$suffix.js", array( 'jquery' ), false, 1 );
   1349 		$scripts->set_translations( 'set-post-thumbnail' );
   1350 
   1351 		/*
   1352 		 * Navigation Menus: Adding underscore as a dependency to utilize _.debounce
   1353 		 * see https://core.trac.wordpress.org/ticket/42321
   1354 		 */
   1355 		$scripts->add( 'nav-menu', "/wp-admin/js/nav-menu$suffix.js", array( 'jquery-ui-sortable', 'jquery-ui-draggable', 'jquery-ui-droppable', 'wp-lists', 'postbox', 'json2', 'underscore' ) );
   1356 		$scripts->set_translations( 'nav-menu' );
   1357 
   1358 		$scripts->add( 'custom-header', '/wp-admin/js/custom-header.js', array( 'jquery-masonry' ), false, 1 );
   1359 		$scripts->add( 'custom-background', "/wp-admin/js/custom-background$suffix.js", array( 'wp-color-picker', 'media-views' ), false, 1 );
   1360 		$scripts->add( 'media-gallery', "/wp-admin/js/media-gallery$suffix.js", array( 'jquery' ), false, 1 );
   1361 
   1362 		$scripts->add( 'svg-painter', '/wp-admin/js/svg-painter.js', array( 'jquery' ), false, 1 );
   1363 	}
   1364 }
   1365 
   1366 /**
   1367  * Assign default styles to $styles object.
   1368  *
   1369  * Nothing is returned, because the $styles parameter is passed by reference.
   1370  * Meaning that whatever object is passed will be updated without having to
   1371  * reassign the variable that was passed back to the same value. This saves
   1372  * memory.
   1373  *
   1374  * Adding default styles is not the only task, it also assigns the base_url
   1375  * property, the default version, and text direction for the object.
   1376  *
   1377  * @since 2.6.0
   1378  *
   1379  * @param WP_Styles $styles
   1380  */
   1381 function wp_default_styles( $styles ) {
   1382 	// Include an unmodified $wp_version.
   1383 	require ABSPATH . WPINC . '/version.php';
   1384 
   1385 	if ( ! defined( 'SCRIPT_DEBUG' ) ) {
   1386 		define( 'SCRIPT_DEBUG', false !== strpos( $wp_version, '-src' ) );
   1387 	}
   1388 
   1389 	$guessurl = site_url();
   1390 
   1391 	if ( ! $guessurl ) {
   1392 		$guessurl = wp_guess_url();
   1393 	}
   1394 
   1395 	$styles->base_url        = $guessurl;
   1396 	$styles->content_url     = defined( 'WP_CONTENT_URL' ) ? WP_CONTENT_URL : '';
   1397 	$styles->default_version = get_bloginfo( 'version' );
   1398 	$styles->text_direction  = function_exists( 'is_rtl' ) && is_rtl() ? 'rtl' : 'ltr';
   1399 	$styles->default_dirs    = array( '/wp-admin/', '/wp-includes/css/' );
   1400 
   1401 	// Open Sans is no longer used by core, but may be relied upon by themes and plugins.
   1402 	$open_sans_font_url = '';
   1403 
   1404 	/*
   1405 	 * translators: If there are characters in your language that are not supported
   1406 	 * by Open Sans, translate this to 'off'. Do not translate into your own language.
   1407 	 */
   1408 	if ( 'off' !== _x( 'on', 'Open Sans font: on or off' ) ) {
   1409 		$subsets = 'latin,latin-ext';
   1410 
   1411 		/*
   1412 		 * translators: To add an additional Open Sans character subset specific to your language,
   1413 		 * translate this to 'greek', 'cyrillic' or 'vietnamese'. Do not translate into your own language.
   1414 		 */
   1415 		$subset = _x( 'no-subset', 'Open Sans font: add new subset (greek, cyrillic, vietnamese)' );
   1416 
   1417 		if ( 'cyrillic' === $subset ) {
   1418 			$subsets .= ',cyrillic,cyrillic-ext';
   1419 		} elseif ( 'greek' === $subset ) {
   1420 			$subsets .= ',greek,greek-ext';
   1421 		} elseif ( 'vietnamese' === $subset ) {
   1422 			$subsets .= ',vietnamese';
   1423 		}
   1424 
   1425 		// Hotlink Open Sans, for now.
   1426 		$open_sans_font_url = "https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,300,400,600&subset=$subsets&display=fallback";
   1427 	}
   1428 
   1429 	// Register a stylesheet for the selected admin color scheme.
   1430 	$styles->add( 'colors', true, array( 'wp-admin', 'buttons' ) );
   1431 
   1432 	$suffix = SCRIPT_DEBUG ? '' : '.min';
   1433 
   1434 	// Admin CSS.
   1435 	$styles->add( 'common', "/wp-admin/css/common$suffix.css" );
   1436 	$styles->add( 'forms', "/wp-admin/css/forms$suffix.css" );
   1437 	$styles->add( 'admin-menu', "/wp-admin/css/admin-menu$suffix.css" );
   1438 	$styles->add( 'dashboard', "/wp-admin/css/dashboard$suffix.css" );
   1439 	$styles->add( 'list-tables', "/wp-admin/css/list-tables$suffix.css" );
   1440 	$styles->add( 'edit', "/wp-admin/css/edit$suffix.css" );
   1441 	$styles->add( 'revisions', "/wp-admin/css/revisions$suffix.css" );
   1442 	$styles->add( 'media', "/wp-admin/css/media$suffix.css" );
   1443 	$styles->add( 'themes', "/wp-admin/css/themes$suffix.css" );
   1444 	$styles->add( 'about', "/wp-admin/css/about$suffix.css" );
   1445 	$styles->add( 'nav-menus', "/wp-admin/css/nav-menus$suffix.css" );
   1446 	$styles->add( 'widgets', "/wp-admin/css/widgets$suffix.css", array( 'wp-pointer' ) );
   1447 	$styles->add( 'site-icon', "/wp-admin/css/site-icon$suffix.css" );
   1448 	$styles->add( 'l10n', "/wp-admin/css/l10n$suffix.css" );
   1449 	$styles->add( 'code-editor', "/wp-admin/css/code-editor$suffix.css", array( 'wp-codemirror' ) );
   1450 	$styles->add( 'site-health', "/wp-admin/css/site-health$suffix.css" );
   1451 
   1452 	$styles->add( 'wp-admin', false, array( 'dashicons', 'common', 'forms', 'admin-menu', 'dashboard', 'list-tables', 'edit', 'revisions', 'media', 'themes', 'about', 'nav-menus', 'widgets', 'site-icon', 'l10n' ) );
   1453 
   1454 	$styles->add( 'login', "/wp-admin/css/login$suffix.css", array( 'dashicons', 'buttons', 'forms', 'l10n' ) );
   1455 	$styles->add( 'install', "/wp-admin/css/install$suffix.css", array( 'dashicons', 'buttons', 'forms', 'l10n' ) );
   1456 	$styles->add( 'wp-color-picker', "/wp-admin/css/color-picker$suffix.css" );
   1457 	$styles->add( 'customize-controls', "/wp-admin/css/customize-controls$suffix.css", array( 'wp-admin', 'colors', 'imgareaselect' ) );
   1458 	$styles->add( 'customize-widgets', "/wp-admin/css/customize-widgets$suffix.css", array( 'wp-admin', 'colors' ) );
   1459 	$styles->add( 'customize-nav-menus', "/wp-admin/css/customize-nav-menus$suffix.css", array( 'wp-admin', 'colors' ) );
   1460 
   1461 	// Common dependencies.
   1462 	$styles->add( 'buttons', "/wp-includes/css/buttons$suffix.css" );
   1463 	$styles->add( 'dashicons', "/wp-includes/css/dashicons$suffix.css" );
   1464 
   1465 	// Includes CSS.
   1466 	$styles->add( 'admin-bar', "/wp-includes/css/admin-bar$suffix.css", array( 'dashicons' ) );
   1467 	$styles->add( 'wp-auth-check', "/wp-includes/css/wp-auth-check$suffix.css", array( 'dashicons' ) );
   1468 	$styles->add( 'editor-buttons', "/wp-includes/css/editor$suffix.css", array( 'dashicons' ) );
   1469 	$styles->add( 'media-views', "/wp-includes/css/media-views$suffix.css", array( 'buttons', 'dashicons', 'wp-mediaelement' ) );
   1470 	$styles->add( 'wp-pointer', "/wp-includes/css/wp-pointer$suffix.css", array( 'dashicons' ) );
   1471 	$styles->add( 'customize-preview', "/wp-includes/css/customize-preview$suffix.css", array( 'dashicons' ) );
   1472 	$styles->add( 'wp-embed-template-ie', "/wp-includes/css/wp-embed-template-ie$suffix.css" );
   1473 	$styles->add_data( 'wp-embed-template-ie', 'conditional', 'lte IE 8' );
   1474 
   1475 	// External libraries and friends.
   1476 	$styles->add( 'imgareaselect', '/wp-includes/js/imgareaselect/imgareaselect.css', array(), '0.9.8' );
   1477 	$styles->add( 'wp-jquery-ui-dialog', "/wp-includes/css/jquery-ui-dialog$suffix.css", array( 'dashicons' ) );
   1478 	$styles->add( 'mediaelement', '/wp-includes/js/mediaelement/mediaelementplayer-legacy.min.css', array(), '4.2.16' );
   1479 	$styles->add( 'wp-mediaelement', "/wp-includes/js/mediaelement/wp-mediaelement$suffix.css", array( 'mediaelement' ) );
   1480 	$styles->add( 'thickbox', '/wp-includes/js/thickbox/thickbox.css', array( 'dashicons' ) );
   1481 	$styles->add( 'wp-codemirror', '/wp-includes/js/codemirror/codemirror.min.css', array(), '5.29.1-alpha-ee20357' );
   1482 
   1483 	// Deprecated CSS.
   1484 	$styles->add( 'deprecated-media', "/wp-admin/css/deprecated-media$suffix.css" );
   1485 	$styles->add( 'farbtastic', "/wp-admin/css/farbtastic$suffix.css", array(), '1.3u1' );
   1486 	$styles->add( 'jcrop', '/wp-includes/js/jcrop/jquery.Jcrop.min.css', array(), '0.9.12' );
   1487 	$styles->add( 'colors-fresh', false, array( 'wp-admin', 'buttons' ) ); // Old handle.
   1488 	$styles->add( 'open-sans', $open_sans_font_url ); // No longer used in core as of 4.6.
   1489 
   1490 	// Noto Serif is no longer used by core, but may be relied upon by themes and plugins.
   1491 	$fonts_url = '';
   1492 
   1493 	/*
   1494 	 * translators: Use this to specify the proper Google Font name and variants
   1495 	 * to load that is supported by your language. Do not translate.
   1496 	 * Set to 'off' to disable loading.
   1497 	 */
   1498 	$font_family = _x( 'Noto Serif:400,400i,700,700i', 'Google Font Name and Variants' );
   1499 	if ( 'off' !== $font_family ) {
   1500 		$fonts_url = 'https://fonts.googleapis.com/css?family=' . urlencode( $font_family );
   1501 	}
   1502 	$styles->add( 'wp-editor-font', $fonts_url ); // No longer used in core as of 5.7.
   1503 	$block_library_theme_path = WPINC . "/css/dist/block-library/theme$suffix.css";
   1504 	$styles->add( 'wp-block-library-theme', "/$block_library_theme_path" );
   1505 	$styles->add_data( 'wp-block-library-theme', 'path', ABSPATH . $block_library_theme_path );
   1506 
   1507 	$styles->add(
   1508 		'wp-reset-editor-styles',
   1509 		"/wp-includes/css/dist/block-library/reset$suffix.css",
   1510 		array( 'common', 'forms' ) // Make sure the reset is loaded after the default WP Admin styles.
   1511 	);
   1512 
   1513 	$styles->add(
   1514 		'wp-editor-classic-layout-styles',
   1515 		"/wp-includes/css/dist/edit-post/classic$suffix.css",
   1516 		array()
   1517 	);
   1518 
   1519 	$wp_edit_blocks_dependencies = array(
   1520 		'wp-components',
   1521 		'wp-editor',
   1522 		// This need to be added before the block library styles,
   1523 		// The block library styles override the "reset" styles.
   1524 		'wp-reset-editor-styles',
   1525 		'wp-block-library',
   1526 		'wp-reusable-blocks',
   1527 	);
   1528 
   1529 	// Only load the default layout and margin styles for themes without theme.json file.
   1530 	if ( ! WP_Theme_JSON_Resolver::theme_has_support() ) {
   1531 		$wp_edit_blocks_dependencies[] = 'wp-editor-classic-layout-styles';
   1532 	}
   1533 
   1534 	global $editor_styles;
   1535 	if ( ! is_array( $editor_styles ) || count( $editor_styles ) === 0 ) {
   1536 		// Include opinionated block styles if no $editor_styles are declared, so the editor never appears broken.
   1537 		$wp_edit_blocks_dependencies[] = 'wp-block-library-theme';
   1538 	}
   1539 
   1540 	$styles->add(
   1541 		'wp-edit-blocks',
   1542 		"/wp-includes/css/dist/block-library/editor$suffix.css",
   1543 		$wp_edit_blocks_dependencies
   1544 	);
   1545 
   1546 	$package_styles = array(
   1547 		'block-editor'         => array( 'wp-components' ),
   1548 		'block-library'        => array(),
   1549 		'block-directory'      => array(),
   1550 		'components'           => array(),
   1551 		'edit-post'            => array(
   1552 			'wp-components',
   1553 			'wp-block-editor',
   1554 			'wp-editor',
   1555 			'wp-edit-blocks',
   1556 			'wp-block-library',
   1557 			'wp-nux',
   1558 		),
   1559 		'editor'               => array(
   1560 			'wp-components',
   1561 			'wp-block-editor',
   1562 			'wp-nux',
   1563 			'wp-reusable-blocks',
   1564 		),
   1565 		'format-library'       => array(),
   1566 		'list-reusable-blocks' => array( 'wp-components' ),
   1567 		'reusable-blocks'      => array( 'wp-components' ),
   1568 		'nux'                  => array( 'wp-components' ),
   1569 		'widgets'              => array(
   1570 			'wp-components',
   1571 		),
   1572 		'edit-widgets'         => array(
   1573 			'wp-widgets',
   1574 			'wp-block-editor',
   1575 			'wp-edit-blocks',
   1576 			'wp-block-library',
   1577 			'wp-reusable-blocks',
   1578 		),
   1579 		'customize-widgets'    => array(
   1580 			'wp-widgets',
   1581 			'wp-block-editor',
   1582 			'wp-edit-blocks',
   1583 			'wp-block-library',
   1584 			'wp-reusable-blocks',
   1585 		),
   1586 	);
   1587 
   1588 	foreach ( $package_styles as $package => $dependencies ) {
   1589 		$handle = 'wp-' . $package;
   1590 		$path   = "/wp-includes/css/dist/$package/style$suffix.css";
   1591 
   1592 		if ( 'block-library' === $package && wp_should_load_separate_core_block_assets() ) {
   1593 			$path = "/wp-includes/css/dist/$package/common$suffix.css";
   1594 		}
   1595 		$styles->add( $handle, $path, $dependencies );
   1596 		$styles->add_data( $handle, 'path', ABSPATH . $path );
   1597 	}
   1598 
   1599 	// RTL CSS.
   1600 	$rtl_styles = array(
   1601 		// Admin CSS.
   1602 		'common',
   1603 		'forms',
   1604 		'admin-menu',
   1605 		'dashboard',
   1606 		'list-tables',
   1607 		'edit',
   1608 		'revisions',
   1609 		'media',
   1610 		'themes',
   1611 		'about',
   1612 		'nav-menus',
   1613 		'widgets',
   1614 		'site-icon',
   1615 		'l10n',
   1616 		'install',
   1617 		'wp-color-picker',
   1618 		'customize-controls',
   1619 		'customize-widgets',
   1620 		'customize-nav-menus',
   1621 		'customize-preview',
   1622 		'login',
   1623 		'site-health',
   1624 		// Includes CSS.
   1625 		'buttons',
   1626 		'admin-bar',
   1627 		'wp-auth-check',
   1628 		'editor-buttons',
   1629 		'media-views',
   1630 		'wp-pointer',
   1631 		'wp-jquery-ui-dialog',
   1632 		// Package styles.
   1633 		'wp-reset-editor-styles',
   1634 		'wp-editor-classic-layout-styles',
   1635 		'wp-block-library-theme',
   1636 		'wp-edit-blocks',
   1637 		'wp-block-editor',
   1638 		'wp-block-library',
   1639 		'wp-block-directory',
   1640 		'wp-components',
   1641 		'wp-customize-widgets',
   1642 		'wp-edit-post',
   1643 		'wp-edit-widgets',
   1644 		'wp-editor',
   1645 		'wp-format-library',
   1646 		'wp-list-reusable-blocks',
   1647 		'wp-reusable-blocks',
   1648 		'wp-nux',
   1649 		'wp-widgets',
   1650 		// Deprecated CSS.
   1651 		'deprecated-media',
   1652 		'farbtastic',
   1653 	);
   1654 
   1655 	foreach ( $rtl_styles as $rtl_style ) {
   1656 		$styles->add_data( $rtl_style, 'rtl', 'replace' );
   1657 		if ( $suffix ) {
   1658 			$styles->add_data( $rtl_style, 'suffix', $suffix );
   1659 		}
   1660 	}
   1661 }
   1662 
   1663 /**
   1664  * Reorder JavaScript scripts array to place prototype before jQuery.
   1665  *
   1666  * @since 2.3.1
   1667  *
   1668  * @param array $js_array JavaScript scripts array
   1669  * @return array Reordered array, if needed.
   1670  */
   1671 function wp_prototype_before_jquery( $js_array ) {
   1672 	$prototype = array_search( 'prototype', $js_array, true );
   1673 
   1674 	if ( false === $prototype ) {
   1675 		return $js_array;
   1676 	}
   1677 
   1678 	$jquery = array_search( 'jquery', $js_array, true );
   1679 
   1680 	if ( false === $jquery ) {
   1681 		return $js_array;
   1682 	}
   1683 
   1684 	if ( $prototype < $jquery ) {
   1685 		return $js_array;
   1686 	}
   1687 
   1688 	unset( $js_array[ $prototype ] );
   1689 
   1690 	array_splice( $js_array, $jquery, 0, 'prototype' );
   1691 
   1692 	return $js_array;
   1693 }
   1694 
   1695 /**
   1696  * Load localized data on print rather than initialization.
   1697  *
   1698  * These localizations require information that may not be loaded even by init.
   1699  *
   1700  * @since 2.5.0
   1701  */
   1702 function wp_just_in_time_script_localization() {
   1703 
   1704 	wp_localize_script(
   1705 		'autosave',
   1706 		'autosaveL10n',
   1707 		array(
   1708 			'autosaveInterval' => AUTOSAVE_INTERVAL,
   1709 			'blog_id'          => get_current_blog_id(),
   1710 		)
   1711 	);
   1712 
   1713 	wp_localize_script(
   1714 		'mce-view',
   1715 		'mceViewL10n',
   1716 		array(
   1717 			'shortcodes' => ! empty( $GLOBALS['shortcode_tags'] ) ? array_keys( $GLOBALS['shortcode_tags'] ) : array(),
   1718 		)
   1719 	);
   1720 
   1721 	wp_localize_script(
   1722 		'word-count',
   1723 		'wordCountL10n',
   1724 		array(
   1725 			/*
   1726 			 * translators: If your word count is based on single characters (e.g. East Asian characters),
   1727 			 * enter 'characters_excluding_spaces' or 'characters_including_spaces'. Otherwise, enter 'words'.
   1728 			 * Do not translate into your own language.
   1729 			 */
   1730 			'type'       => _x( 'words', 'Word count type. Do not translate!' ),
   1731 			'shortcodes' => ! empty( $GLOBALS['shortcode_tags'] ) ? array_keys( $GLOBALS['shortcode_tags'] ) : array(),
   1732 		)
   1733 	);
   1734 }
   1735 
   1736 /**
   1737  * Localizes the jQuery UI datepicker.
   1738  *
   1739  * @since 4.6.0
   1740  *
   1741  * @link https://api.jqueryui.com/datepicker/#options
   1742  *
   1743  * @global WP_Locale $wp_locale WordPress date and time locale object.
   1744  */
   1745 function wp_localize_jquery_ui_datepicker() {
   1746 	global $wp_locale;
   1747 
   1748 	if ( ! wp_script_is( 'jquery-ui-datepicker', 'enqueued' ) ) {
   1749 		return;
   1750 	}
   1751 
   1752 	// Convert the PHP date format into jQuery UI's format.
   1753 	$datepicker_date_format = str_replace(
   1754 		array(
   1755 			'd',
   1756 			'j',
   1757 			'l',
   1758 			'z', // Day.
   1759 			'F',
   1760 			'M',
   1761 			'n',
   1762 			'm', // Month.
   1763 			'Y',
   1764 			'y', // Year.
   1765 		),
   1766 		array(
   1767 			'dd',
   1768 			'd',
   1769 			'DD',
   1770 			'o',
   1771 			'MM',
   1772 			'M',
   1773 			'm',
   1774 			'mm',
   1775 			'yy',
   1776 			'y',
   1777 		),
   1778 		get_option( 'date_format' )
   1779 	);
   1780 
   1781 	$datepicker_defaults = wp_json_encode(
   1782 		array(
   1783 			'closeText'       => __( 'Close' ),
   1784 			'currentText'     => __( 'Today' ),
   1785 			'monthNames'      => array_values( $wp_locale->month ),
   1786 			'monthNamesShort' => array_values( $wp_locale->month_abbrev ),
   1787 			'nextText'        => __( 'Next' ),
   1788 			'prevText'        => __( 'Previous' ),
   1789 			'dayNames'        => array_values( $wp_locale->weekday ),
   1790 			'dayNamesShort'   => array_values( $wp_locale->weekday_abbrev ),
   1791 			'dayNamesMin'     => array_values( $wp_locale->weekday_initial ),
   1792 			'dateFormat'      => $datepicker_date_format,
   1793 			'firstDay'        => absint( get_option( 'start_of_week' ) ),
   1794 			'isRTL'           => $wp_locale->is_rtl(),
   1795 		)
   1796 	);
   1797 
   1798 	wp_add_inline_script( 'jquery-ui-datepicker', "jQuery(document).ready(function(jQuery){jQuery.datepicker.setDefaults({$datepicker_defaults});});" );
   1799 }
   1800 
   1801 /**
   1802  * Localizes community events data that needs to be passed to dashboard.js.
   1803  *
   1804  * @since 4.8.0
   1805  */
   1806 function wp_localize_community_events() {
   1807 	if ( ! wp_script_is( 'dashboard' ) ) {
   1808 		return;
   1809 	}
   1810 
   1811 	require_once ABSPATH . 'wp-admin/includes/class-wp-community-events.php';
   1812 
   1813 	$user_id            = get_current_user_id();
   1814 	$saved_location     = get_user_option( 'community-events-location', $user_id );
   1815 	$saved_ip_address   = isset( $saved_location['ip'] ) ? $saved_location['ip'] : false;
   1816 	$current_ip_address = WP_Community_Events::get_unsafe_client_ip();
   1817 
   1818 	/*
   1819 	 * If the user's location is based on their IP address, then update their
   1820 	 * location when their IP address changes. This allows them to see events
   1821 	 * in their current city when travelling. Otherwise, they would always be
   1822 	 * shown events in the city where they were when they first loaded the
   1823 	 * Dashboard, which could have been months or years ago.
   1824 	 */
   1825 	if ( $saved_ip_address && $current_ip_address && $current_ip_address !== $saved_ip_address ) {
   1826 		$saved_location['ip'] = $current_ip_address;
   1827 		update_user_meta( $user_id, 'community-events-location', $saved_location );
   1828 	}
   1829 
   1830 	$events_client = new WP_Community_Events( $user_id, $saved_location );
   1831 
   1832 	wp_localize_script(
   1833 		'dashboard',
   1834 		'communityEventsData',
   1835 		array(
   1836 			'nonce'       => wp_create_nonce( 'community_events' ),
   1837 			'cache'       => $events_client->get_cached_events(),
   1838 			'time_format' => get_option( 'time_format' ),
   1839 		)
   1840 	);
   1841 }
   1842 
   1843 /**
   1844  * Administration Screen CSS for changing the styles.
   1845  *
   1846  * If installing the 'wp-admin/' directory will be replaced with './'.
   1847  *
   1848  * The $_wp_admin_css_colors global manages the Administration Screens CSS
   1849  * stylesheet that is loaded. The option that is set is 'admin_color' and is the
   1850  * color and key for the array. The value for the color key is an object with
   1851  * a 'url' parameter that has the URL path to the CSS file.
   1852  *
   1853  * The query from $src parameter will be appended to the URL that is given from
   1854  * the $_wp_admin_css_colors array value URL.
   1855  *
   1856  * @since 2.6.0
   1857  *
   1858  * @global array $_wp_admin_css_colors
   1859  *
   1860  * @param string $src    Source URL.
   1861  * @param string $handle Either 'colors' or 'colors-rtl'.
   1862  * @return string|false URL path to CSS stylesheet for Administration Screens.
   1863  */
   1864 function wp_style_loader_src( $src, $handle ) {
   1865 	global $_wp_admin_css_colors;
   1866 
   1867 	if ( wp_installing() ) {
   1868 		return preg_replace( '#^wp-admin/#', './', $src );
   1869 	}
   1870 
   1871 	if ( 'colors' === $handle ) {
   1872 		$color = get_user_option( 'admin_color' );
   1873 
   1874 		if ( empty( $color ) || ! isset( $_wp_admin_css_colors[ $color ] ) ) {
   1875 			$color = 'fresh';
   1876 		}
   1877 
   1878 		$color = $_wp_admin_css_colors[ $color ];
   1879 		$url   = $color->url;
   1880 
   1881 		if ( ! $url ) {
   1882 			return false;
   1883 		}
   1884 
   1885 		$parsed = parse_url( $src );
   1886 		if ( isset( $parsed['query'] ) && $parsed['query'] ) {
   1887 			wp_parse_str( $parsed['query'], $qv );
   1888 			$url = add_query_arg( $qv, $url );
   1889 		}
   1890 
   1891 		return $url;
   1892 	}
   1893 
   1894 	return $src;
   1895 }
   1896 
   1897 /**
   1898  * Prints the script queue in the HTML head on admin pages.
   1899  *
   1900  * Postpones the scripts that were queued for the footer.
   1901  * print_footer_scripts() is called in the footer to print these scripts.
   1902  *
   1903  * @since 2.8.0
   1904  *
   1905  * @see wp_print_scripts()
   1906  *
   1907  * @global bool $concatenate_scripts
   1908  *
   1909  * @return array
   1910  */
   1911 function print_head_scripts() {
   1912 	global $concatenate_scripts;
   1913 
   1914 	if ( ! did_action( 'wp_print_scripts' ) ) {
   1915 		/** This action is documented in wp-includes/functions.wp-scripts.php */
   1916 		do_action( 'wp_print_scripts' );
   1917 	}
   1918 
   1919 	$wp_scripts = wp_scripts();
   1920 
   1921 	script_concat_settings();
   1922 	$wp_scripts->do_concat = $concatenate_scripts;
   1923 	$wp_scripts->do_head_items();
   1924 
   1925 	/**
   1926 	 * Filters whether to print the head scripts.
   1927 	 *
   1928 	 * @since 2.8.0
   1929 	 *
   1930 	 * @param bool $print Whether to print the head scripts. Default true.
   1931 	 */
   1932 	if ( apply_filters( 'print_head_scripts', true ) ) {
   1933 		_print_scripts();
   1934 	}
   1935 
   1936 	$wp_scripts->reset();
   1937 	return $wp_scripts->done;
   1938 }
   1939 
   1940 /**
   1941  * Prints the scripts that were queued for the footer or too late for the HTML head.
   1942  *
   1943  * @since 2.8.0
   1944  *
   1945  * @global WP_Scripts $wp_scripts
   1946  * @global bool       $concatenate_scripts
   1947  *
   1948  * @return array
   1949  */
   1950 function print_footer_scripts() {
   1951 	global $wp_scripts, $concatenate_scripts;
   1952 
   1953 	if ( ! ( $wp_scripts instanceof WP_Scripts ) ) {
   1954 		return array(); // No need to run if not instantiated.
   1955 	}
   1956 	script_concat_settings();
   1957 	$wp_scripts->do_concat = $concatenate_scripts;
   1958 	$wp_scripts->do_footer_items();
   1959 
   1960 	/**
   1961 	 * Filters whether to print the footer scripts.
   1962 	 *
   1963 	 * @since 2.8.0
   1964 	 *
   1965 	 * @param bool $print Whether to print the footer scripts. Default true.
   1966 	 */
   1967 	if ( apply_filters( 'print_footer_scripts', true ) ) {
   1968 		_print_scripts();
   1969 	}
   1970 
   1971 	$wp_scripts->reset();
   1972 	return $wp_scripts->done;
   1973 }
   1974 
   1975 /**
   1976  * Print scripts (internal use only)
   1977  *
   1978  * @ignore
   1979  *
   1980  * @global WP_Scripts $wp_scripts
   1981  * @global bool       $compress_scripts
   1982  */
   1983 function _print_scripts() {
   1984 	global $wp_scripts, $compress_scripts;
   1985 
   1986 	$zip = $compress_scripts ? 1 : 0;
   1987 	if ( $zip && defined( 'ENFORCE_GZIP' ) && ENFORCE_GZIP ) {
   1988 		$zip = 'gzip';
   1989 	}
   1990 
   1991 	$concat    = trim( $wp_scripts->concat, ', ' );
   1992 	$type_attr = current_theme_supports( 'html5', 'script' ) ? '' : " type='text/javascript'";
   1993 
   1994 	if ( $concat ) {
   1995 		if ( ! empty( $wp_scripts->print_code ) ) {
   1996 			echo "\n<script{$type_attr}>\n";
   1997 			echo "/* <![CDATA[ */\n"; // Not needed in HTML 5.
   1998 			echo $wp_scripts->print_code;
   1999 			echo "/* ]]> */\n";
   2000 			echo "</script>\n";
   2001 		}
   2002 
   2003 		$concat       = str_split( $concat, 128 );
   2004 		$concatenated = '';
   2005 
   2006 		foreach ( $concat as $key => $chunk ) {
   2007 			$concatenated .= "&load%5Bchunk_{$key}%5D={$chunk}";
   2008 		}
   2009 
   2010 		$src = $wp_scripts->base_url . "/wp-admin/load-scripts.php?c={$zip}" . $concatenated . '&ver=' . $wp_scripts->default_version;
   2011 		echo "<script{$type_attr} src='" . esc_attr( $src ) . "'></script>\n";
   2012 	}
   2013 
   2014 	if ( ! empty( $wp_scripts->print_html ) ) {
   2015 		echo $wp_scripts->print_html;
   2016 	}
   2017 }
   2018 
   2019 /**
   2020  * Prints the script queue in the HTML head on the front end.
   2021  *
   2022  * Postpones the scripts that were queued for the footer.
   2023  * wp_print_footer_scripts() is called in the footer to print these scripts.
   2024  *
   2025  * @since 2.8.0
   2026  *
   2027  * @global WP_Scripts $wp_scripts
   2028  *
   2029  * @return array
   2030  */
   2031 function wp_print_head_scripts() {
   2032 	if ( ! did_action( 'wp_print_scripts' ) ) {
   2033 		/** This action is documented in wp-includes/functions.wp-scripts.php */
   2034 		do_action( 'wp_print_scripts' );
   2035 	}
   2036 
   2037 	global $wp_scripts;
   2038 
   2039 	if ( ! ( $wp_scripts instanceof WP_Scripts ) ) {
   2040 		return array(); // No need to run if nothing is queued.
   2041 	}
   2042 	return print_head_scripts();
   2043 }
   2044 
   2045 /**
   2046  * Private, for use in *_footer_scripts hooks
   2047  *
   2048  * @since 3.3.0
   2049  */
   2050 function _wp_footer_scripts() {
   2051 	print_late_styles();
   2052 	print_footer_scripts();
   2053 }
   2054 
   2055 /**
   2056  * Hooks to print the scripts and styles in the footer.
   2057  *
   2058  * @since 2.8.0
   2059  */
   2060 function wp_print_footer_scripts() {
   2061 	/**
   2062 	 * Fires when footer scripts are printed.
   2063 	 *
   2064 	 * @since 2.8.0
   2065 	 */
   2066 	do_action( 'wp_print_footer_scripts' );
   2067 }
   2068 
   2069 /**
   2070  * Wrapper for do_action( 'wp_enqueue_scripts' ).
   2071  *
   2072  * Allows plugins to queue scripts for the front end using wp_enqueue_script().
   2073  * Runs first in wp_head() where all is_home(), is_page(), etc. functions are available.
   2074  *
   2075  * @since 2.8.0
   2076  */
   2077 function wp_enqueue_scripts() {
   2078 	/**
   2079 	 * Fires when scripts and styles are enqueued.
   2080 	 *
   2081 	 * @since 2.8.0
   2082 	 */
   2083 	do_action( 'wp_enqueue_scripts' );
   2084 }
   2085 
   2086 /**
   2087  * Prints the styles queue in the HTML head on admin pages.
   2088  *
   2089  * @since 2.8.0
   2090  *
   2091  * @global bool $concatenate_scripts
   2092  *
   2093  * @return array
   2094  */
   2095 function print_admin_styles() {
   2096 	global $concatenate_scripts;
   2097 
   2098 	$wp_styles = wp_styles();
   2099 
   2100 	script_concat_settings();
   2101 	$wp_styles->do_concat = $concatenate_scripts;
   2102 	$wp_styles->do_items( false );
   2103 
   2104 	/**
   2105 	 * Filters whether to print the admin styles.
   2106 	 *
   2107 	 * @since 2.8.0
   2108 	 *
   2109 	 * @param bool $print Whether to print the admin styles. Default true.
   2110 	 */
   2111 	if ( apply_filters( 'print_admin_styles', true ) ) {
   2112 		_print_styles();
   2113 	}
   2114 
   2115 	$wp_styles->reset();
   2116 	return $wp_styles->done;
   2117 }
   2118 
   2119 /**
   2120  * Prints the styles that were queued too late for the HTML head.
   2121  *
   2122  * @since 3.3.0
   2123  *
   2124  * @global WP_Styles $wp_styles
   2125  * @global bool      $concatenate_scripts
   2126  *
   2127  * @return array|void
   2128  */
   2129 function print_late_styles() {
   2130 	global $wp_styles, $concatenate_scripts;
   2131 
   2132 	if ( ! ( $wp_styles instanceof WP_Styles ) ) {
   2133 		return;
   2134 	}
   2135 
   2136 	script_concat_settings();
   2137 	$wp_styles->do_concat = $concatenate_scripts;
   2138 	$wp_styles->do_footer_items();
   2139 
   2140 	/**
   2141 	 * Filters whether to print the styles queued too late for the HTML head.
   2142 	 *
   2143 	 * @since 3.3.0
   2144 	 *
   2145 	 * @param bool $print Whether to print the 'late' styles. Default true.
   2146 	 */
   2147 	if ( apply_filters( 'print_late_styles', true ) ) {
   2148 		_print_styles();
   2149 	}
   2150 
   2151 	$wp_styles->reset();
   2152 	return $wp_styles->done;
   2153 }
   2154 
   2155 /**
   2156  * Print styles (internal use only)
   2157  *
   2158  * @ignore
   2159  * @since 3.3.0
   2160  *
   2161  * @global bool $compress_css
   2162  */
   2163 function _print_styles() {
   2164 	global $compress_css;
   2165 
   2166 	$wp_styles = wp_styles();
   2167 
   2168 	$zip = $compress_css ? 1 : 0;
   2169 	if ( $zip && defined( 'ENFORCE_GZIP' ) && ENFORCE_GZIP ) {
   2170 		$zip = 'gzip';
   2171 	}
   2172 
   2173 	$concat    = trim( $wp_styles->concat, ', ' );
   2174 	$type_attr = current_theme_supports( 'html5', 'style' ) ? '' : ' type="text/css"';
   2175 
   2176 	if ( $concat ) {
   2177 		$dir = $wp_styles->text_direction;
   2178 		$ver = $wp_styles->default_version;
   2179 
   2180 		$concat       = str_split( $concat, 128 );
   2181 		$concatenated = '';
   2182 
   2183 		foreach ( $concat as $key => $chunk ) {
   2184 			$concatenated .= "&load%5Bchunk_{$key}%5D={$chunk}";
   2185 		}
   2186 
   2187 		$href = $wp_styles->base_url . "/wp-admin/load-styles.php?c={$zip}&dir={$dir}" . $concatenated . '&ver=' . $ver;
   2188 		echo "<link rel='stylesheet' href='" . esc_attr( $href ) . "'{$type_attr} media='all' />\n";
   2189 
   2190 		if ( ! empty( $wp_styles->print_code ) ) {
   2191 			echo "<style{$type_attr}>\n";
   2192 			echo $wp_styles->print_code;
   2193 			echo "\n</style>\n";
   2194 		}
   2195 	}
   2196 
   2197 	if ( ! empty( $wp_styles->print_html ) ) {
   2198 		echo $wp_styles->print_html;
   2199 	}
   2200 }
   2201 
   2202 /**
   2203  * Determine the concatenation and compression settings for scripts and styles.
   2204  *
   2205  * @since 2.8.0
   2206  *
   2207  * @global bool $concatenate_scripts
   2208  * @global bool $compress_scripts
   2209  * @global bool $compress_css
   2210  */
   2211 function script_concat_settings() {
   2212 	global $concatenate_scripts, $compress_scripts, $compress_css;
   2213 
   2214 	$compressed_output = ( ini_get( 'zlib.output_compression' ) || 'ob_gzhandler' === ini_get( 'output_handler' ) );
   2215 
   2216 	if ( ! isset( $concatenate_scripts ) ) {
   2217 		$concatenate_scripts = defined( 'CONCATENATE_SCRIPTS' ) ? CONCATENATE_SCRIPTS : true;
   2218 		if ( ( ! is_admin() && ! did_action( 'login_init' ) ) || ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ) {
   2219 			$concatenate_scripts = false;
   2220 		}
   2221 	}
   2222 
   2223 	if ( ! isset( $compress_scripts ) ) {
   2224 		$compress_scripts = defined( 'COMPRESS_SCRIPTS' ) ? COMPRESS_SCRIPTS : true;
   2225 		if ( $compress_scripts && ( ! get_site_option( 'can_compress_scripts' ) || $compressed_output ) ) {
   2226 			$compress_scripts = false;
   2227 		}
   2228 	}
   2229 
   2230 	if ( ! isset( $compress_css ) ) {
   2231 		$compress_css = defined( 'COMPRESS_CSS' ) ? COMPRESS_CSS : true;
   2232 		if ( $compress_css && ( ! get_site_option( 'can_compress_scripts' ) || $compressed_output ) ) {
   2233 			$compress_css = false;
   2234 		}
   2235 	}
   2236 }
   2237 
   2238 /**
   2239  * Handles the enqueueing of block scripts and styles that are common to both
   2240  * the editor and the front-end.
   2241  *
   2242  * @since 5.0.0
   2243  *
   2244  * @global WP_Screen $current_screen WordPress current screen object.
   2245  */
   2246 function wp_common_block_scripts_and_styles() {
   2247 	if ( is_admin() && ! wp_should_load_block_editor_scripts_and_styles() ) {
   2248 		return;
   2249 	}
   2250 
   2251 	wp_enqueue_style( 'wp-block-library' );
   2252 
   2253 	if ( current_theme_supports( 'wp-block-styles' ) ) {
   2254 		wp_enqueue_style( 'wp-block-library-theme' );
   2255 	}
   2256 
   2257 	/**
   2258 	 * Fires after enqueuing block assets for both editor and front-end.
   2259 	 *
   2260 	 * Call `add_action` on any hook before 'wp_enqueue_scripts'.
   2261 	 *
   2262 	 * In the function call you supply, simply use `wp_enqueue_script` and
   2263 	 * `wp_enqueue_style` to add your functionality to the Gutenberg editor.
   2264 	 *
   2265 	 * @since 5.0.0
   2266 	 */
   2267 	do_action( 'enqueue_block_assets' );
   2268 }
   2269 
   2270 /**
   2271  * Enqueues the global styles defined via theme.json.
   2272  *
   2273  * @since 5.8.0
   2274  */
   2275 function wp_enqueue_global_styles() {
   2276 	if ( ! WP_Theme_JSON_Resolver::theme_has_support() ) {
   2277 		return;
   2278 	}
   2279 
   2280 	$separate_assets = wp_should_load_separate_core_block_assets();
   2281 
   2282 	/*
   2283 	 * Global styles should be printed in the head when loading all styles combined.
   2284 	 * The footer should only be used to print global styles for classic themes with separate core assets enabled.
   2285 	 *
   2286 	 * See https://core.trac.wordpress.org/ticket/53494.
   2287 	 */
   2288 	if ( ( ! $separate_assets && doing_action( 'wp_footer' ) ) || ( $separate_assets && doing_action( 'wp_enqueue_scripts' ) ) ) {
   2289 		return;
   2290 	}
   2291 
   2292 	$can_use_cache = (
   2293 		( ! defined( 'WP_DEBUG' ) || ! WP_DEBUG ) &&
   2294 		( ! defined( 'SCRIPT_DEBUG' ) || ! SCRIPT_DEBUG ) &&
   2295 		( ! defined( 'REST_REQUEST' ) || ! REST_REQUEST ) &&
   2296 		! is_admin()
   2297 	);
   2298 
   2299 	$stylesheet = null;
   2300 	if ( $can_use_cache ) {
   2301 		$cache = get_transient( 'global_styles' );
   2302 		if ( $cache ) {
   2303 			$stylesheet = $cache;
   2304 		}
   2305 	}
   2306 
   2307 	if ( null === $stylesheet ) {
   2308 		$settings   = get_default_block_editor_settings();
   2309 		$theme_json = WP_Theme_JSON_Resolver::get_merged_data( $settings );
   2310 		$stylesheet = $theme_json->get_stylesheet();
   2311 
   2312 		if ( $can_use_cache ) {
   2313 			set_transient( 'global_styles', $stylesheet, MINUTE_IN_SECONDS );
   2314 		}
   2315 	}
   2316 
   2317 	if ( empty( $stylesheet ) ) {
   2318 		return;
   2319 	}
   2320 
   2321 	wp_register_style( 'global-styles', false, array(), true, true );
   2322 	wp_add_inline_style( 'global-styles', $stylesheet );
   2323 	wp_enqueue_style( 'global-styles' );
   2324 }
   2325 
   2326 /**
   2327  * Checks if the editor scripts and styles for all registered block types
   2328  * should be enqueued on the current screen.
   2329  *
   2330  * @since 5.6.0
   2331  *
   2332  * @return bool Whether scripts and styles should be enqueued.
   2333  */
   2334 function wp_should_load_block_editor_scripts_and_styles() {
   2335 	global $current_screen;
   2336 
   2337 	$is_block_editor_screen = ( $current_screen instanceof WP_Screen ) && $current_screen->is_block_editor();
   2338 
   2339 	/**
   2340 	 * Filters the flag that decides whether or not block editor scripts and styles
   2341 	 * are going to be enqueued on the current screen.
   2342 	 *
   2343 	 * @since 5.6.0
   2344 	 *
   2345 	 * @param bool $is_block_editor_screen Current value of the flag.
   2346 	 */
   2347 	return apply_filters( 'should_load_block_editor_scripts_and_styles', $is_block_editor_screen );
   2348 }
   2349 
   2350 /**
   2351  * Checks whether separate styles should be loaded for core blocks on-render.
   2352  *
   2353  * When this function returns true, other functions ensure that core blocks
   2354  * only load their assets on-render, and each block loads its own, individual
   2355  * assets. Third-party blocks only load their assets when rendered.
   2356  *
   2357  * When this function returns false, all core block assets are loaded regardless
   2358  * of whether they are rendered in a page or not, because they are all part of
   2359  * the `block-library/style.css` file. Assets for third-party blocks are always
   2360  * enqueued regardless of whether they are rendered or not.
   2361  *
   2362  * This only affects front end and not the block editor screens.
   2363  *
   2364  * @see wp_enqueue_registered_block_scripts_and_styles()
   2365  * @see register_block_style_handle()
   2366  *
   2367  * @since 5.8.0
   2368  *
   2369  * @return bool Whether separate assets will be loaded.
   2370  */
   2371 function wp_should_load_separate_core_block_assets() {
   2372 	if ( is_admin() || is_feed() || ( defined( 'REST_REQUEST' ) && REST_REQUEST ) ) {
   2373 		return false;
   2374 	}
   2375 
   2376 	/**
   2377 	 * Filters whether block styles should be loaded separately.
   2378 	 *
   2379 	 * Returning false loads all core block assets, regardless of whether they are rendered
   2380 	 * in a page or not. Returning true loads core block assets only when they are rendered.
   2381 	 *
   2382 	 * @since 5.8.0
   2383 	 *
   2384 	 * @param bool $load_separate_assets Whether separate assets will be loaded.
   2385 	 *                                   Default false (all block assets are loaded, even when not used).
   2386 	 */
   2387 	return apply_filters( 'should_load_separate_core_block_assets', false );
   2388 }
   2389 
   2390 /**
   2391  * Enqueues registered block scripts and styles, depending on current rendered
   2392  * context (only enqueuing editor scripts while in context of the editor).
   2393  *
   2394  * @since 5.0.0
   2395  *
   2396  * @global WP_Screen $current_screen WordPress current screen object.
   2397  */
   2398 function wp_enqueue_registered_block_scripts_and_styles() {
   2399 	global $current_screen;
   2400 
   2401 	if ( wp_should_load_separate_core_block_assets() ) {
   2402 		return;
   2403 	}
   2404 
   2405 	$load_editor_scripts = is_admin() && wp_should_load_block_editor_scripts_and_styles();
   2406 
   2407 	$block_registry = WP_Block_Type_Registry::get_instance();
   2408 	foreach ( $block_registry->get_all_registered() as $block_name => $block_type ) {
   2409 		// Front-end styles.
   2410 		if ( ! empty( $block_type->style ) ) {
   2411 			wp_enqueue_style( $block_type->style );
   2412 		}
   2413 
   2414 		// Front-end script.
   2415 		if ( ! empty( $block_type->script ) ) {
   2416 			wp_enqueue_script( $block_type->script );
   2417 		}
   2418 
   2419 		// Editor styles.
   2420 		if ( $load_editor_scripts && ! empty( $block_type->editor_style ) ) {
   2421 			wp_enqueue_style( $block_type->editor_style );
   2422 		}
   2423 
   2424 		// Editor script.
   2425 		if ( $load_editor_scripts && ! empty( $block_type->editor_script ) ) {
   2426 			wp_enqueue_script( $block_type->editor_script );
   2427 		}
   2428 	}
   2429 }
   2430 
   2431 /**
   2432  * Function responsible for enqueuing the styles required for block styles functionality on the editor and on the frontend.
   2433  *
   2434  * @since 5.3.0
   2435  */
   2436 function enqueue_block_styles_assets() {
   2437 	$block_styles = WP_Block_Styles_Registry::get_instance()->get_all_registered();
   2438 
   2439 	foreach ( $block_styles as $block_name => $styles ) {
   2440 		foreach ( $styles as $style_properties ) {
   2441 			if ( isset( $style_properties['style_handle'] ) ) {
   2442 
   2443 				// If the site loads separate styles per-block, enqueue the stylesheet on render.
   2444 				if ( wp_should_load_separate_core_block_assets() ) {
   2445 					add_filter(
   2446 						'render_block',
   2447 						function( $html, $block ) use ( $style_properties ) {
   2448 							wp_enqueue_style( $style_properties['style_handle'] );
   2449 							return $html;
   2450 						}
   2451 					);
   2452 				} else {
   2453 					wp_enqueue_style( $style_properties['style_handle'] );
   2454 				}
   2455 			}
   2456 			if ( isset( $style_properties['inline_style'] ) ) {
   2457 
   2458 				// Default to "wp-block-library".
   2459 				$handle = 'wp-block-library';
   2460 
   2461 				// If the site loads separate styles per-block, check if the block has a stylesheet registered.
   2462 				if ( wp_should_load_separate_core_block_assets() ) {
   2463 					$block_stylesheet_handle = generate_block_asset_handle( $block_name, 'style' );
   2464 					global $wp_styles;
   2465 					if ( isset( $wp_styles->registered[ $block_stylesheet_handle ] ) ) {
   2466 						$handle = $block_stylesheet_handle;
   2467 					}
   2468 				}
   2469 
   2470 				// Add inline styles to the calculated handle.
   2471 				wp_add_inline_style( $handle, $style_properties['inline_style'] );
   2472 			}
   2473 		}
   2474 	}
   2475 }
   2476 
   2477 /**
   2478  * Function responsible for enqueuing the assets required for block styles functionality on the editor.
   2479  *
   2480  * @since 5.3.0
   2481  */
   2482 function enqueue_editor_block_styles_assets() {
   2483 	$block_styles = WP_Block_Styles_Registry::get_instance()->get_all_registered();
   2484 
   2485 	$register_script_lines = array( '( function() {' );
   2486 	foreach ( $block_styles as $block_name => $styles ) {
   2487 		foreach ( $styles as $style_properties ) {
   2488 			$block_style = array(
   2489 				'name'  => $style_properties['name'],
   2490 				'label' => $style_properties['label'],
   2491 			);
   2492 			if ( isset( $style_properties['is_default'] ) ) {
   2493 				$block_style['isDefault'] = $style_properties['is_default'];
   2494 			}
   2495 			$register_script_lines[] = sprintf(
   2496 				'	wp.blocks.registerBlockStyle( \'%s\', %s );',
   2497 				$block_name,
   2498 				wp_json_encode( $block_style )
   2499 			);
   2500 		}
   2501 	}
   2502 	$register_script_lines[] = '} )();';
   2503 	$inline_script           = implode( "\n", $register_script_lines );
   2504 
   2505 	wp_register_script( 'wp-block-styles', false, array( 'wp-blocks' ), true, true );
   2506 	wp_add_inline_script( 'wp-block-styles', $inline_script );
   2507 	wp_enqueue_script( 'wp-block-styles' );
   2508 }
   2509 
   2510 /**
   2511  * Enqueues the assets required for the block directory within the block editor.
   2512  *
   2513  * @since 5.5.0
   2514  */
   2515 function wp_enqueue_editor_block_directory_assets() {
   2516 	wp_enqueue_script( 'wp-block-directory' );
   2517 	wp_enqueue_style( 'wp-block-directory' );
   2518 }
   2519 
   2520 /**
   2521  * Enqueues the assets required for the format library within the block editor.
   2522  *
   2523  * @since 5.8.0
   2524  */
   2525 function wp_enqueue_editor_format_library_assets() {
   2526 	wp_enqueue_script( 'wp-format-library' );
   2527 	wp_enqueue_style( 'wp-format-library' );
   2528 }
   2529 
   2530 /**
   2531  * Sanitizes an attributes array into an attributes string to be placed inside a `<script>` tag.
   2532  *
   2533  * Automatically injects type attribute if needed.
   2534  * Used by {@see wp_get_script_tag()} and {@see wp_get_inline_script_tag()}.
   2535  *
   2536  * @since 5.7.0
   2537  *
   2538  * @param array $attributes Key-value pairs representing `<script>` tag attributes.
   2539  * @return string String made of sanitized `<script>` tag attributes.
   2540  */
   2541 function wp_sanitize_script_attributes( $attributes ) {
   2542 	$html5_script_support = ! is_admin() && ! current_theme_supports( 'html5', 'script' );
   2543 	$attributes_string    = '';
   2544 
   2545 	// If HTML5 script tag is supported, only the attribute name is added
   2546 	// to $attributes_string for entries with a boolean value, and that are true.
   2547 	foreach ( $attributes as $attribute_name => $attribute_value ) {
   2548 		if ( is_bool( $attribute_value ) ) {
   2549 			if ( $attribute_value ) {
   2550 				$attributes_string .= $html5_script_support ? sprintf( ' %1$s="%2$s"', esc_attr( $attribute_name ), esc_attr( $attribute_name ) ) : ' ' . esc_attr( $attribute_name );
   2551 			}
   2552 		} else {
   2553 			$attributes_string .= sprintf( ' %1$s="%2$s"', esc_attr( $attribute_name ), esc_attr( $attribute_value ) );
   2554 		}
   2555 	}
   2556 
   2557 	return $attributes_string;
   2558 }
   2559 
   2560 /**
   2561  * Formats `<script>` loader tags.
   2562  *
   2563  * It is possible to inject attributes in the `<script>` tag via the {@see 'wp_script_attributes'} filter.
   2564  * Automatically injects type attribute if needed.
   2565  *
   2566  * @since 5.7.0
   2567  *
   2568  * @param array $attributes Key-value pairs representing `<script>` tag attributes.
   2569  * @return string String containing `<script>` opening and closing tags.
   2570  */
   2571 function wp_get_script_tag( $attributes ) {
   2572 	if ( ! isset( $attributes['type'] ) && ! is_admin() && ! current_theme_supports( 'html5', 'script' ) ) {
   2573 		$attributes['type'] = 'text/javascript';
   2574 	}
   2575 	/**
   2576 	 * Filters attributes to be added to a script tag.
   2577 	 *
   2578 	 * @since 5.7.0
   2579 	 *
   2580 	 * @param array $attributes Key-value pairs representing `<script>` tag attributes.
   2581 	 *                          Only the attribute name is added to the `<script>` tag for
   2582 	 *                          entries with a boolean value, and that are true.
   2583 	 */
   2584 	$attributes = apply_filters( 'wp_script_attributes', $attributes );
   2585 
   2586 	return sprintf( "<script%s></script>\n", wp_sanitize_script_attributes( $attributes ) );
   2587 }
   2588 
   2589 /**
   2590  * Prints formatted `<script>` loader tag.
   2591  *
   2592  * It is possible to inject attributes in the `<script>` tag via the  {@see 'wp_script_attributes'}  filter.
   2593  * Automatically injects type attribute if needed.
   2594  *
   2595  * @since 5.7.0
   2596  *
   2597  * @param array $attributes Key-value pairs representing `<script>` tag attributes.
   2598  */
   2599 function wp_print_script_tag( $attributes ) {
   2600 	echo wp_get_script_tag( $attributes );
   2601 }
   2602 
   2603 /**
   2604  * Wraps inline JavaScript in `<script>` tag.
   2605  *
   2606  * It is possible to inject attributes in the `<script>` tag via the  {@see 'wp_script_attributes'}  filter.
   2607  * Automatically injects type attribute if needed.
   2608  *
   2609  * @since 5.7.0
   2610  *
   2611  * @param string $javascript Inline JavaScript code.
   2612  * @param array  $attributes  Optional. Key-value pairs representing `<script>` tag attributes.
   2613  * @return string String containing inline JavaScript code wrapped around `<script>` tag.
   2614  */
   2615 function wp_get_inline_script_tag( $javascript, $attributes = array() ) {
   2616 	if ( ! isset( $attributes['type'] ) && ! is_admin() && ! current_theme_supports( 'html5', 'script' ) ) {
   2617 		$attributes['type'] = 'text/javascript';
   2618 	}
   2619 	/**
   2620 	 * Filters attributes to be added to a script tag.
   2621 	 *
   2622 	 * @since 5.7.0
   2623 	 *
   2624 	 * @param array $attributes Key-value pairs representing `<script>` tag attributes.
   2625 	 *                          Only the attribute name is added to the `<script>` tag for
   2626 	 *                          entries with a boolean value, and that are true.
   2627 	 */
   2628 	$attributes = apply_filters( 'wp_inline_script_attributes', $attributes, $javascript );
   2629 
   2630 	$javascript = "\n" . trim( $javascript, "\n\r " ) . "\n";
   2631 
   2632 	return sprintf( "<script%s>%s</script>\n", wp_sanitize_script_attributes( $attributes ), $javascript );
   2633 }
   2634 
   2635 /**
   2636  * Prints inline JavaScript wrapped in `<script>` tag.
   2637  *
   2638  * It is possible to inject attributes in the `<script>` tag via the  {@see 'wp_script_attributes'}  filter.
   2639  * Automatically injects type attribute if needed.
   2640  *
   2641  * @since 5.7.0
   2642  *
   2643  * @param string $javascript Inline JavaScript code.
   2644  * @param array  $attributes Optional. Key-value pairs representing `<script>` tag attributes.
   2645  */
   2646 function wp_print_inline_script_tag( $javascript, $attributes = array() ) {
   2647 	echo wp_get_inline_script_tag( $javascript, $attributes );
   2648 }
   2649 
   2650 /**
   2651  * Allows small styles to be inlined.
   2652  *
   2653  * This improves performance and sustainability, and is opt-in. Stylesheets can opt in
   2654  * by adding `path` data using `wp_style_add_data`, and defining the file's absolute path:
   2655  *
   2656  *     wp_style_add_data( $style_handle, 'path', $file_path );
   2657  *
   2658  * @since 5.8.0
   2659  *
   2660  * @global WP_Styles $wp_styles
   2661  */
   2662 function wp_maybe_inline_styles() {
   2663 	global $wp_styles;
   2664 
   2665 	$total_inline_limit = 20000;
   2666 	/**
   2667 	 * The maximum size of inlined styles in bytes.
   2668 	 *
   2669 	 * @since 5.8.0
   2670 	 *
   2671 	 * @param int $total_inline_limit The file-size threshold, in bytes. Default 20000.
   2672 	 */
   2673 	$total_inline_limit = apply_filters( 'styles_inline_size_limit', $total_inline_limit );
   2674 
   2675 	$styles = array();
   2676 
   2677 	// Build an array of styles that have a path defined.
   2678 	foreach ( $wp_styles->queue as $handle ) {
   2679 		if ( wp_styles()->get_data( $handle, 'path' ) && file_exists( $wp_styles->registered[ $handle ]->extra['path'] ) ) {
   2680 			$styles[] = array(
   2681 				'handle' => $handle,
   2682 				'path'   => $wp_styles->registered[ $handle ]->extra['path'],
   2683 				'size'   => filesize( $wp_styles->registered[ $handle ]->extra['path'] ),
   2684 			);
   2685 		}
   2686 	}
   2687 
   2688 	if ( ! empty( $styles ) ) {
   2689 		// Reorder styles array based on size.
   2690 		usort(
   2691 			$styles,
   2692 			function( $a, $b ) {
   2693 				return ( $a['size'] <= $b['size'] ) ? -1 : 1;
   2694 			}
   2695 		);
   2696 
   2697 		/*
   2698 		 * The total inlined size.
   2699 		 *
   2700 		 * On each iteration of the loop, if a style gets added inline the value of this var increases
   2701 		 * to reflect the total size of inlined styles.
   2702 		 */
   2703 		$total_inline_size = 0;
   2704 
   2705 		// Loop styles.
   2706 		foreach ( $styles as $style ) {
   2707 
   2708 			// Size check. Since styles are ordered by size, we can break the loop.
   2709 			if ( $total_inline_size + $style['size'] > $total_inline_limit ) {
   2710 				break;
   2711 			}
   2712 
   2713 			// Get the styles if we don't already have them.
   2714 			$style['css'] = file_get_contents( $style['path'] );
   2715 
   2716 			// Set `src` to `false` and add styles inline.
   2717 			$wp_styles->registered[ $style['handle'] ]->src = false;
   2718 			if ( empty( $wp_styles->registered[ $style['handle'] ]->extra['after'] ) ) {
   2719 				$wp_styles->registered[ $style['handle'] ]->extra['after'] = array();
   2720 			}
   2721 			array_unshift( $wp_styles->registered[ $style['handle'] ]->extra['after'], $style['css'] );
   2722 
   2723 			// Add the styles size to the $total_inline_size var.
   2724 			$total_inline_size += (int) $style['size'];
   2725 		}
   2726 	}
   2727 }
   2728 
   2729 /**
   2730  * Inject the block editor assets that need to be loaded into the editor's iframe as an inline script.
   2731  *
   2732  * @since 5.8.0
   2733  */
   2734 function wp_add_iframed_editor_assets_html() {
   2735 	if ( ! wp_should_load_block_editor_scripts_and_styles() ) {
   2736 		return;
   2737 	}
   2738 
   2739 	$script_handles = array();
   2740 	$style_handles  = array(
   2741 		'wp-block-editor',
   2742 		'wp-block-library',
   2743 		'wp-block-library-theme',
   2744 		'wp-edit-blocks',
   2745 	);
   2746 
   2747 	$block_registry = WP_Block_Type_Registry::get_instance();
   2748 
   2749 	foreach ( $block_registry->get_all_registered() as $block_type ) {
   2750 		if ( ! empty( $block_type->style ) ) {
   2751 			$style_handles[] = $block_type->style;
   2752 		}
   2753 
   2754 		if ( ! empty( $block_type->editor_style ) ) {
   2755 			$style_handles[] = $block_type->editor_style;
   2756 		}
   2757 
   2758 		if ( ! empty( $block_type->script ) ) {
   2759 			$script_handles[] = $block_type->script;
   2760 		}
   2761 	}
   2762 
   2763 	$style_handles = array_unique( $style_handles );
   2764 	$done          = wp_styles()->done;
   2765 
   2766 	ob_start();
   2767 
   2768 	wp_styles()->done = array();
   2769 	wp_styles()->do_items( $style_handles );
   2770 	wp_styles()->done = $done;
   2771 
   2772 	$styles = ob_get_clean();
   2773 
   2774 	$script_handles = array_unique( $script_handles );
   2775 	$done           = wp_scripts()->done;
   2776 
   2777 	ob_start();
   2778 
   2779 	wp_scripts()->done = array();
   2780 	wp_scripts()->do_items( $script_handles );
   2781 	wp_scripts()->done = $done;
   2782 
   2783 	$scripts = ob_get_clean();
   2784 
   2785 	$editor_assets = wp_json_encode(
   2786 		array(
   2787 			'styles'  => $styles,
   2788 			'scripts' => $scripts,
   2789 		)
   2790 	);
   2791 
   2792 	echo "<script>window.__editorAssets = $editor_assets</script>";
   2793 }