diff options
Diffstat (limited to 'srcs/wordpress/wp-includes/script-loader.php')
| -rw-r--r-- | srcs/wordpress/wp-includes/script-loader.php | 2945 |
1 files changed, 2945 insertions, 0 deletions
diff --git a/srcs/wordpress/wp-includes/script-loader.php b/srcs/wordpress/wp-includes/script-loader.php new file mode 100644 index 0000000..18ba2d4 --- /dev/null +++ b/srcs/wordpress/wp-includes/script-loader.php @@ -0,0 +1,2945 @@ +<?php +/** + * WordPress scripts and styles default loader. + * + * Several constants are used to manage the loading, concatenating and compression of scripts and CSS: + * define('SCRIPT_DEBUG', true); loads the development (non-minified) versions of all scripts and CSS, and disables compression and concatenation, + * define('CONCATENATE_SCRIPTS', false); disables compression and concatenation of scripts and CSS, + * define('COMPRESS_SCRIPTS', false); disables compression of scripts, + * define('COMPRESS_CSS', false); disables compression of CSS, + * define('ENFORCE_GZIP', true); forces gzip for compression (default is deflate). + * + * The globals $concatenate_scripts, $compress_scripts and $compress_css can be set by plugins + * to temporarily override the above settings. Also a compression test is run once and the result is saved + * as option 'can_compress_scripts' (0/1). The test will run again if that option is deleted. + * + * @package WordPress + */ + +/** WordPress Dependency Class */ +require( ABSPATH . WPINC . '/class-wp-dependency.php' ); + +/** WordPress Dependencies Class */ +require( ABSPATH . WPINC . '/class.wp-dependencies.php' ); + +/** WordPress Scripts Class */ +require( ABSPATH . WPINC . '/class.wp-scripts.php' ); + +/** WordPress Scripts Functions */ +require( ABSPATH . WPINC . '/functions.wp-scripts.php' ); + +/** WordPress Styles Class */ +require( ABSPATH . WPINC . '/class.wp-styles.php' ); + +/** WordPress Styles Functions */ +require( ABSPATH . WPINC . '/functions.wp-styles.php' ); + +/** + * Registers TinyMCE scripts. + * + * @since 5.0.0 + * + * @param WP_Scripts $scripts WP_Scripts object. + */ +function wp_register_tinymce_scripts( &$scripts, $force_uncompressed = false ) { + global $tinymce_version, $concatenate_scripts, $compress_scripts; + $suffix = wp_scripts_get_suffix(); + $dev_suffix = wp_scripts_get_suffix( 'dev' ); + + script_concat_settings(); + + $compressed = $compress_scripts && $concatenate_scripts && isset( $_SERVER['HTTP_ACCEPT_ENCODING'] ) + && false !== stripos( $_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip' ) && ! $force_uncompressed; + + // Load tinymce.js when running from /src, otherwise load wp-tinymce.js.gz (in production) or + // tinymce.min.js (when SCRIPT_DEBUG is true). + if ( $compressed ) { + $scripts->add( 'wp-tinymce', includes_url( 'js/tinymce/' ) . 'wp-tinymce.js', array(), $tinymce_version ); + } else { + $scripts->add( 'wp-tinymce-root', includes_url( 'js/tinymce/' ) . "tinymce$dev_suffix.js", array(), $tinymce_version ); + $scripts->add( 'wp-tinymce', includes_url( 'js/tinymce/' ) . "plugins/compat3x/plugin$dev_suffix.js", array( 'wp-tinymce-root' ), $tinymce_version ); + } + + $scripts->add( 'wp-tinymce-lists', includes_url( "js/tinymce/plugins/lists/plugin$suffix.js" ), array( 'wp-tinymce' ), $tinymce_version ); +} + +/** + * Registers all the WordPress vendor scripts that are in the standardized + * `js/dist/vendor/` location. + * + * For the order of `$scripts->add` see `wp_default_scripts`. + * + * @since 5.0.0 + * + * @param WP_Scripts $scripts WP_Scripts object. + */ +function wp_default_packages_vendor( &$scripts ) { + global $wp_locale; + + $suffix = wp_scripts_get_suffix(); + + $vendor_scripts = array( + 'react' => array( 'wp-polyfill' ), + 'react-dom' => array( 'react' ), + 'moment', + 'lodash', + 'wp-polyfill-fetch', + 'wp-polyfill-formdata', + 'wp-polyfill-node-contains', + 'wp-polyfill-element-closest', + 'wp-polyfill', + ); + + $vendor_scripts_versions = array( + 'react' => '16.9.0', + 'react-dom' => '16.9.0', + 'moment' => '2.22.2', + 'lodash' => '4.17.15', + 'wp-polyfill-fetch' => '3.0.0', + 'wp-polyfill-formdata' => '3.0.12', + 'wp-polyfill-node-contains' => '3.26.0-0', + 'wp-polyfill-element-closest' => '2.0.2', + 'wp-polyfill' => '7.4.4', + ); + + foreach ( $vendor_scripts as $handle => $dependencies ) { + if ( is_string( $dependencies ) ) { + $handle = $dependencies; + $dependencies = array(); + } + + $path = "/wp-includes/js/dist/vendor/$handle$suffix.js"; + $version = $vendor_scripts_versions[ $handle ]; + + $scripts->add( $handle, $path, $dependencies, $version, 1 ); + } + + $scripts->add( 'wp-polyfill', null, array( 'wp-polyfill' ) ); + did_action( 'init' ) && $scripts->add_inline_script( + 'wp-polyfill', + wp_get_script_polyfill( + $scripts, + array( + '\'fetch\' in window' => 'wp-polyfill-fetch', + 'document.contains' => 'wp-polyfill-node-contains', + 'window.FormData && window.FormData.prototype.keys' => 'wp-polyfill-formdata', + 'Element.prototype.matches && Element.prototype.closest' => 'wp-polyfill-element-closest', + ) + ) + ); + + did_action( 'init' ) && $scripts->add_inline_script( 'lodash', 'window.lodash = _.noConflict();' ); + + did_action( 'init' ) && $scripts->add_inline_script( + 'moment', + sprintf( + "moment.locale( '%s', %s );", + get_user_locale(), + wp_json_encode( + array( + 'months' => array_values( $wp_locale->month ), + 'monthsShort' => array_values( $wp_locale->month_abbrev ), + 'weekdays' => array_values( $wp_locale->weekday ), + 'weekdaysShort' => array_values( $wp_locale->weekday_abbrev ), + 'week' => array( + 'dow' => (int) get_option( 'start_of_week', 0 ), + ), + 'longDateFormat' => array( + 'LT' => get_option( 'time_format', __( 'g:i a', 'default' ) ), + 'LTS' => null, + 'L' => null, + 'LL' => get_option( 'date_format', __( 'F j, Y', 'default' ) ), + 'LLL' => __( 'F j, Y g:i a', 'default' ), + 'LLLL' => null, + ), + ) + ) + ), + 'after' + ); +} + +/** + * Returns contents of an inline script used in appending polyfill scripts for + * browsers which fail the provided tests. The provided array is a mapping from + * a condition to verify feature support to its polyfill script handle. + * + * @since 5.0.0 + * + * @param WP_Scripts $scripts WP_Scripts object. + * @param array $tests Features to detect. + * @return string Conditional polyfill inline script. + */ +function wp_get_script_polyfill( &$scripts, $tests ) { + $polyfill = ''; + foreach ( $tests as $test => $handle ) { + if ( ! array_key_exists( $handle, $scripts->registered ) ) { + continue; + } + + $src = $scripts->registered[ $handle ]->src; + $ver = $scripts->registered[ $handle ]->ver; + + if ( ! preg_match( '|^(https?:)?//|', $src ) && ! ( $scripts->content_url && 0 === strpos( $src, $scripts->content_url ) ) ) { + $src = $scripts->base_url . $src; + } + + if ( ! empty( $ver ) ) { + $src = add_query_arg( 'ver', $ver, $src ); + } + + /** This filter is documented in wp-includes/class.wp-scripts.php */ + $src = esc_url( apply_filters( 'script_loader_src', $src, $handle ) ); + + if ( ! $src ) { + continue; + } + + $polyfill .= ( + // Test presence of feature... + '( ' . $test . ' ) || ' . + // ...appending polyfill on any failures. Cautious viewers may balk + // at the `document.write`. Its caveat of synchronous mid-stream + // blocking write is exactly the behavior we need though. + 'document.write( \'<script src="' . + $src . + '"></scr\' + \'ipt>\' );' + ); + } + + return $polyfill; +} + +/** + * Registers all the WordPress packages scripts that are in the standardized + * `js/dist/` location. + * + * For the order of `$scripts->add` see `wp_default_scripts`. + * + * @since 5.0.0 + * + * @param WP_Scripts $scripts WP_Scripts object. + */ +function wp_default_packages_scripts( &$scripts ) { + $suffix = wp_scripts_get_suffix(); + + $packages_versions = array( + 'a11y' => '2.5.1', + 'annotations' => '1.7.2', + 'api-fetch' => '3.6.4', + 'autop' => '2.5.1', + 'blob' => '2.5.1', + 'block-editor' => '3.2.5', + 'block-library' => '2.9.6', + 'block-serialization-default-parser' => '3.4.1', + 'blocks' => '6.7.2', + 'components' => '8.3.2', + 'compose' => '3.7.2', + 'core-data' => '2.7.5', + 'data-controls' => '1.3.4', + 'data' => '4.9.2', + 'date' => '3.5.0', + 'deprecated' => '2.6.1', + 'dom-ready' => '2.5.1', + 'dom' => '2.5.2', + 'edit-post' => '3.8.6', + 'editor' => '9.7.6', + 'element' => '2.8.2', + 'escape-html' => '1.5.1', + 'format-library' => '1.9.5', + 'hooks' => '2.6.0', + 'html-entities' => '2.5.0', + 'i18n' => '3.6.1', + 'is-shallow-equal' => '1.6.1', + 'keycodes' => '2.6.2', + 'list-reusable-blocks' => '1.8.4', + 'media-utils' => '1.2.4', + 'notices' => '1.8.2', + 'nux' => '3.7.2', + 'plugins' => '2.7.2', + 'priority-queue' => '1.3.1', + 'redux-routine' => '3.6.2', + 'rich-text' => '3.7.2', + 'shortcode' => '2.4.1', + 'server-side-render' => '1.3.4', + 'token-list' => '1.6.1', + 'url' => '2.8.2', + 'viewport' => '2.8.2', + 'wordcount' => '2.6.2', + ); + + $packages_dependencies = array( + 'a11y' => array( + 'wp-dom-ready', + 'wp-polyfill', + ), + 'annotations' => array( + 'lodash', + 'wp-data', + 'wp-hooks', + 'wp-i18n', + 'wp-polyfill', + 'wp-rich-text', + ), + 'api-fetch' => array( + 'wp-i18n', + 'wp-polyfill', + 'wp-url', + ), + 'autop' => array( + 'wp-polyfill', + ), + 'blob' => array( + 'wp-polyfill', + ), + 'block-editor' => array( + 'lodash', + 'wp-a11y', + 'wp-blob', + 'wp-blocks', + 'wp-components', + 'wp-compose', + 'wp-data', + 'wp-deprecated', + 'wp-dom', + 'wp-element', + 'wp-hooks', + 'wp-html-entities', + 'wp-i18n', + 'wp-is-shallow-equal', + 'wp-keycodes', + 'wp-polyfill', + 'wp-rich-text', + 'wp-token-list', + 'wp-url', + 'wp-viewport', + 'wp-wordcount', + ), + 'block-library' => array( + 'editor', + 'lodash', + 'moment', + 'wp-a11y', + 'wp-api-fetch', + 'wp-autop', + 'wp-blob', + 'wp-block-editor', + 'wp-blocks', + 'wp-components', + 'wp-compose', + 'wp-core-data', + 'wp-data', + 'wp-date', + 'wp-deprecated', + 'wp-editor', + 'wp-element', + 'wp-i18n', + 'wp-is-shallow-equal', + 'wp-keycodes', + 'wp-polyfill', + 'wp-rich-text', + 'wp-server-side-render', + 'wp-url', + 'wp-viewport', + ), + 'block-serialization-default-parser' => array( + 'wp-polyfill', + ), + 'blocks' => array( + 'lodash', + 'wp-autop', + 'wp-blob', + 'wp-block-serialization-default-parser', + 'wp-compose', + 'wp-data', + 'wp-dom', + 'wp-element', + 'wp-hooks', + 'wp-html-entities', + 'wp-i18n', + 'wp-is-shallow-equal', + 'wp-polyfill', + 'wp-shortcode', + ), + 'components' => array( + 'lodash', + 'moment', + 'wp-a11y', + 'wp-compose', + 'wp-deprecated', + 'wp-dom', + 'wp-element', + 'wp-hooks', + 'wp-i18n', + 'wp-is-shallow-equal', + 'wp-keycodes', + 'wp-polyfill', + 'wp-rich-text', + ), + 'compose' => array( + 'lodash', + 'wp-element', + 'wp-is-shallow-equal', + 'wp-polyfill', + ), + 'core-data' => array( + 'lodash', + 'wp-api-fetch', + 'wp-data', + 'wp-deprecated', + 'wp-is-shallow-equal', + 'wp-polyfill', + 'wp-url', + ), + 'data' => array( + 'lodash', + 'wp-compose', + 'wp-deprecated', + 'wp-element', + 'wp-is-shallow-equal', + 'wp-polyfill', + 'wp-priority-queue', + 'wp-redux-routine', + ), + 'data-controls' => array( + 'wp-api-fetch', + 'wp-data', + 'wp-polyfill', + ), + 'date' => array( + 'moment', + 'wp-polyfill', + ), + 'deprecated' => array( + 'wp-hooks', + 'wp-polyfill', + ), + 'dom' => array( + 'lodash', + 'wp-polyfill', + ), + 'dom-ready' => array( + 'wp-polyfill', + ), + 'edit-post' => array( + 'lodash', + 'postbox', + 'media-models', + 'media-views', + 'wp-a11y', + 'wp-api-fetch', + 'wp-block-editor', + 'wp-block-library', + 'wp-blocks', + 'wp-components', + 'wp-compose', + 'wp-core-data', + 'wp-data', + 'wp-dom-ready', + 'wp-editor', + 'wp-element', + 'wp-hooks', + 'wp-i18n', + 'wp-keycodes', + 'wp-media-utils', + 'wp-notices', + 'wp-nux', + 'wp-plugins', + 'wp-polyfill', + 'wp-url', + 'wp-viewport', + ), + 'editor' => array( + 'lodash', + 'wp-api-fetch', + 'wp-autop', + 'wp-block-editor', + 'wp-blocks', + 'wp-components', + 'wp-compose', + 'wp-core-data', + 'wp-data', + 'wp-data-controls', + 'wp-date', + 'wp-deprecated', + 'wp-element', + 'wp-hooks', + 'wp-html-entities', + 'wp-i18n', + 'wp-is-shallow-equal', + 'wp-keycodes', + 'wp-media-utils', + 'wp-notices', + 'wp-nux', + 'wp-polyfill', + 'wp-rich-text', + 'wp-server-side-render', + 'wp-url', + 'wp-viewport', + 'wp-wordcount', + ), + 'element' => array( + 'lodash', + 'react', + 'react-dom', + 'wp-escape-html', + 'wp-polyfill', + ), + 'escape-html' => array( + 'wp-polyfill', + ), + 'format-library' => array( + 'lodash', + 'wp-block-editor', + 'wp-components', + 'wp-dom', + 'wp-element', + 'wp-html-entities', + 'wp-i18n', + 'wp-keycodes', + 'wp-polyfill', + 'wp-rich-text', + 'wp-url', + ), + 'hooks' => array( + 'wp-polyfill', + ), + 'html-entities' => array( + 'wp-polyfill', + ), + 'i18n' => array( + 'wp-polyfill', + ), + 'is-shallow-equal' => array( + 'wp-polyfill', + ), + 'keycodes' => array( + 'lodash', + 'wp-i18n', + 'wp-polyfill', + ), + 'list-reusable-blocks' => array( + 'lodash', + 'wp-api-fetch', + 'wp-components', + 'wp-compose', + 'wp-element', + 'wp-i18n', + 'wp-polyfill', + ), + 'media-utils' => array( + 'lodash', + 'wp-api-fetch', + 'wp-blob', + 'wp-element', + 'wp-i18n', + 'wp-polyfill', + ), + 'notices' => array( + 'lodash', + 'wp-a11y', + 'wp-data', + 'wp-polyfill', + ), + 'nux' => array( + 'lodash', + 'wp-components', + 'wp-compose', + 'wp-data', + 'wp-element', + 'wp-i18n', + 'wp-polyfill', + ), + 'plugins' => array( + 'lodash', + 'wp-compose', + 'wp-element', + 'wp-hooks', + 'wp-polyfill', + ), + 'priority-queue' => array( + 'wp-polyfill', + ), + 'redux-routine' => array( + 'lodash', + 'wp-polyfill', + ), + 'rich-text' => array( + 'lodash', + 'wp-compose', + 'wp-data', + 'wp-element', + 'wp-escape-html', + 'wp-hooks', + 'wp-is-shallow-equal', + 'wp-keycodes', + 'wp-polyfill', + ), + 'server-side-render' => array( + 'lodash', + 'wp-api-fetch', + 'wp-components', + 'wp-data', + 'wp-deprecated', + 'wp-element', + 'wp-i18n', + 'wp-polyfill', + 'wp-url', + ), + 'shortcode' => array( + 'lodash', + 'wp-polyfill', + ), + 'token-list' => array( + 'lodash', + 'wp-polyfill', + ), + 'url' => array( + 'wp-polyfill', + ), + 'viewport' => array( + 'lodash', + 'wp-compose', + 'wp-data', + 'wp-polyfill', + ), + 'wordcount' => array( + 'lodash', + 'wp-polyfill', + ), + ); + + $package_translations = array( + 'api-fetch', + 'blocks', + 'block-editor', + 'block-library', + 'components', + 'edit-post', + 'editor', + 'format-library', + 'keycodes', + 'list-reusable-blocks', + 'nux', + ); + + foreach ( $packages_dependencies as $package => $dependencies ) { + $handle = 'wp-' . $package; + $path = "/wp-includes/js/dist/$package$suffix.js"; + $version = $packages_versions[ $package ]; + + $scripts->add( $handle, $path, $dependencies, $version, 1 ); + + if ( in_array( $package, $package_translations, true ) ) { + $scripts->set_translations( $handle ); + } + } +} + +/** + * Adds inline scripts required for the WordPress JavaScript packages. + * + * @since 5.0.0 + * + * @param WP_Scripts $scripts WP_Scripts object. + */ +function wp_default_packages_inline_scripts( &$scripts ) { + global $wp_locale; + + if ( isset( $scripts->registered['wp-api-fetch'] ) ) { + $scripts->registered['wp-api-fetch']->deps[] = 'wp-hooks'; + } + $scripts->add_inline_script( + 'wp-api-fetch', + sprintf( + 'wp.apiFetch.use( wp.apiFetch.createRootURLMiddleware( "%s" ) );', + esc_url_raw( get_rest_url() ) + ), + 'after' + ); + $scripts->add_inline_script( + 'wp-api-fetch', + implode( + "\n", + array( + sprintf( + 'wp.apiFetch.nonceMiddleware = wp.apiFetch.createNonceMiddleware( "%s" );', + ( wp_installing() && ! is_multisite() ) ? '' : wp_create_nonce( 'wp_rest' ) + ), + 'wp.apiFetch.use( wp.apiFetch.nonceMiddleware );', + 'wp.apiFetch.use( wp.apiFetch.mediaUploadMiddleware );', + sprintf( + 'wp.apiFetch.nonceEndpoint = "%s";', + admin_url( 'admin-ajax.php?action=rest-nonce' ) + ), + ) + ), + 'after' + ); + $scripts->add_inline_script( + 'wp-data', + implode( + "\n", + array( + '( function() {', + ' var userId = ' . get_current_user_ID() . ';', + ' var storageKey = "WP_DATA_USER_" + userId;', + ' wp.data', + ' .use( wp.data.plugins.persistence, { storageKey: storageKey } );', + ' wp.data.plugins.persistence.__unstableMigrate( { storageKey: storageKey } );', + '} )();', + ) + ) + ); + + $scripts->add_inline_script( + 'wp-date', + sprintf( + 'wp.date.setSettings( %s );', + wp_json_encode( + array( + 'l10n' => array( + 'locale' => get_user_locale(), + 'months' => array_values( $wp_locale->month ), + 'monthsShort' => array_values( $wp_locale->month_abbrev ), + 'weekdays' => array_values( $wp_locale->weekday ), + 'weekdaysShort' => array_values( $wp_locale->weekday_abbrev ), + 'meridiem' => (object) $wp_locale->meridiem, + 'relative' => array( + /* translators: %s: Duration. */ + 'future' => __( '%s from now' ), + /* translators: %s: Duration. */ + 'past' => __( '%s ago' ), + ), + ), + 'formats' => array( + /* translators: Time format, see https://secure.php.net/date */ + 'time' => get_option( 'time_format', __( 'g:i a' ) ), + /* translators: Date format, see https://secure.php.net/date */ + 'date' => get_option( 'date_format', __( 'F j, Y' ) ), + /* translators: Date/Time format, see https://secure.php.net/date */ + 'datetime' => __( 'F j, Y g:i a' ), + /* translators: Abbreviated date/time format, see https://secure.php.net/date */ + 'datetimeAbbreviated' => __( 'M j, Y g:i a' ), + ), + 'timezone' => array( + 'offset' => get_option( 'gmt_offset', 0 ), + 'string' => get_option( 'timezone_string', 'UTC' ), + ), + ) + ) + ), + 'after' + ); + + // Loading the old editor and its config to ensure the classic block works as expected. + $scripts->add_inline_script( + 'editor', + 'window.wp.oldEditor = window.wp.editor;', + 'after' + ); +} + +/** + * Adds inline scripts required for the TinyMCE in the block editor. + * + * These TinyMCE init settings are used to extend and override the default settings + * from `_WP_Editors::default_settings()` for the Classic block. + * + * @since 5.0.0 + * + * @global WP_Scripts $wp_scripts + */ +function wp_tinymce_inline_scripts() { + global $wp_scripts; + + /** This filter is documented in wp-includes/class-wp-editor.php */ + $editor_settings = apply_filters( 'wp_editor_settings', array( 'tinymce' => true ), 'classic-block' ); + + $tinymce_plugins = array( + 'charmap', + 'colorpicker', + 'hr', + 'lists', + 'media', + 'paste', + 'tabfocus', + 'textcolor', + 'fullscreen', + 'wordpress', + 'wpautoresize', + 'wpeditimage', + 'wpemoji', + 'wpgallery', + 'wplink', + 'wpdialogs', + 'wptextpattern', + 'wpview', + ); + + /* This filter is documented in wp-includes/class-wp-editor.php */ + $tinymce_plugins = apply_filters( 'tiny_mce_plugins', $tinymce_plugins, 'classic-block' ); + $tinymce_plugins = array_unique( $tinymce_plugins ); + + $disable_captions = false; + // Runs after `tiny_mce_plugins` but before `mce_buttons`. + /** This filter is documented in wp-admin/includes/media.php */ + if ( apply_filters( 'disable_captions', '' ) ) { + $disable_captions = true; + } + + $toolbar1 = array( + 'formatselect', + 'bold', + 'italic', + 'bullist', + 'numlist', + 'blockquote', + 'alignleft', + 'aligncenter', + 'alignright', + 'link', + 'unlink', + 'wp_more', + 'spellchecker', + 'wp_add_media', + 'wp_adv', + ); + + /* This filter is documented in wp-includes/class-wp-editor.php */ + $toolbar1 = apply_filters( 'mce_buttons', $toolbar1, 'classic-block' ); + + $toolbar2 = array( + 'strikethrough', + 'hr', + 'forecolor', + 'pastetext', + 'removeformat', + 'charmap', + 'outdent', + 'indent', + 'undo', + 'redo', + 'wp_help', + ); + + /* This filter is documented in wp-includes/class-wp-editor.php */ + $toolbar2 = apply_filters( 'mce_buttons_2', $toolbar2, 'classic-block' ); + /* This filter is documented in wp-includes/class-wp-editor.php */ + $toolbar3 = apply_filters( 'mce_buttons_3', array(), 'classic-block' ); + /* This filter is documented in wp-includes/class-wp-editor.php */ + $toolbar4 = apply_filters( 'mce_buttons_4', array(), 'classic-block' ); + /* This filter is documented in wp-includes/class-wp-editor.php */ + $external_plugins = apply_filters( 'mce_external_plugins', array(), 'classic-block' ); + + $tinymce_settings = array( + 'plugins' => implode( ',', $tinymce_plugins ), + 'toolbar1' => implode( ',', $toolbar1 ), + 'toolbar2' => implode( ',', $toolbar2 ), + 'toolbar3' => implode( ',', $toolbar3 ), + 'toolbar4' => implode( ',', $toolbar4 ), + 'external_plugins' => wp_json_encode( $external_plugins ), + 'classic_block_editor' => true, + ); + + if ( $disable_captions ) { + $tinymce_settings['wpeditimage_disable_captions'] = true; + } + + if ( ! empty( $editor_settings['tinymce'] ) && is_array( $editor_settings['tinymce'] ) ) { + array_merge( $tinymce_settings, $editor_settings['tinymce'] ); + } + + /* This filter is documented in wp-includes/class-wp-editor.php */ + $tinymce_settings = apply_filters( 'tiny_mce_before_init', $tinymce_settings, 'classic-block' ); + + // Do "by hand" translation from PHP array to js object. + // Prevents breakage in some custom settings. + $init_obj = ''; + foreach ( $tinymce_settings as $key => $value ) { + if ( is_bool( $value ) ) { + $val = $value ? 'true' : 'false'; + $init_obj .= $key . ':' . $val . ','; + continue; + } elseif ( ! empty( $value ) && is_string( $value ) && ( + ( '{' === $value[0] && '}' === $value[ strlen( $value ) - 1 ] ) || + ( '[' === $value[0] && ']' === $value[ strlen( $value ) - 1 ] ) || + preg_match( '/^\(?function ?\(/', $value ) ) ) { + $init_obj .= $key . ':' . $value . ','; + continue; + } + $init_obj .= $key . ':"' . $value . '",'; + } + + $init_obj = '{' . trim( $init_obj, ' ,' ) . '}'; + + $script = 'window.wpEditorL10n = { + tinymce: { + baseURL: ' . wp_json_encode( includes_url( 'js/tinymce' ) ) . ', + suffix: ' . ( SCRIPT_DEBUG ? '""' : '".min"' ) . ', + settings: ' . $init_obj . ', + } + }'; + + $wp_scripts->add_inline_script( 'wp-block-library', $script, 'before' ); +} + +/** + * Registers all the WordPress packages scripts. + * + * @since 5.0.0 + * + * @param WP_Scripts $scripts WP_Scripts object. + */ +function wp_default_packages( &$scripts ) { + wp_default_packages_vendor( $scripts ); + wp_register_tinymce_scripts( $scripts ); + wp_default_packages_scripts( $scripts ); + + if ( did_action( 'init' ) ) { + wp_default_packages_inline_scripts( $scripts ); + } +} + +/** + * Returns the suffix that can be used for the scripts. + * + * There are two suffix types, the normal one and the dev suffix. + * + * @since 5.0.0 + * + * @param string $type The type of suffix to retrieve. + * @return string The script suffix. + */ +function wp_scripts_get_suffix( $type = '' ) { + static $suffixes; + + if ( $suffixes === null ) { + include( ABSPATH . WPINC . '/version.php' ); // include an unmodified $wp_version + + $develop_src = false !== strpos( $wp_version, '-src' ); + + if ( ! defined( 'SCRIPT_DEBUG' ) ) { + define( 'SCRIPT_DEBUG', $develop_src ); + } + $suffix = SCRIPT_DEBUG ? '' : '.min'; + $dev_suffix = $develop_src ? '' : '.min'; + + $suffixes = array( + 'suffix' => $suffix, + 'dev_suffix' => $dev_suffix, + ); + } + + if ( $type === 'dev' ) { + return $suffixes['dev_suffix']; + } + + return $suffixes['suffix']; +} + +/** + * Register all WordPress scripts. + * + * Localizes some of them. + * args order: `$scripts->add( 'handle', 'url', 'dependencies', 'query-string', 1 );` + * when last arg === 1 queues the script for the footer + * + * @since 2.6.0 + * + * @param WP_Scripts $scripts WP_Scripts object. + */ +function wp_default_scripts( &$scripts ) { + $suffix = wp_scripts_get_suffix(); + $dev_suffix = wp_scripts_get_suffix( 'dev' ); + $guessurl = site_url(); + + if ( ! $guessurl ) { + $guessed_url = true; + $guessurl = wp_guess_url(); + } + + $scripts->base_url = $guessurl; + $scripts->content_url = defined( 'WP_CONTENT_URL' ) ? WP_CONTENT_URL : ''; + $scripts->default_version = get_bloginfo( 'version' ); + $scripts->default_dirs = array( '/wp-admin/js/', '/wp-includes/js/' ); + + $scripts->add( 'utils', "/wp-includes/js/utils$suffix.js" ); + did_action( 'init' ) && $scripts->localize( + 'utils', + 'userSettings', + array( + 'url' => (string) SITECOOKIEPATH, + 'uid' => (string) get_current_user_id(), + 'time' => (string) time(), + 'secure' => (string) ( 'https' === parse_url( site_url(), PHP_URL_SCHEME ) ), + ) + ); + + $scripts->add( 'common', "/wp-admin/js/common$suffix.js", array( 'jquery', 'hoverIntent', 'utils' ), false, 1 ); + did_action( 'init' ) && $scripts->localize( + 'common', + 'commonL10n', + array( + 'warnDelete' => __( "You are about to permanently delete these items from your site.\nThis action cannot be undone.\n 'Cancel' to stop, 'OK' to delete." ), + 'dismiss' => __( 'Dismiss this notice.' ), + 'collapseMenu' => __( 'Collapse Main menu' ), + 'expandMenu' => __( 'Expand Main menu' ), + ) + ); + + $scripts->add( 'wp-sanitize', "/wp-includes/js/wp-sanitize$suffix.js", array(), false, 1 ); + + $scripts->add( 'sack', "/wp-includes/js/tw-sack$suffix.js", array(), '1.6.1', 1 ); + + $scripts->add( 'quicktags', "/wp-includes/js/quicktags$suffix.js", array(), false, 1 ); + did_action( 'init' ) && $scripts->localize( + 'quicktags', + 'quicktagsL10n', + array( + 'closeAllOpenTags' => __( 'Close all open tags' ), + 'closeTags' => __( 'close tags' ), + 'enterURL' => __( 'Enter the URL' ), + 'enterImageURL' => __( 'Enter the URL of the image' ), + 'enterImageDescription' => __( 'Enter a description of the image' ), + 'textdirection' => __( 'text direction' ), + 'toggleTextdirection' => __( 'Toggle Editor Text Direction' ), + 'dfw' => __( 'Distraction-free writing mode' ), + 'strong' => __( 'Bold' ), + 'strongClose' => __( 'Close bold tag' ), + 'em' => __( 'Italic' ), + 'emClose' => __( 'Close italic tag' ), + 'link' => __( 'Insert link' ), + 'blockquote' => __( 'Blockquote' ), + 'blockquoteClose' => __( 'Close blockquote tag' ), + 'del' => __( 'Deleted text (strikethrough)' ), + 'delClose' => __( 'Close deleted text tag' ), + 'ins' => __( 'Inserted text' ), + 'insClose' => __( 'Close inserted text tag' ), + 'image' => __( 'Insert image' ), + 'ul' => __( 'Bulleted list' ), + 'ulClose' => __( 'Close bulleted list tag' ), + 'ol' => __( 'Numbered list' ), + 'olClose' => __( 'Close numbered list tag' ), + 'li' => __( 'List item' ), + 'liClose' => __( 'Close list item tag' ), + 'code' => __( 'Code' ), + 'codeClose' => __( 'Close code tag' ), + 'more' => __( 'Insert Read More tag' ), + ) + ); + + $scripts->add( 'colorpicker', "/wp-includes/js/colorpicker$suffix.js", array( 'prototype' ), '3517m' ); + + $scripts->add( 'editor', "/wp-admin/js/editor$suffix.js", array( 'utils', 'jquery' ), false, 1 ); + + $scripts->add( 'clipboard', "/wp-includes/js/clipboard$suffix.js", array(), false, 1 ); + + // Back-compat for old DFW. To-do: remove at the end of 2016. + $scripts->add( 'wp-fullscreen-stub', "/wp-admin/js/wp-fullscreen-stub$suffix.js", array(), false, 1 ); + + $scripts->add( 'wp-ajax-response', "/wp-includes/js/wp-ajax-response$suffix.js", array( 'jquery' ), false, 1 ); + did_action( 'init' ) && $scripts->localize( + 'wp-ajax-response', + 'wpAjax', + array( + 'noPerm' => __( 'Sorry, you are not allowed to do that.' ), + 'broken' => __( 'Something went wrong.' ), + ) + ); + + $scripts->add( 'wp-api-request', "/wp-includes/js/api-request$suffix.js", array( 'jquery' ), false, 1 ); + // `wpApiSettings` is also used by `wp-api`, which depends on this script. + did_action( 'init' ) && $scripts->localize( + 'wp-api-request', + 'wpApiSettings', + array( + 'root' => esc_url_raw( get_rest_url() ), + 'nonce' => ( wp_installing() && ! is_multisite() ) ? '' : wp_create_nonce( 'wp_rest' ), + 'versionString' => 'wp/v2/', + ) + ); + + $scripts->add( 'wp-pointer', "/wp-includes/js/wp-pointer$suffix.js", array( 'jquery-ui-widget', 'jquery-ui-position' ), '20111129a', 1 ); + did_action( 'init' ) && $scripts->localize( + 'wp-pointer', + 'wpPointerL10n', + array( + 'dismiss' => __( 'Dismiss' ), + ) + ); + + $scripts->add( 'autosave', "/wp-includes/js/autosave$suffix.js", array( 'heartbeat' ), false, 1 ); + + $scripts->add( 'heartbeat', "/wp-includes/js/heartbeat$suffix.js", array( 'jquery', 'wp-hooks' ), false, 1 ); + did_action( 'init' ) && $scripts->localize( + 'heartbeat', + 'heartbeatSettings', + /** + * Filters the Heartbeat settings. + * + * @since 3.6.0 + * + * @param array $settings Heartbeat settings array. + */ + apply_filters( 'heartbeat_settings', array() ) + ); + + $scripts->add( 'wp-auth-check', "/wp-includes/js/wp-auth-check$suffix.js", array( 'heartbeat' ), false, 1 ); + did_action( 'init' ) && $scripts->localize( + 'wp-auth-check', + 'authcheckL10n', + array( + 'beforeunload' => __( 'Your session has expired. You can log in again from this page or go to the login page.' ), + + /** + * Filters the authentication check interval. + * + * @since 3.6.0 + * + * @param int $interval The interval in which to check a user's authentication. + * Default 3 minutes in seconds, or 180. + */ + 'interval' => apply_filters( 'wp_auth_check_interval', 3 * MINUTE_IN_SECONDS ), + ) + ); + + $scripts->add( 'wp-lists', "/wp-includes/js/wp-lists$suffix.js", array( 'wp-ajax-response', 'jquery-color' ), false, 1 ); + + // WordPress no longer uses or bundles Prototype or script.aculo.us. These are now pulled from an external source. + $scripts->add( 'prototype', 'https://ajax.googleapis.com/ajax/libs/prototype/1.7.1.0/prototype.js', array(), '1.7.1' ); + $scripts->add( 'scriptaculous-root', 'https://ajax.googleapis.com/ajax/libs/scriptaculous/1.9.0/scriptaculous.js', array( 'prototype' ), '1.9.0' ); + $scripts->add( 'scriptaculous-builder', 'https://ajax.googleapis.com/ajax/libs/scriptaculous/1.9.0/builder.js', array( 'scriptaculous-r |
