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


Generated: Thu Oct 28 01:00:03 2021 Cross-referenced by PHPXref 0.7.1