[ Index ]

PHP Cross Reference of WordPress

title

Body

[close]

/wp-includes/ -> script-loader.php (source)

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


Generated: Mon Aug 2 01:00:04 2021 Cross-referenced by PHPXref 0.7.1