Make WordPress Core

source: branches/5.5/src/wp-includes/script-loader.php @ 49275

Last change on this file since 49275 was 49275, checked in by tellyworth, 19 months ago

Community Events: Display dates and times in the user's time zone.

Fixes #51130
Merges [49145], [49146], [49147], [49152], and [49201] to the 5.5 branch.
Props sippis, hlashbrooke, audrasjb, Rarst, iandunn

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