diff --git a/bin/packages/watch.js b/bin/packages/watch.js
index d12d5410f2b7f..fce8a6beedb97 100644
--- a/bin/packages/watch.js
+++ b/bin/packages/watch.js
@@ -2,6 +2,7 @@
* External dependencies
*/
const fs = require( 'fs' );
+const watch = require( 'node-watch' );
const { execSync } = require( 'child_process' );
const path = require( 'path' );
const chalk = require( 'chalk' );
@@ -33,13 +34,13 @@ getPackages().forEach( ( p ) => {
const srcDir = path.resolve( p, 'src' );
try {
fs.accessSync( srcDir, fs.F_OK );
- fs.watch( path.resolve( p, 'src' ), { recursive: true }, ( event, filename ) => {
+ watch( path.resolve( p, 'src' ), { recursive: true }, ( event, filename ) => {
if ( ! isSourceFile( filename ) ) {
return;
}
const filePath = path.resolve( srcDir, filename );
- if ( ( event === 'change' || event === 'rename' ) && exists( filePath ) ) {
+ if ( ( event === 'update' ) && exists( filePath ) ) {
// eslint-disable-next-line no-console
console.log( chalk.green( '->' ), `${ event }: ${ filename }` );
rebuild( filePath );
diff --git a/bin/run-wp-unit-tests.sh b/bin/run-wp-unit-tests.sh
index 8c426abd233a1..8e1ee81db79e3 100755
--- a/bin/run-wp-unit-tests.sh
+++ b/bin/run-wp-unit-tests.sh
@@ -21,16 +21,6 @@ fi
npm run build || exit 1
-# Make sure phpegjs parser is up to date
-node bin/create-php-parser.js || exit 1
-if ! git diff --quiet --exit-code lib/parser.php; then
- echo 'ERROR: The PEG parser has been updated, but the generated PHP version'
- echo ' (lib/parser.php) has not. Run `bin/create-php-parser.js` and'
- echo ' commit the resulting changes to resolve this.'
- sleep .2 # Otherwise Travis doesn't want to print the whole message
- exit 1
-fi
-
echo Running with the following versions:
if [[ $DOCKER = "true" ]]; then
docker-compose $DOCKER_COMPOSE_FILE_OPTIONS run --rm wordpress_phpunit php -v
@@ -40,9 +30,6 @@ else
phpunit --version
fi
-# Check parser syntax
-php lib/parser.php || exit 1
-
# Run PHPUnit tests
if [[ $DOCKER = "true" ]]; then
npm run test-php || exit 1
diff --git a/docs/designers-developers/developers/backward-compatibility/deprecations.md b/docs/designers-developers/developers/backward-compatibility/deprecations.md
index fe1ca0b4a287e..03608d2634ff5 100644
--- a/docs/designers-developers/developers/backward-compatibility/deprecations.md
+++ b/docs/designers-developers/developers/backward-compatibility/deprecations.md
@@ -21,10 +21,22 @@ The Gutenberg project's deprecation policy is intended to support backward compa
- The PHP function `gutenberg_register_post_prepare_functions` has been removed.
- The PHP function `gutenberg_silence_rest_errors` has been removed.
- The PHP function `gutenberg_filter_post_type_labels` has been removed.
+- The PHP function `gutenberg_preload_api_request` has been removed. Use [`rest_preload_api_request`](https://developer.wordpress.org/reference/functions/rest_preload_api_request/) instead.
- The PHP function `gutenberg_remove_wpcom_markdown_support` has been removed.
- The PHP function `gutenberg_bulk_post_updated_messages` has been removed.
- The PHP function `gutenberg_kses_allowedtags` has been removed.
- The PHP function `gutenberg_add_responsive_body_class` has been removed.
+- The PHP function `gutenberg_add_edit_link_filters` has been removed.
+- The PHP function `gutenberg_add_edit_link` has been removed.
+- The PHP function `gutenberg_block_bulk_actions` has been removed.
+- The PHP function `gutenberg_replace_default_add_new_button` has been removed.
+- The PHP function `gutenberg_content_block_version` has been removed. Use [`block_version`](https://developer.wordpress.org/reference/functions/block_version/) instead.
+- The PHP function `gutenberg_get_block_categories` has been removed. Use [`get_block_categories`](https://developer.wordpress.org/reference/functions/get_block_categories/) instead.
+- The PHP function `register_tinymce_scripts` has been removed. Use [`wp_register_tinymce_scripts`](https://developer.wordpress.org/reference/functions/wp_register_tinymce_scripts/) instead.
+- The PHP function `gutenberg_register_post_types` has been removed.
+- The `gutenberg` theme support option has been removed. Use [`align-wide`](https://wordpress.org/gutenberg/handbook/designers-developers/developers/themes/theme-support/#wide-alignment) instead.
+- The PHP function `gutenberg_prepare_blocks_for_js` has been removed. Use [`get_block_editor_server_block_settings`](https://developer.wordpress.org/reference/functions/get_block_editor_server_block_settings/) instead.
+- The PHP function `gutenberg_load_list_reusable_blocks` has been removed.
## 4.5.0
- `Dropdown.refresh()` has been deprecated as the contained `Popover` is now automatically refreshed.
diff --git a/docs/designers-developers/developers/tutorials/block-tutorial/introducing-attributes-and-editable-fields.md b/docs/designers-developers/developers/tutorials/block-tutorial/introducing-attributes-and-editable-fields.md
index 3a993ce1c2b71..cd2b40e7d561e 100644
--- a/docs/designers-developers/developers/tutorials/block-tutorial/introducing-attributes-and-editable-fields.md
+++ b/docs/designers-developers/developers/tutorials/block-tutorial/introducing-attributes-and-editable-fields.md
@@ -120,6 +120,20 @@ Earlier examples used the `createElement` function to create DOM nodes, but it's
The `RichText` component can be considered as a super-powered `textarea` element, enabling rich content editing including bold, italics, hyperlinks, etc. It is not too much unlike the single editor region of the legacy post editor, and is in fact powered by the same TinyMCE library.
+To use the `RichText` component, add `wp-editor` to the array of registered script handles when calling `wp_register_script`.
+
+```php
+wp_register_script(
+ 'gutenberg-boilerplate-es5-step03',
+ plugins_url( 'step-03/block.js', __FILE__ ),
+ array(
+ 'wp-blocks',
+ 'wp-element',
+ 'wp-editor', // Note the addition of wp-editor to the dependencies
+ )
+);
+```
+
Implementing this behavior as a component enables you as the block implementer to be much more granular about editable fields. Your block may not need `RichText` at all, or it may need many independent `RichText` elements, each operating on a subset of the overall block state.
Because `RichText` allows for nested nodes, you'll most often use it in conjunction with the `html` attribute source when extracting the value from saved content. You'll also use `RichText.Content` in the `save` function to output RichText values.
diff --git a/gutenberg.php b/gutenberg.php
index 902e76675851b..09d759a64c488 100644
--- a/gutenberg.php
+++ b/gutenberg.php
@@ -263,84 +263,25 @@ function gutenberg_redirect_demo() {
* the post/page screens.
*
* @since 1.5.0
+ * @deprecated 5.0.0
*/
function gutenberg_add_edit_link_filters() {
- // For hierarchical post types.
- add_filter( 'page_row_actions', 'gutenberg_add_edit_link', 10, 2 );
- // For non-hierarchical post types.
- add_filter( 'post_row_actions', 'gutenberg_add_edit_link', 10, 2 );
+ _deprecated_function( __FUNCTION__, '5.0.0' );
}
-add_action( 'admin_init', 'gutenberg_add_edit_link_filters' );
/**
* Registers an additional link in the post/page screens to edit any post/page in
* the Classic editor.
*
* @since 1.5.0
+ * @deprecated 5.0.0
*
- * @param array $actions Post actions.
- * @param WP_Post $post Edited post.
+ * @param array $actions Post actions.
*
- * @return array Updated post actions.
+ * @return array Updated post actions.
*/
-function gutenberg_add_edit_link( $actions, $post ) {
- // Build the classic edit action. See also: WP_Posts_List_Table::handle_row_actions().
- $title = _draft_or_post_title( $post->ID );
-
- if ( 'wp_block' === $post->post_type ) {
- unset( $actions['inline hide-if-no-js'] );
-
- // Export uses block raw content, which is only returned from the post
- // REST endpoint via `context=edit`, requiring edit capability.
- $post_type = get_post_type_object( $post->post_type );
- if ( ! current_user_can( $post_type->cap->edit_post, $post->ID ) ) {
- return $actions;
- }
-
- $actions['export'] = sprintf(
- '',
- $post->ID,
- esc_attr(
- sprintf(
- /* translators: %s: post title */
- __( 'Export “%s” as JSON', 'gutenberg' ),
- $title
- )
- ),
- __( 'Export as JSON', 'gutenberg' )
- );
- return $actions;
- }
-
- if ( ! gutenberg_can_edit_post( $post ) ) {
- return $actions;
- }
-
- $edit_url = get_edit_post_link( $post->ID, 'raw' );
- $edit_url = add_query_arg( 'classic-editor', '', $edit_url );
-
- $edit_action = array(
- 'classic' => sprintf(
- '%s',
- esc_url( $edit_url ),
- esc_attr(
- sprintf(
- /* translators: %s: post title */
- __( 'Edit “%s” in the classic editor', 'gutenberg' ),
- $title
- )
- ),
- __( 'Classic Editor', 'gutenberg' )
- ),
- );
-
- // Insert the Classic Edit action after the Edit action.
- $edit_offset = array_search( 'edit', array_keys( $actions ), true );
- $actions = array_merge(
- array_slice( $actions, 0, $edit_offset + 1 ),
- $edit_action,
- array_slice( $actions, $edit_offset + 1 )
- );
+function gutenberg_add_edit_link( $actions ) {
+ _deprecated_function( __FUNCTION__, '5.0.0' );
return $actions;
}
@@ -349,162 +290,27 @@ function gutenberg_add_edit_link( $actions, $post ) {
* Removes the Edit action from the reusable block list's Bulk Actions dropdown.
*
* @since 3.8.0
+ * @deprecated 5.0.0
*
* @param array $actions Bulk actions.
*
* @return array Updated bulk actions.
*/
function gutenberg_block_bulk_actions( $actions ) {
- unset( $actions['edit'] );
+ _deprecated_function( __FUNCTION__, '5.0.0' );
+
return $actions;
}
-add_filter( 'bulk_actions-edit-wp_block', 'gutenberg_block_bulk_actions' );
/**
* Prints the JavaScript to replace the default "Add New" button.$_COOKIE
*
* @since 1.5.0
+ * @deprecated 5.0.0
*/
function gutenberg_replace_default_add_new_button() {
- global $typenow;
-
- if ( 'wp_block' === $typenow ) {
- ?>
-
-
-
-
- registered['wp-api-fetch'] ) ) {
+ $wp_scripts->registered['wp-api-fetch']->deps[] = 'wp-hooks';
+ }
wp_add_inline_script(
'wp-api-fetch',
sprintf(
- 'wp.apiFetch.use( wp.apiFetch.createNonceMiddleware( "%s" ) );',
+ implode(
+ "\n",
+ array(
+ '( function() {',
+ ' var nonceMiddleware = wp.apiFetch.createNonceMiddleware( "%s" );',
+ ' wp.apiFetch.use( nonceMiddleware );',
+ ' wp.hooks.addAction(',
+ ' "heartbeat.tick",',
+ ' "core/api-fetch/create-nonce-middleware",',
+ ' function( response ) {',
+ ' if ( response[ "rest_nonce" ] ) {',
+ ' nonceMiddleware.nonce = response[ "rest_nonce" ];',
+ ' }',
+ ' }',
+ ' )',
+ '} )()',
+ )
+ ),
( wp_installing() && ! is_multisite() ) ? '' : wp_create_nonce( 'wp_rest' )
),
'after'
@@ -510,68 +517,16 @@ function gutenberg_register_scripts_and_styles() {
* data to be attached to the page. Expected to be called in the context of
* `array_reduce`.
*
+ * @deprecated 5.0.0 rest_preload_api_request
+ *
* @param array $memo Reduce accumulator.
* @param string $path REST API path to preload.
* @return array Modified reduce accumulator.
*/
function gutenberg_preload_api_request( $memo, $path ) {
+ _deprecated_function( __FUNCTION__, '5.0.0', 'rest_preload_api_request' );
- // array_reduce() doesn't support passing an array in PHP 5.2
- // so we need to make sure we start with one.
- if ( ! is_array( $memo ) ) {
- $memo = array();
- }
-
- if ( empty( $path ) ) {
- return $memo;
- }
-
- $method = 'GET';
- if ( is_array( $path ) && 2 === count( $path ) ) {
- $method = end( $path );
- $path = reset( $path );
-
- if ( ! in_array( $method, array( 'GET', 'OPTIONS' ), true ) ) {
- $method = 'GET';
- }
- }
-
- $path_parts = parse_url( $path );
- if ( false === $path_parts ) {
- return $memo;
- }
-
- $request = new WP_REST_Request( $method, $path_parts['path'] );
- if ( ! empty( $path_parts['query'] ) ) {
- parse_str( $path_parts['query'], $query_params );
- $request->set_query_params( $query_params );
- }
-
- $response = rest_do_request( $request );
- if ( 200 === $response->status ) {
- $server = rest_get_server();
- $data = (array) $response->get_data();
- $links = $server->get_compact_response_links( $response );
- if ( ! empty( $links ) ) {
- $data['_links'] = $links;
- }
-
- if ( 'OPTIONS' === $method ) {
- $response = rest_send_allow_header( $response, $server, $request );
-
- $memo[ $method ][ $path ] = array(
- 'body' => $data,
- 'headers' => $response->headers,
- );
- } else {
- $memo[ $path ] = array(
- 'body' => $data,
- 'headers' => $response->headers,
- );
- }
- }
-
- return $memo;
+ return rest_preload_api_request( $memo, $path );
}
/**
@@ -747,28 +702,14 @@ function gutenberg_register_vendor_script( $handle, $src, $deps = array() ) {
* array of registered block data keyed by block name. Data includes properties
* of a block relevant for client registration.
*
+ * @deprecated 5.0.0 get_block_editor_server_block_settings
+ *
* @return array An associative array of registered block data.
*/
function gutenberg_prepare_blocks_for_js() {
- $block_registry = WP_Block_Type_Registry::get_instance();
- $blocks = array();
- $keys_to_pick = array( 'title', 'description', 'icon', 'category', 'keywords', 'supports', 'attributes' );
-
- foreach ( $block_registry->get_all_registered() as $block_name => $block_type ) {
- foreach ( $keys_to_pick as $key ) {
- if ( ! isset( $block_type->{ $key } ) ) {
- continue;
- }
-
- if ( ! isset( $blocks[ $block_name ] ) ) {
- $blocks[ $block_name ] = array();
- }
-
- $blocks[ $block_name ][ $key ] = $block_type->{ $key };
- }
- }
+ _deprecated_function( __FUNCTION__, '5.0.0', 'get_block_editor_server_block_settings' );
- return $blocks;
+ return get_block_editor_server_block_settings();
}
/**
@@ -920,45 +861,15 @@ function gutenberg_get_autosave_newer_than_post_save( $post ) {
* Returns all the block categories.
*
* @since 2.2.0
+ * @deprecated 5.0.0 get_block_categories
*
* @param WP_Post $post Post object.
* @return Object[] Block categories.
*/
function gutenberg_get_block_categories( $post ) {
- $default_categories = array(
- array(
- 'slug' => 'common',
- 'title' => __( 'Common Blocks', 'gutenberg' ),
- 'icon' => null,
- ),
- array(
- 'slug' => 'formatting',
- 'title' => __( 'Formatting', 'gutenberg' ),
- 'icon' => null,
- ),
- array(
- 'slug' => 'layout',
- 'title' => __( 'Layout Elements', 'gutenberg' ),
- 'icon' => null,
- ),
- array(
- 'slug' => 'widgets',
- 'title' => __( 'Widgets', 'gutenberg' ),
- 'icon' => null,
- ),
- array(
- 'slug' => 'embed',
- 'title' => __( 'Embeds', 'gutenberg' ),
- 'icon' => null,
- ),
- array(
- 'slug' => 'reusable',
- 'title' => __( 'Reusable Blocks', 'gutenberg' ),
- 'icon' => null,
- ),
- );
+ _deprecated_function( __FUNCTION__, '5.0.0', 'get_block_categories' );
- return apply_filters( 'block_categories', $default_categories, $post );
+ return get_block_categories( $post );
}
/**
@@ -1108,7 +1019,7 @@ function gutenberg_editor_scripts_and_styles( $hook ) {
$preload_data = array_reduce(
$preload_paths,
- 'gutenberg_preload_api_request',
+ 'rest_preload_api_request',
array()
);
@@ -1123,7 +1034,7 @@ function gutenberg_editor_scripts_and_styles( $hook ) {
wp_add_inline_script(
'wp-blocks',
- sprintf( 'wp.blocks.setCategories( %s );', wp_json_encode( gutenberg_get_block_categories( $post ) ) ),
+ sprintf( 'wp.blocks.setCategories( %s );', wp_json_encode( get_block_categories( $post ) ) ),
'after'
);
@@ -1156,7 +1067,7 @@ function gutenberg_editor_scripts_and_styles( $hook ) {
// Preload server-registered block schemas.
wp_add_inline_script(
'wp-blocks',
- 'wp.blocks.unstable__bootstrapServerSideBlockDefinitions(' . json_encode( gutenberg_prepare_blocks_for_js() ) . ');'
+ 'wp.blocks.unstable__bootstrapServerSideBlockDefinitions(' . json_encode( get_block_editor_server_block_settings() ) . ');'
);
// Get admin url for handling meta boxes.
@@ -1178,6 +1089,11 @@ function gutenberg_editor_scripts_and_styles( $hook ) {
$color_palette = current( (array) get_theme_support( 'editor-color-palette' ) );
$font_sizes = current( (array) get_theme_support( 'editor-font-sizes' ) );
+ if ( ! empty( $gutenberg_theme_support ) ) {
+ wp_enqueue_script( 'wp-deprecated' );
+ wp_add_inline_script( 'wp-deprecated', 'wp.deprecated( "`gutenberg` theme support", { plugin: "Gutenberg", version: "5.2", alternative: "`align-wide` theme support" } );' );
+ }
+
/**
* Filters the allowed block types for the editor, defaulting to true (all
* block types supported).
@@ -1409,14 +1325,8 @@ function gutenberg_editor_scripts_and_styles( $hook ) {
/**
* Enqueue the reusable blocks listing page's script
*
- * @param string $hook Screen name.
+ * @deprecated 5.0.0
*/
-function gutenberg_load_list_reusable_blocks( $hook ) {
- $is_reusable_blocks_list_page = 'edit.php' === $hook && isset( $_GET['post_type'] ) && 'wp_block' === $_GET['post_type'];
- if ( $is_reusable_blocks_list_page ) {
- gutenberg_load_locale_data();
- wp_enqueue_script( 'wp-list-reusable-blocks' );
- wp_enqueue_style( 'wp-list-reusable-blocks' );
- }
+function gutenberg_load_list_reusable_blocks() {
+ _deprecated_function( __FUNCTION__, '5.0.0' );
}
-add_action( 'admin_enqueue_scripts', 'gutenberg_load_list_reusable_blocks' );
diff --git a/lib/packages-dependencies.php b/lib/packages-dependencies.php
index ef1b2bc22cdb9..ece2a6ae2bb86 100644
--- a/lib/packages-dependencies.php
+++ b/lib/packages-dependencies.php
@@ -16,7 +16,6 @@
'wp-rich-text',
),
'wp-api-fetch' => array(
- 'wp-hooks',
'wp-i18n',
'wp-url',
),
diff --git a/lib/parser.php b/lib/parser.php
deleted file mode 100644
index 8fbcaa19bb458..0000000000000
--- a/lib/parser.php
+++ /dev/null
@@ -1,1681 +0,0 @@
-= $range[0] && $code <= $range[1]) {
- return true;
- }
- }
- return false;
- }
-}
-
-/* Syntax error exception */
-if (!class_exists("Gutenberg_PEG_SyntaxError", false)) {
- class Gutenberg_PEG_SyntaxError extends Exception {
- public $expected;
- public $found;
- public $grammarOffset;
- public $grammarLine;
- public $grammarColumn;
- public $name;
- public function __construct($message, $expected, $found, $offset, $line, $column) {
- parent::__construct($message, 0);
- $this->expected = $expected;
- $this->found = $found;
- $this->grammarOffset = $offset;
- $this->grammarLine = $line;
- $this->grammarColumn = $column;
- $this->name = "Gutenberg_PEG_SyntaxError";
- }
- }
-}
-
-class Gutenberg_PEG_Parser {
- private $peg_currPos = 0;
- private $peg_reportedPos = 0;
- private $peg_cachedPos = 0;
- private $peg_cachedPosDetails = array('line' => 1, 'column' => 1, 'seenCR' => false );
- private $peg_maxFailPos = 0;
- private $peg_maxFailExpected = array();
- private $peg_silentFails = 0;
- private $input = array();
- private $input_length = 0;
-
- private function cleanup_state() {
- $this->peg_currPos = 0;
- $this->peg_reportedPos = 0;
- $this->peg_cachedPos = 0;
- $this->peg_cachedPosDetails = array('line' => 1, 'column' => 1, 'seenCR' => false );
- $this->peg_maxFailPos = 0;
- $this->peg_maxFailExpected = array();
- $this->peg_silentFails = 0;
- $this->input = array();
- $this->input_length = 0;
-
- }
-
- private function input_substr($start, $length) {
- if ($length === 1 && $start < $this->input_length) {
- return $this->input[$start];
- }
- $substr = '';
- $max = min($start + $length, $this->input_length);
- for ($i = $start; $i < $max; $i++) {
- $substr .= $this->input[$i];
- }
- return $substr;
- }
-
-
- private function text() {
- return substr($this->input, $this->peg_reportedPos, $this->peg_reportedPos + $this->peg_currPos);
- }
-
- private function offset() {
- return $this->peg_reportedPos;
- }
-
- private function line() {
- $compute_pd = $this->peg_computePosDetails($this->peg_reportedPos);
- return $compute_pd["line"];
- }
-
- private function column() {
- $compute_pd = $this->peg_computePosDetails($this->peg_reportedPos);
- return $compute_pd["column"];
- }
-
- private function expected($description) {
- throw $this->peg_buildException(
- null,
- array(array("type" => "other", "description" => $description )),
- $this->peg_reportedPos
- );
- }
-
- private function error($message) {
- throw $this->peg_buildException($message, null, $this->peg_reportedPos);
- }
-
- private function peg_advancePos(&$details, $startPos, $endPos) {
- for ($p = $startPos; $p < $endPos; $p++) {
- $ch = $this->input_substr($p, 1);
- if ($ch === "\n") {
- if (!$details["seenCR"]) { $details["line"]++; }
- $details["column"] = 1;
- $details["seenCR"] = false;
- } else if ($ch === "\r" || $ch === "\u2028" || $ch === "\u2029") {
- $details["line"]++;
- $details["column"] = 1;
- $details["seenCR"] = true;
- } else {
- $details["column"]++;
- $details["seenCR"] = false;
- }
- }
- }
-
- private function peg_computePosDetails($pos) {
- if ($this->peg_cachedPos !== $pos) {
- if ($this->peg_cachedPos > $pos) {
- $this->peg_cachedPos = 0;
- $this->peg_cachedPosDetails = array( "line" => 1, "column" => 1, "seenCR" => false );
- }
- $this->peg_advancePos($this->peg_cachedPosDetails, $this->peg_cachedPos, $pos);
- $this->peg_cachedPos = $pos;
- }
-
- return $this->peg_cachedPosDetails;
- }
-
- private function peg_fail($expected) {
- if ($this->peg_currPos < $this->peg_maxFailPos) { return; }
-
- if ($this->peg_currPos > $this->peg_maxFailPos) {
- $this->peg_maxFailPos = $this->peg_currPos;
- $this->peg_maxFailExpected = array();
- }
-
- $this->peg_maxFailExpected[] = $expected;
- }
-
- private function peg_buildException_expectedComparator($a, $b) {
- if ($a["description"] < $b["description"]) {
- return -1;
- } else if ($a["description"] > $b["description"]) {
- return 1;
- } else {
- return 0;
- }
- }
-
- private function peg_buildException($message, $expected, $pos) {
- $posDetails = $this->peg_computePosDetails($pos);
- $found = $pos < $this->input_length ? $this->input[$pos] : null;
-
- if ($expected !== null) {
- usort($expected, array($this, "peg_buildException_expectedComparator"));
- $i = 1;
- while ($i < count($expected)) {
- if ($expected[$i - 1] === $expected[$i]) {
- array_splice($expected, $i, 1);
- } else {
- $i++;
- }
- }
- }
-
- if ($message === null) {
- $expectedDescs = array_fill(0, count($expected), null);
-
- for ($i = 0; $i < count($expected); $i++) {
- $expectedDescs[$i] = $expected[$i]["description"];
- }
-
- $expectedDesc = count($expected) > 1
- ? join(", ", array_slice($expectedDescs, 0, -1))
- . " or "
- . $expectedDescs[count($expected) - 1]
- : $expectedDescs[0];
-
- $foundDesc = $found ? json_encode($found) : "end of input";
-
- $message = "Expected " . $expectedDesc . " but " . $foundDesc . " found.";
- }
-
- return new Gutenberg_PEG_SyntaxError(
- $message,
- $expected,
- $found,
- $pos,
- $posDetails["line"],
- $posDetails["column"]
- );
- }
-
- private $peg_FAILED;
- private $peg_c0;
- private $peg_c1;
- private $peg_c2;
- private $peg_c3;
- private $peg_c4;
- private $peg_c5;
- private $peg_c6;
- private $peg_c7;
- private $peg_c8;
- private $peg_c9;
- private $peg_c10;
- private $peg_c11;
- private $peg_c12;
- private $peg_c13;
- private $peg_c14;
- private $peg_c15;
- private $peg_c16;
- private $peg_c17;
- private $peg_c18;
- private $peg_c19;
- private $peg_c20;
- private $peg_c21;
- private $peg_c22;
- private $peg_c23;
- private $peg_c24;
-
- private function peg_f0($pre, $b, $html) { return array( $b, $html ); }
- private function peg_f1($pre, $bs, $post) { return peg_join_blocks( $pre, $bs, $post ); }
- private function peg_f2($blockName, $a) { return $a; }
- private function peg_f3($blockName, $attrs) {
- return array(
- 'blockName' => $blockName,
- 'attrs' => empty( $attrs ) ? peg_empty_attrs() : $attrs,
- 'innerBlocks' => array(),
- 'innerHTML' => '',
- 'innerContent' => array(),
- );
- }
- private function peg_f4($s, $children, $e) {
- list( $innerHTML, $innerBlocks, $innerContent ) = peg_process_inner_content( $children );
-
- return array(
- 'blockName' => $s['blockName'],
- 'attrs' => empty( $s['attrs'] ) ? peg_empty_attrs() : $s['attrs'],
- 'innerBlocks' => $innerBlocks,
- 'innerHTML' => $innerHTML,
- 'innerContent' => $innerContent,
- );
- }
- private function peg_f5($blockName, $attrs) {
- return array(
- 'blockName' => $blockName,
- 'attrs' => isset( $attrs ) ? $attrs : array(),
- );
- }
- private function peg_f6($blockName) {
- return array(
- 'blockName' => $blockName,
- );
- }
- private function peg_f7($type) { return "core/$type"; }
- private function peg_f8($attrs) { return json_decode( $attrs, true ); }
-
- private function peg_parseBlock_List() {
-
- $s0 = $this->peg_currPos;
- $s1 = $this->peg_currPos;
- $s2 = array();
- $s3 = $this->peg_currPos;
- $s4 = $this->peg_currPos;
- $this->peg_silentFails++;
- $s5 = $this->peg_parseBlock();
- $this->peg_silentFails--;
- if ($s5 === $this->peg_FAILED) {
- $s4 = null;
- } else {
- $this->peg_currPos = $s4;
- $s4 = $this->peg_FAILED;
- }
- if ($s4 !== $this->peg_FAILED) {
- if ($this->input_length > $this->peg_currPos) {
- $s5 = $this->input_substr($this->peg_currPos, 1);
- $this->peg_currPos++;
- } else {
- $s5 = $this->peg_FAILED;
- if ($this->peg_silentFails === 0) {
- $this->peg_fail($this->peg_c0);
- }
- }
- if ($s5 !== $this->peg_FAILED) {
- $s4 = array($s4, $s5);
- $s3 = $s4;
- } else {
- $this->peg_currPos = $s3;
- $s3 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s3;
- $s3 = $this->peg_FAILED;
- }
- while ($s3 !== $this->peg_FAILED) {
- $s2[] = $s3;
- $s3 = $this->peg_currPos;
- $s4 = $this->peg_currPos;
- $this->peg_silentFails++;
- $s5 = $this->peg_parseBlock();
- $this->peg_silentFails--;
- if ($s5 === $this->peg_FAILED) {
- $s4 = null;
- } else {
- $this->peg_currPos = $s4;
- $s4 = $this->peg_FAILED;
- }
- if ($s4 !== $this->peg_FAILED) {
- if ($this->input_length > $this->peg_currPos) {
- $s5 = $this->input_substr($this->peg_currPos, 1);
- $this->peg_currPos++;
- } else {
- $s5 = $this->peg_FAILED;
- if ($this->peg_silentFails === 0) {
- $this->peg_fail($this->peg_c0);
- }
- }
- if ($s5 !== $this->peg_FAILED) {
- $s4 = array($s4, $s5);
- $s3 = $s4;
- } else {
- $this->peg_currPos = $s3;
- $s3 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s3;
- $s3 = $this->peg_FAILED;
- }
- }
- if ($s2 !== $this->peg_FAILED) {
- $s1 = $this->input_substr($s1, $this->peg_currPos - $s1);
- } else {
- $s1 = $s2;
- }
- if ($s1 !== $this->peg_FAILED) {
- $s2 = array();
- $s3 = $this->peg_currPos;
- $s4 = $this->peg_parseBlock();
- if ($s4 !== $this->peg_FAILED) {
- $s5 = $this->peg_currPos;
- $s6 = array();
- $s7 = $this->peg_currPos;
- $s8 = $this->peg_currPos;
- $this->peg_silentFails++;
- $s9 = $this->peg_parseBlock();
- $this->peg_silentFails--;
- if ($s9 === $this->peg_FAILED) {
- $s8 = null;
- } else {
- $this->peg_currPos = $s8;
- $s8 = $this->peg_FAILED;
- }
- if ($s8 !== $this->peg_FAILED) {
- if ($this->input_length > $this->peg_currPos) {
- $s9 = $this->input_substr($this->peg_currPos, 1);
- $this->peg_currPos++;
- } else {
- $s9 = $this->peg_FAILED;
- if ($this->peg_silentFails === 0) {
- $this->peg_fail($this->peg_c0);
- }
- }
- if ($s9 !== $this->peg_FAILED) {
- $s8 = array($s8, $s9);
- $s7 = $s8;
- } else {
- $this->peg_currPos = $s7;
- $s7 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s7;
- $s7 = $this->peg_FAILED;
- }
- while ($s7 !== $this->peg_FAILED) {
- $s6[] = $s7;
- $s7 = $this->peg_currPos;
- $s8 = $this->peg_currPos;
- $this->peg_silentFails++;
- $s9 = $this->peg_parseBlock();
- $this->peg_silentFails--;
- if ($s9 === $this->peg_FAILED) {
- $s8 = null;
- } else {
- $this->peg_currPos = $s8;
- $s8 = $this->peg_FAILED;
- }
- if ($s8 !== $this->peg_FAILED) {
- if ($this->input_length > $this->peg_currPos) {
- $s9 = $this->input_substr($this->peg_currPos, 1);
- $this->peg_currPos++;
- } else {
- $s9 = $this->peg_FAILED;
- if ($this->peg_silentFails === 0) {
- $this->peg_fail($this->peg_c0);
- }
- }
- if ($s9 !== $this->peg_FAILED) {
- $s8 = array($s8, $s9);
- $s7 = $s8;
- } else {
- $this->peg_currPos = $s7;
- $s7 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s7;
- $s7 = $this->peg_FAILED;
- }
- }
- if ($s6 !== $this->peg_FAILED) {
- $s5 = $this->input_substr($s5, $this->peg_currPos - $s5);
- } else {
- $s5 = $s6;
- }
- if ($s5 !== $this->peg_FAILED) {
- $this->peg_reportedPos = $s3;
- $s4 = $this->peg_f0($s1, $s4, $s5);
- $s3 = $s4;
- } else {
- $this->peg_currPos = $s3;
- $s3 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s3;
- $s3 = $this->peg_FAILED;
- }
- while ($s3 !== $this->peg_FAILED) {
- $s2[] = $s3;
- $s3 = $this->peg_currPos;
- $s4 = $this->peg_parseBlock();
- if ($s4 !== $this->peg_FAILED) {
- $s5 = $this->peg_currPos;
- $s6 = array();
- $s7 = $this->peg_currPos;
- $s8 = $this->peg_currPos;
- $this->peg_silentFails++;
- $s9 = $this->peg_parseBlock();
- $this->peg_silentFails--;
- if ($s9 === $this->peg_FAILED) {
- $s8 = null;
- } else {
- $this->peg_currPos = $s8;
- $s8 = $this->peg_FAILED;
- }
- if ($s8 !== $this->peg_FAILED) {
- if ($this->input_length > $this->peg_currPos) {
- $s9 = $this->input_substr($this->peg_currPos, 1);
- $this->peg_currPos++;
- } else {
- $s9 = $this->peg_FAILED;
- if ($this->peg_silentFails === 0) {
- $this->peg_fail($this->peg_c0);
- }
- }
- if ($s9 !== $this->peg_FAILED) {
- $s8 = array($s8, $s9);
- $s7 = $s8;
- } else {
- $this->peg_currPos = $s7;
- $s7 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s7;
- $s7 = $this->peg_FAILED;
- }
- while ($s7 !== $this->peg_FAILED) {
- $s6[] = $s7;
- $s7 = $this->peg_currPos;
- $s8 = $this->peg_currPos;
- $this->peg_silentFails++;
- $s9 = $this->peg_parseBlock();
- $this->peg_silentFails--;
- if ($s9 === $this->peg_FAILED) {
- $s8 = null;
- } else {
- $this->peg_currPos = $s8;
- $s8 = $this->peg_FAILED;
- }
- if ($s8 !== $this->peg_FAILED) {
- if ($this->input_length > $this->peg_currPos) {
- $s9 = $this->input_substr($this->peg_currPos, 1);
- $this->peg_currPos++;
- } else {
- $s9 = $this->peg_FAILED;
- if ($this->peg_silentFails === 0) {
- $this->peg_fail($this->peg_c0);
- }
- }
- if ($s9 !== $this->peg_FAILED) {
- $s8 = array($s8, $s9);
- $s7 = $s8;
- } else {
- $this->peg_currPos = $s7;
- $s7 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s7;
- $s7 = $this->peg_FAILED;
- }
- }
- if ($s6 !== $this->peg_FAILED) {
- $s5 = $this->input_substr($s5, $this->peg_currPos - $s5);
- } else {
- $s5 = $s6;
- }
- if ($s5 !== $this->peg_FAILED) {
- $this->peg_reportedPos = $s3;
- $s4 = $this->peg_f0($s1, $s4, $s5);
- $s3 = $s4;
- } else {
- $this->peg_currPos = $s3;
- $s3 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s3;
- $s3 = $this->peg_FAILED;
- }
- }
- if ($s2 !== $this->peg_FAILED) {
- $s3 = $this->peg_currPos;
- $s4 = array();
- if ($this->input_length > $this->peg_currPos) {
- $s5 = $this->input_substr($this->peg_currPos, 1);
- $this->peg_currPos++;
- } else {
- $s5 = $this->peg_FAILED;
- if ($this->peg_silentFails === 0) {
- $this->peg_fail($this->peg_c0);
- }
- }
- while ($s5 !== $this->peg_FAILED) {
- $s4[] = $s5;
- if ($this->input_length > $this->peg_currPos) {
- $s5 = $this->input_substr($this->peg_currPos, 1);
- $this->peg_currPos++;
- } else {
- $s5 = $this->peg_FAILED;
- if ($this->peg_silentFails === 0) {
- $this->peg_fail($this->peg_c0);
- }
- }
- }
- if ($s4 !== $this->peg_FAILED) {
- $s3 = $this->input_substr($s3, $this->peg_currPos - $s3);
- } else {
- $s3 = $s4;
- }
- if ($s3 !== $this->peg_FAILED) {
- $this->peg_reportedPos = $s0;
- $s1 = $this->peg_f1($s1, $s2, $s3);
- $s0 = $s1;
- } else {
- $this->peg_currPos = $s0;
- $s0 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s0;
- $s0 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s0;
- $s0 = $this->peg_FAILED;
- }
-
- return $s0;
- }
-
- private function peg_parseBlock() {
-
- $s0 = $this->peg_parseBlock_Void();
- if ($s0 === $this->peg_FAILED) {
- $s0 = $this->peg_parseBlock_Balanced();
- }
-
- return $s0;
- }
-
- private function peg_parseBlock_Void() {
-
- $s0 = $this->peg_currPos;
- if ($this->input_substr($this->peg_currPos, 4) === $this->peg_c1) {
- $s1 = $this->peg_c1;
- $this->peg_currPos += 4;
- } else {
- $s1 = $this->peg_FAILED;
- if ($this->peg_silentFails === 0) {
- $this->peg_fail($this->peg_c2);
- }
- }
- if ($s1 !== $this->peg_FAILED) {
- $s2 = $this->peg_parse__();
- if ($s2 !== $this->peg_FAILED) {
- if ($this->input_substr($this->peg_currPos, 3) === $this->peg_c3) {
- $s3 = $this->peg_c3;
- $this->peg_currPos += 3;
- } else {
- $s3 = $this->peg_FAILED;
- if ($this->peg_silentFails === 0) {
- $this->peg_fail($this->peg_c4);
- }
- }
- if ($s3 !== $this->peg_FAILED) {
- $s4 = $this->peg_parseBlock_Name();
- if ($s4 !== $this->peg_FAILED) {
- $s5 = $this->peg_parse__();
- if ($s5 !== $this->peg_FAILED) {
- $s6 = $this->peg_currPos;
- $s7 = $this->peg_parseBlock_Attributes();
- if ($s7 !== $this->peg_FAILED) {
- $s8 = $this->peg_parse__();
- if ($s8 !== $this->peg_FAILED) {
- $this->peg_reportedPos = $s6;
- $s7 = $this->peg_f2($s4, $s7);
- $s6 = $s7;
- } else {
- $this->peg_currPos = $s6;
- $s6 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s6;
- $s6 = $this->peg_FAILED;
- }
- if ($s6 === $this->peg_FAILED) {
- $s6 = null;
- }
- if ($s6 !== $this->peg_FAILED) {
- if ($this->input_substr($this->peg_currPos, 4) === $this->peg_c5) {
- $s7 = $this->peg_c5;
- $this->peg_currPos += 4;
- } else {
- $s7 = $this->peg_FAILED;
- if ($this->peg_silentFails === 0) {
- $this->peg_fail($this->peg_c6);
- }
- }
- if ($s7 !== $this->peg_FAILED) {
- $this->peg_reportedPos = $s0;
- $s1 = $this->peg_f3($s4, $s6);
- $s0 = $s1;
- } else {
- $this->peg_currPos = $s0;
- $s0 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s0;
- $s0 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s0;
- $s0 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s0;
- $s0 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s0;
- $s0 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s0;
- $s0 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s0;
- $s0 = $this->peg_FAILED;
- }
-
- return $s0;
- }
-
- private function peg_parseBlock_Balanced() {
-
- $s0 = $this->peg_currPos;
- $s1 = $this->peg_parseBlock_Start();
- if ($s1 !== $this->peg_FAILED) {
- $s2 = array();
- $s3 = $this->peg_parseBlock();
- if ($s3 === $this->peg_FAILED) {
- $s3 = $this->peg_currPos;
- $s4 = array();
- $s5 = $this->peg_currPos;
- $s6 = $this->peg_currPos;
- $this->peg_silentFails++;
- $s7 = $this->peg_parseBlock();
- $this->peg_silentFails--;
- if ($s7 === $this->peg_FAILED) {
- $s6 = null;
- } else {
- $this->peg_currPos = $s6;
- $s6 = $this->peg_FAILED;
- }
- if ($s6 !== $this->peg_FAILED) {
- $s7 = $this->peg_currPos;
- $this->peg_silentFails++;
- $s8 = $this->peg_parseBlock_End();
- $this->peg_silentFails--;
- if ($s8 === $this->peg_FAILED) {
- $s7 = null;
- } else {
- $this->peg_currPos = $s7;
- $s7 = $this->peg_FAILED;
- }
- if ($s7 !== $this->peg_FAILED) {
- if ($this->input_length > $this->peg_currPos) {
- $s8 = $this->input_substr($this->peg_currPos, 1);
- $this->peg_currPos++;
- } else {
- $s8 = $this->peg_FAILED;
- if ($this->peg_silentFails === 0) {
- $this->peg_fail($this->peg_c0);
- }
- }
- if ($s8 !== $this->peg_FAILED) {
- $s6 = array($s6, $s7, $s8);
- $s5 = $s6;
- } else {
- $this->peg_currPos = $s5;
- $s5 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s5;
- $s5 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s5;
- $s5 = $this->peg_FAILED;
- }
- if ($s5 !== $this->peg_FAILED) {
- while ($s5 !== $this->peg_FAILED) {
- $s4[] = $s5;
- $s5 = $this->peg_currPos;
- $s6 = $this->peg_currPos;
- $this->peg_silentFails++;
- $s7 = $this->peg_parseBlock();
- $this->peg_silentFails--;
- if ($s7 === $this->peg_FAILED) {
- $s6 = null;
- } else {
- $this->peg_currPos = $s6;
- $s6 = $this->peg_FAILED;
- }
- if ($s6 !== $this->peg_FAILED) {
- $s7 = $this->peg_currPos;
- $this->peg_silentFails++;
- $s8 = $this->peg_parseBlock_End();
- $this->peg_silentFails--;
- if ($s8 === $this->peg_FAILED) {
- $s7 = null;
- } else {
- $this->peg_currPos = $s7;
- $s7 = $this->peg_FAILED;
- }
- if ($s7 !== $this->peg_FAILED) {
- if ($this->input_length > $this->peg_currPos) {
- $s8 = $this->input_substr($this->peg_currPos, 1);
- $this->peg_currPos++;
- } else {
- $s8 = $this->peg_FAILED;
- if ($this->peg_silentFails === 0) {
- $this->peg_fail($this->peg_c0);
- }
- }
- if ($s8 !== $this->peg_FAILED) {
- $s6 = array($s6, $s7, $s8);
- $s5 = $s6;
- } else {
- $this->peg_currPos = $s5;
- $s5 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s5;
- $s5 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s5;
- $s5 = $this->peg_FAILED;
- }
- }
- } else {
- $s4 = $this->peg_FAILED;
- }
- if ($s4 !== $this->peg_FAILED) {
- $s3 = $this->input_substr($s3, $this->peg_currPos - $s3);
- } else {
- $s3 = $s4;
- }
- }
- while ($s3 !== $this->peg_FAILED) {
- $s2[] = $s3;
- $s3 = $this->peg_parseBlock();
- if ($s3 === $this->peg_FAILED) {
- $s3 = $this->peg_currPos;
- $s4 = array();
- $s5 = $this->peg_currPos;
- $s6 = $this->peg_currPos;
- $this->peg_silentFails++;
- $s7 = $this->peg_parseBlock();
- $this->peg_silentFails--;
- if ($s7 === $this->peg_FAILED) {
- $s6 = null;
- } else {
- $this->peg_currPos = $s6;
- $s6 = $this->peg_FAILED;
- }
- if ($s6 !== $this->peg_FAILED) {
- $s7 = $this->peg_currPos;
- $this->peg_silentFails++;
- $s8 = $this->peg_parseBlock_End();
- $this->peg_silentFails--;
- if ($s8 === $this->peg_FAILED) {
- $s7 = null;
- } else {
- $this->peg_currPos = $s7;
- $s7 = $this->peg_FAILED;
- }
- if ($s7 !== $this->peg_FAILED) {
- if ($this->input_length > $this->peg_currPos) {
- $s8 = $this->input_substr($this->peg_currPos, 1);
- $this->peg_currPos++;
- } else {
- $s8 = $this->peg_FAILED;
- if ($this->peg_silentFails === 0) {
- $this->peg_fail($this->peg_c0);
- }
- }
- if ($s8 !== $this->peg_FAILED) {
- $s6 = array($s6, $s7, $s8);
- $s5 = $s6;
- } else {
- $this->peg_currPos = $s5;
- $s5 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s5;
- $s5 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s5;
- $s5 = $this->peg_FAILED;
- }
- if ($s5 !== $this->peg_FAILED) {
- while ($s5 !== $this->peg_FAILED) {
- $s4[] = $s5;
- $s5 = $this->peg_currPos;
- $s6 = $this->peg_currPos;
- $this->peg_silentFails++;
- $s7 = $this->peg_parseBlock();
- $this->peg_silentFails--;
- if ($s7 === $this->peg_FAILED) {
- $s6 = null;
- } else {
- $this->peg_currPos = $s6;
- $s6 = $this->peg_FAILED;
- }
- if ($s6 !== $this->peg_FAILED) {
- $s7 = $this->peg_currPos;
- $this->peg_silentFails++;
- $s8 = $this->peg_parseBlock_End();
- $this->peg_silentFails--;
- if ($s8 === $this->peg_FAILED) {
- $s7 = null;
- } else {
- $this->peg_currPos = $s7;
- $s7 = $this->peg_FAILED;
- }
- if ($s7 !== $this->peg_FAILED) {
- if ($this->input_length > $this->peg_currPos) {
- $s8 = $this->input_substr($this->peg_currPos, 1);
- $this->peg_currPos++;
- } else {
- $s8 = $this->peg_FAILED;
- if ($this->peg_silentFails === 0) {
- $this->peg_fail($this->peg_c0);
- }
- }
- if ($s8 !== $this->peg_FAILED) {
- $s6 = array($s6, $s7, $s8);
- $s5 = $s6;
- } else {
- $this->peg_currPos = $s5;
- $s5 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s5;
- $s5 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s5;
- $s5 = $this->peg_FAILED;
- }
- }
- } else {
- $s4 = $this->peg_FAILED;
- }
- if ($s4 !== $this->peg_FAILED) {
- $s3 = $this->input_substr($s3, $this->peg_currPos - $s3);
- } else {
- $s3 = $s4;
- }
- }
- }
- if ($s2 !== $this->peg_FAILED) {
- $s3 = $this->peg_parseBlock_End();
- if ($s3 !== $this->peg_FAILED) {
- $this->peg_reportedPos = $s0;
- $s1 = $this->peg_f4($s1, $s2, $s3);
- $s0 = $s1;
- } else {
- $this->peg_currPos = $s0;
- $s0 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s0;
- $s0 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s0;
- $s0 = $this->peg_FAILED;
- }
-
- return $s0;
- }
-
- private function peg_parseBlock_Start() {
-
- $s0 = $this->peg_currPos;
- if ($this->input_substr($this->peg_currPos, 4) === $this->peg_c1) {
- $s1 = $this->peg_c1;
- $this->peg_currPos += 4;
- } else {
- $s1 = $this->peg_FAILED;
- if ($this->peg_silentFails === 0) {
- $this->peg_fail($this->peg_c2);
- }
- }
- if ($s1 !== $this->peg_FAILED) {
- $s2 = $this->peg_parse__();
- if ($s2 !== $this->peg_FAILED) {
- if ($this->input_substr($this->peg_currPos, 3) === $this->peg_c3) {
- $s3 = $this->peg_c3;
- $this->peg_currPos += 3;
- } else {
- $s3 = $this->peg_FAILED;
- if ($this->peg_silentFails === 0) {
- $this->peg_fail($this->peg_c4);
- }
- }
- if ($s3 !== $this->peg_FAILED) {
- $s4 = $this->peg_parseBlock_Name();
- if ($s4 !== $this->peg_FAILED) {
- $s5 = $this->peg_parse__();
- if ($s5 !== $this->peg_FAILED) {
- $s6 = $this->peg_currPos;
- $s7 = $this->peg_parseBlock_Attributes();
- if ($s7 !== $this->peg_FAILED) {
- $s8 = $this->peg_parse__();
- if ($s8 !== $this->peg_FAILED) {
- $this->peg_reportedPos = $s6;
- $s7 = $this->peg_f2($s4, $s7);
- $s6 = $s7;
- } else {
- $this->peg_currPos = $s6;
- $s6 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s6;
- $s6 = $this->peg_FAILED;
- }
- if ($s6 === $this->peg_FAILED) {
- $s6 = null;
- }
- if ($s6 !== $this->peg_FAILED) {
- if ($this->input_substr($this->peg_currPos, 3) === $this->peg_c7) {
- $s7 = $this->peg_c7;
- $this->peg_currPos += 3;
- } else {
- $s7 = $this->peg_FAILED;
- if ($this->peg_silentFails === 0) {
- $this->peg_fail($this->peg_c8);
- }
- }
- if ($s7 !== $this->peg_FAILED) {
- $this->peg_reportedPos = $s0;
- $s1 = $this->peg_f5($s4, $s6);
- $s0 = $s1;
- } else {
- $this->peg_currPos = $s0;
- $s0 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s0;
- $s0 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s0;
- $s0 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s0;
- $s0 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s0;
- $s0 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s0;
- $s0 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s0;
- $s0 = $this->peg_FAILED;
- }
-
- return $s0;
- }
-
- private function peg_parseBlock_End() {
-
- $s0 = $this->peg_currPos;
- if ($this->input_substr($this->peg_currPos, 4) === $this->peg_c1) {
- $s1 = $this->peg_c1;
- $this->peg_currPos += 4;
- } else {
- $s1 = $this->peg_FAILED;
- if ($this->peg_silentFails === 0) {
- $this->peg_fail($this->peg_c2);
- }
- }
- if ($s1 !== $this->peg_FAILED) {
- $s2 = $this->peg_parse__();
- if ($s2 !== $this->peg_FAILED) {
- if ($this->input_substr($this->peg_currPos, 4) === $this->peg_c9) {
- $s3 = $this->peg_c9;
- $this->peg_currPos += 4;
- } else {
- $s3 = $this->peg_FAILED;
- if ($this->peg_silentFails === 0) {
- $this->peg_fail($this->peg_c10);
- }
- }
- if ($s3 !== $this->peg_FAILED) {
- $s4 = $this->peg_parseBlock_Name();
- if ($s4 !== $this->peg_FAILED) {
- $s5 = $this->peg_parse__();
- if ($s5 !== $this->peg_FAILED) {
- if ($this->input_substr($this->peg_currPos, 3) === $this->peg_c7) {
- $s6 = $this->peg_c7;
- $this->peg_currPos += 3;
- } else {
- $s6 = $this->peg_FAILED;
- if ($this->peg_silentFails === 0) {
- $this->peg_fail($this->peg_c8);
- }
- }
- if ($s6 !== $this->peg_FAILED) {
- $this->peg_reportedPos = $s0;
- $s1 = $this->peg_f6($s4);
- $s0 = $s1;
- } else {
- $this->peg_currPos = $s0;
- $s0 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s0;
- $s0 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s0;
- $s0 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s0;
- $s0 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s0;
- $s0 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s0;
- $s0 = $this->peg_FAILED;
- }
-
- return $s0;
- }
-
- private function peg_parseBlock_Name() {
-
- $s0 = $this->peg_parseNamespaced_Block_Name();
- if ($s0 === $this->peg_FAILED) {
- $s0 = $this->peg_parseCore_Block_Name();
- }
-
- return $s0;
- }
-
- private function peg_parseNamespaced_Block_Name() {
-
- $s0 = $this->peg_currPos;
- $s1 = $this->peg_currPos;
- $s2 = $this->peg_parseBlock_Name_Part();
- if ($s2 !== $this->peg_FAILED) {
- if ($this->input_substr($this->peg_currPos, 1) === $this->peg_c11) {
- $s3 = $this->peg_c11;
- $this->peg_currPos++;
- } else {
- $s3 = $this->peg_FAILED;
- if ($this->peg_silentFails === 0) {
- $this->peg_fail($this->peg_c12);
- }
- }
- if ($s3 !== $this->peg_FAILED) {
- $s4 = $this->peg_parseBlock_Name_Part();
- if ($s4 !== $this->peg_FAILED) {
- $s2 = array($s2, $s3, $s4);
- $s1 = $s2;
- } else {
- $this->peg_currPos = $s1;
- $s1 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s1;
- $s1 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s1;
- $s1 = $this->peg_FAILED;
- }
- if ($s1 !== $this->peg_FAILED) {
- $s0 = $this->input_substr($s0, $this->peg_currPos - $s0);
- } else {
- $s0 = $s1;
- }
-
- return $s0;
- }
-
- private function peg_parseCore_Block_Name() {
-
- $s0 = $this->peg_currPos;
- $s1 = $this->peg_currPos;
- $s2 = $this->peg_parseBlock_Name_Part();
- if ($s2 !== $this->peg_FAILED) {
- $s1 = $this->input_substr($s1, $this->peg_currPos - $s1);
- } else {
- $s1 = $s2;
- }
- if ($s1 !== $this->peg_FAILED) {
- $this->peg_reportedPos = $s0;
- $s1 = $this->peg_f7($s1);
- }
- $s0 = $s1;
-
- return $s0;
- }
-
- private function peg_parseBlock_Name_Part() {
-
- $s0 = $this->peg_currPos;
- $s1 = $this->peg_currPos;
- if (Gutenberg_PEG_peg_char_class_test($this->peg_c13, $this->input_substr($this->peg_currPos, 1))) {
- $s2 = $this->input_substr($this->peg_currPos, 1);
- $this->peg_currPos++;
- } else {
- $s2 = $this->peg_FAILED;
- if ($this->peg_silentFails === 0) {
- $this->peg_fail($this->peg_c14);
- }
- }
- if ($s2 !== $this->peg_FAILED) {
- $s3 = array();
- if (Gutenberg_PEG_peg_char_class_test($this->peg_c15, $this->input_substr($this->peg_currPos, 1))) {
- $s4 = $this->input_substr($this->peg_currPos, 1);
- $this->peg_currPos++;
- } else {
- $s4 = $this->peg_FAILED;
- if ($this->peg_silentFails === 0) {
- $this->peg_fail($this->peg_c16);
- }
- }
- while ($s4 !== $this->peg_FAILED) {
- $s3[] = $s4;
- if (Gutenberg_PEG_peg_char_class_test($this->peg_c15, $this->input_substr($this->peg_currPos, 1))) {
- $s4 = $this->input_substr($this->peg_currPos, 1);
- $this->peg_currPos++;
- } else {
- $s4 = $this->peg_FAILED;
- if ($this->peg_silentFails === 0) {
- $this->peg_fail($this->peg_c16);
- }
- }
- }
- if ($s3 !== $this->peg_FAILED) {
- $s2 = array($s2, $s3);
- $s1 = $s2;
- } else {
- $this->peg_currPos = $s1;
- $s1 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s1;
- $s1 = $this->peg_FAILED;
- }
- if ($s1 !== $this->peg_FAILED) {
- $s0 = $this->input_substr($s0, $this->peg_currPos - $s0);
- } else {
- $s0 = $s1;
- }
-
- return $s0;
- }
-
- private function peg_parseBlock_Attributes() {
-
- $this->peg_silentFails++;
- $s0 = $this->peg_currPos;
- $s1 = $this->peg_currPos;
- $s2 = $this->peg_currPos;
- if ($this->input_substr($this->peg_currPos, 1) === $this->peg_c18) {
- $s3 = $this->peg_c18;
- $this->peg_currPos++;
- } else {
- $s3 = $this->peg_FAILED;
- if ($this->peg_silentFails === 0) {
- $this->peg_fail($this->peg_c19);
- }
- }
- if ($s3 !== $this->peg_FAILED) {
- $s4 = array();
- $s5 = $this->peg_currPos;
- $s6 = $this->peg_currPos;
- $this->peg_silentFails++;
- $s7 = $this->peg_currPos;
- if ($this->input_substr($this->peg_currPos, 1) === $this->peg_c20) {
- $s8 = $this->peg_c20;
- $this->peg_currPos++;
- } else {
- $s8 = $this->peg_FAILED;
- if ($this->peg_silentFails === 0) {
- $this->peg_fail($this->peg_c21);
- }
- }
- if ($s8 !== $this->peg_FAILED) {
- $s9 = $this->peg_parse__();
- if ($s9 !== $this->peg_FAILED) {
- $s10 = $this->peg_c22;
- if ($s10 !== $this->peg_FAILED) {
- if ($this->input_substr($this->peg_currPos, 1) === $this->peg_c11) {
- $s11 = $this->peg_c11;
- $this->peg_currPos++;
- } else {
- $s11 = $this->peg_FAILED;
- if ($this->peg_silentFails === 0) {
- $this->peg_fail($this->peg_c12);
- }
- }
- if ($s11 === $this->peg_FAILED) {
- $s11 = null;
- }
- if ($s11 !== $this->peg_FAILED) {
- if ($this->input_substr($this->peg_currPos, 3) === $this->peg_c7) {
- $s12 = $this->peg_c7;
- $this->peg_currPos += 3;
- } else {
- $s12 = $this->peg_FAILED;
- if ($this->peg_silentFails === 0) {
- $this->peg_fail($this->peg_c8);
- }
- }
- if ($s12 !== $this->peg_FAILED) {
- $s8 = array($s8, $s9, $s10, $s11, $s12);
- $s7 = $s8;
- } else {
- $this->peg_currPos = $s7;
- $s7 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s7;
- $s7 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s7;
- $s7 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s7;
- $s7 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s7;
- $s7 = $this->peg_FAILED;
- }
- $this->peg_silentFails--;
- if ($s7 === $this->peg_FAILED) {
- $s6 = null;
- } else {
- $this->peg_currPos = $s6;
- $s6 = $this->peg_FAILED;
- }
- if ($s6 !== $this->peg_FAILED) {
- if ($this->input_length > $this->peg_currPos) {
- $s7 = $this->input_substr($this->peg_currPos, 1);
- $this->peg_currPos++;
- } else {
- $s7 = $this->peg_FAILED;
- if ($this->peg_silentFails === 0) {
- $this->peg_fail($this->peg_c0);
- }
- }
- if ($s7 !== $this->peg_FAILED) {
- $s6 = array($s6, $s7);
- $s5 = $s6;
- } else {
- $this->peg_currPos = $s5;
- $s5 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s5;
- $s5 = $this->peg_FAILED;
- }
- while ($s5 !== $this->peg_FAILED) {
- $s4[] = $s5;
- $s5 = $this->peg_currPos;
- $s6 = $this->peg_currPos;
- $this->peg_silentFails++;
- $s7 = $this->peg_currPos;
- if ($this->input_substr($this->peg_currPos, 1) === $this->peg_c20) {
- $s8 = $this->peg_c20;
- $this->peg_currPos++;
- } else {
- $s8 = $this->peg_FAILED;
- if ($this->peg_silentFails === 0) {
- $this->peg_fail($this->peg_c21);
- }
- }
- if ($s8 !== $this->peg_FAILED) {
- $s9 = $this->peg_parse__();
- if ($s9 !== $this->peg_FAILED) {
- $s10 = $this->peg_c22;
- if ($s10 !== $this->peg_FAILED) {
- if ($this->input_substr($this->peg_currPos, 1) === $this->peg_c11) {
- $s11 = $this->peg_c11;
- $this->peg_currPos++;
- } else {
- $s11 = $this->peg_FAILED;
- if ($this->peg_silentFails === 0) {
- $this->peg_fail($this->peg_c12);
- }
- }
- if ($s11 === $this->peg_FAILED) {
- $s11 = null;
- }
- if ($s11 !== $this->peg_FAILED) {
- if ($this->input_substr($this->peg_currPos, 3) === $this->peg_c7) {
- $s12 = $this->peg_c7;
- $this->peg_currPos += 3;
- } else {
- $s12 = $this->peg_FAILED;
- if ($this->peg_silentFails === 0) {
- $this->peg_fail($this->peg_c8);
- }
- }
- if ($s12 !== $this->peg_FAILED) {
- $s8 = array($s8, $s9, $s10, $s11, $s12);
- $s7 = $s8;
- } else {
- $this->peg_currPos = $s7;
- $s7 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s7;
- $s7 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s7;
- $s7 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s7;
- $s7 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s7;
- $s7 = $this->peg_FAILED;
- }
- $this->peg_silentFails--;
- if ($s7 === $this->peg_FAILED) {
- $s6 = null;
- } else {
- $this->peg_currPos = $s6;
- $s6 = $this->peg_FAILED;
- }
- if ($s6 !== $this->peg_FAILED) {
- if ($this->input_length > $this->peg_currPos) {
- $s7 = $this->input_substr($this->peg_currPos, 1);
- $this->peg_currPos++;
- } else {
- $s7 = $this->peg_FAILED;
- if ($this->peg_silentFails === 0) {
- $this->peg_fail($this->peg_c0);
- }
- }
- if ($s7 !== $this->peg_FAILED) {
- $s6 = array($s6, $s7);
- $s5 = $s6;
- } else {
- $this->peg_currPos = $s5;
- $s5 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s5;
- $s5 = $this->peg_FAILED;
- }
- }
- if ($s4 !== $this->peg_FAILED) {
- if ($this->input_substr($this->peg_currPos, 1) === $this->peg_c20) {
- $s5 = $this->peg_c20;
- $this->peg_currPos++;
- } else {
- $s5 = $this->peg_FAILED;
- if ($this->peg_silentFails === 0) {
- $this->peg_fail($this->peg_c21);
- }
- }
- if ($s5 !== $this->peg_FAILED) {
- $s3 = array($s3, $s4, $s5);
- $s2 = $s3;
- } else {
- $this->peg_currPos = $s2;
- $s2 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s2;
- $s2 = $this->peg_FAILED;
- }
- } else {
- $this->peg_currPos = $s2;
- $s2 = $this->peg_FAILED;
- }
- if ($s2 !== $this->peg_FAILED) {
- $s1 = $this->input_substr($s1, $this->peg_currPos - $s1);
- } else {
- $s1 = $s2;
- }
- if ($s1 !== $this->peg_FAILED) {
- $this->peg_reportedPos = $s0;
- $s1 = $this->peg_f8($s1);
- }
- $s0 = $s1;
- $this->peg_silentFails--;
- if ($s0 === $this->peg_FAILED) {
- $s1 = $this->peg_FAILED;
- if ($this->peg_silentFails === 0) {
- $this->peg_fail($this->peg_c17);
- }
- }
-
- return $s0;
- }
-
- private function peg_parse__() {
-
- $s0 = array();
- if (Gutenberg_PEG_peg_char_class_test($this->peg_c23, $this->input_substr($this->peg_currPos, 1))) {
- $s1 = $this->input_substr($this->peg_currPos, 1);
- $this->peg_currPos++;
- } else {
- $s1 = $this->peg_FAILED;
- if ($this->peg_silentFails === 0) {
- $this->peg_fail($this->peg_c24);
- }
- }
- if ($s1 !== $this->peg_FAILED) {
- while ($s1 !== $this->peg_FAILED) {
- $s0[] = $s1;
- if (Gutenberg_PEG_peg_char_class_test($this->peg_c23, $this->input_substr($this->peg_currPos, 1))) {
- $s1 = $this->input_substr($this->peg_currPos, 1);
- $this->peg_currPos++;
- } else {
- $s1 = $this->peg_FAILED;
- if ($this->peg_silentFails === 0) {
- $this->peg_fail($this->peg_c24);
- }
- }
- }
- } else {
- $s0 = $this->peg_FAILED;
- }
-
- return $s0;
- }
-
- public function parse($input) {
- $arguments = func_get_args();
- $options = count($arguments) > 1 ? $arguments[1] : array();
- $this->cleanup_state();
-
- if (is_array($input)) {
- $this->input = $input;
- } else {
- preg_match_all("/./us", $input, $match);
- $this->input = $match[0];
- }
- $this->input_length = count($this->input);
-
- $this->peg_FAILED = new stdClass;
- $this->peg_c0 = array("type" => "any", "description" => "any character" );
- $this->peg_c1 = "";
- $this->peg_c6 = array( "type" => "literal", "value" => "/-->", "description" => "\"/-->\"" );
- $this->peg_c7 = "-->";
- $this->peg_c8 = array( "type" => "literal", "value" => "-->", "description" => "\"-->\"" );
- $this->peg_c9 = "/wp:";
- $this->peg_c10 = array( "type" => "literal", "value" => "/wp:", "description" => "\"/wp:\"" );
- $this->peg_c11 = "/";
- $this->peg_c12 = array( "type" => "literal", "value" => "/", "description" => "\"/\"" );
- $this->peg_c13 = array(array(97,122));
- $this->peg_c14 = array( "type" => "class", "value" => "[a-z]", "description" => "[a-z]" );
- $this->peg_c15 = array(array(97,122), array(48,57), array(95,95), array(45,45));
- $this->peg_c16 = array( "type" => "class", "value" => "[a-z0-9_-]", "description" => "[a-z0-9_-]" );
- $this->peg_c17 = array("type" => "other", "description" => "JSON-encoded attributes embedded in a block's opening comment" );
- $this->peg_c18 = "{";
- $this->peg_c19 = array( "type" => "literal", "value" => "{", "description" => "\"{\"" );
- $this->peg_c20 = "}";
- $this->peg_c21 = array( "type" => "literal", "value" => "}", "description" => "\"}\"" );
- $this->peg_c22 = "";
- $this->peg_c23 = array(array(32,32), array(9,9), array(13,13), array(10,10));
- $this->peg_c24 = array( "type" => "class", "value" => "[ \t\r\n]", "description" => "[ \t\r\n]" );
-
- $peg_startRuleFunctions = array( 'Block_List' => array($this, "peg_parseBlock_List") );
- $peg_startRuleFunction = array($this, "peg_parseBlock_List");
- if (isset($options["startRule"])) {
- if (!(isset($peg_startRuleFunctions[$options["startRule"]]))) {
- throw new Exception("Can't start parsing from rule \"" + $options["startRule"] + "\".");
- }
-
- $peg_startRuleFunction = $peg_startRuleFunctions[$options["startRule"]];
- }
-
- /* BEGIN initializer code */
-
- // The `maybeJSON` function is not needed in PHP because its return semantics
- // are the same as `json_decode`
-
- if ( ! function_exists( 'peg_empty_attrs' ) ) {
- function peg_empty_attrs() {
- static $empty_attrs = null;
-
- if ( null === $empty_attrs ) {
- $empty_attrs = json_decode( '{}', true );
- }
-
- return $empty_attrs;
- }
- }
-
- // array arguments are backwards because of PHP
- if ( ! function_exists( 'peg_process_inner_content' ) ) {
- function peg_process_inner_content( $array ) {
- $html = '';
- $blocks = array();
- $content = array();
-
- foreach ( $array as $item ) {
- if ( is_string( $item ) ) {
- $html .= $item;
- $content[] = $item;
- } else {
- $blocks[] = $item;
- $content[] = null;
- }
- }
-
- return array( $html, $blocks, $content );
- }
- }
-
- if ( ! function_exists( 'peg_join_blocks' ) ) {
- function peg_join_blocks( $pre, $tokens, $post ) {
- $blocks = array();
-
- if ( ! empty( $pre ) ) {
- $blocks[] = array(
- 'blockName' => null,
- 'attrs' => peg_empty_attrs(),
- 'innerBlocks' => array(),
- 'innerHTML' => $pre,
- 'innerContent' => array( $pre ),
- );
- }
-
- foreach ( $tokens as $token ) {
- list( $token, $html ) = $token;
-
- $blocks[] = $token;
-
- if ( ! empty( $html ) ) {
- $blocks[] = array(
- 'blockName' => null,
- 'attrs' => peg_empty_attrs(),
- 'innerBlocks' => array(),
- 'innerHTML' => $html,
- 'innerContent' => array( $html ),
- );
- }
- }
-
- if ( ! empty( $post ) ) {
- $blocks[] = array(
- 'blockName' => null,
- 'attrs' => peg_empty_attrs(),
- 'innerBlocks' => array(),
- 'innerHTML' => $post,
- 'innerContent' => array( $post ),
- );
- }
-
- return $blocks;
- }
- }
-
-
- /* END initializer code */
-
- $peg_result = call_user_func($peg_startRuleFunction);
-
- if ($peg_result !== $this->peg_FAILED && $this->peg_currPos === $this->input_length) {
- $this->cleanup_state(); // Free up memory
- return $peg_result;
- } else {
- if ($peg_result !== $this->peg_FAILED && $this->peg_currPos < $this->input_length) {
- $this->peg_fail(array("type" => "end", "description" => "end of input" ));
- }
-
- $exception = $this->peg_buildException(null, $this->peg_maxFailExpected, $this->peg_maxFailPos);
- $this->cleanup_state(); // Free up memory
- throw $exception;
- }
- }
-
-};
\ No newline at end of file
diff --git a/lib/register.php b/lib/register.php
index 3dc7264a9dfb0..0d6497ca6274c 100644
--- a/lib/register.php
+++ b/lib/register.php
@@ -310,32 +310,6 @@ function gutenberg_can_edit_post_type( $post_type ) {
return apply_filters( 'gutenberg_can_edit_post_type', $can_edit, $post_type );
}
-if ( ! function_exists( 'has_blocks' ) ) {
- /**
- * Determine whether a post or content string has blocks.
- *
- * This test optimizes for performance rather than strict accuracy, detecting
- * the pattern of a block but not validating its structure. For strict accuracy
- * you should use the block parser on post content.
- *
- * @since 3.6.0
- * @see gutenberg_parse_blocks()
- *
- * @param int|string|WP_Post|null $post Optional. Post content, post ID, or post object. Defaults to global $post.
- * @return bool Whether the post has blocks.
- */
- function has_blocks( $post = null ) {
- if ( ! is_string( $post ) ) {
- $wp_post = get_post( $post );
- if ( $wp_post instanceof WP_Post ) {
- $post = $wp_post->post_content;
- }
- }
-
- return false !== strpos( (string) $post, '",
- peg$c9 = peg$literalExpectation("/-->", false),
- peg$c10 = function(blockName, attrs) {
- /** $blockName,
- 'attrs' => empty( $attrs ) ? peg_empty_attrs() : $attrs,
- 'innerBlocks' => array(),
- 'innerHTML' => '',
- 'innerContent' => array(),
- );
- ?> **/
-
- return {
- blockName: blockName,
- attrs: attrs || {},
- innerBlocks: [],
- innerHTML: '',
- innerContent: []
- };
- },
- peg$c11 = function(s, children, e) {
- /** $s['blockName'],
- 'attrs' => empty( $s['attrs'] ) ? peg_empty_attrs() : $s['attrs'],
- 'innerBlocks' => $innerBlocks,
- 'innerHTML' => $innerHTML,
- 'innerContent' => $innerContent,
- );
- ?> **/
-
- var innerParts = processInnerContent( children );
- var innerHTML = innerParts[ 0 ];
- var innerBlocks = innerParts[ 1 ];
- var innerContent = innerParts[ 2 ];
-
- return {
- blockName: s.blockName,
- attrs: s.attrs,
- innerBlocks: innerBlocks,
- innerHTML: innerHTML,
- innerContent: innerContent,
- };
- },
- peg$c12 = "-->",
- peg$c13 = peg$literalExpectation("-->", false),
- peg$c14 = function(blockName, attrs) {
- /** $blockName,
- 'attrs' => isset( $attrs ) ? $attrs : array(),
- );
- ?> **/
-
- return {
- blockName: blockName,
- attrs: attrs || {}
- };
- },
- peg$c15 = "/wp:",
- peg$c16 = peg$literalExpectation("/wp:", false),
- peg$c17 = function(blockName) {
- /** $blockName,
- );
- ?> **/
-
- return {
- blockName: blockName
- };
- },
- peg$c18 = "/",
- peg$c19 = peg$literalExpectation("/", false),
- peg$c20 = function(type) {
- /** **/
- return 'core/' + type;
- },
- peg$c21 = /^[a-z]/,
- peg$c22 = peg$classExpectation([["a", "z"]], false, false),
- peg$c23 = /^[a-z0-9_\-]/,
- peg$c24 = peg$classExpectation([["a", "z"], ["0", "9"], "_", "-"], false, false),
- peg$c25 = peg$otherExpectation("JSON-encoded attributes embedded in a block's opening comment"),
- peg$c26 = "{",
- peg$c27 = peg$literalExpectation("{", false),
- peg$c28 = "}",
- peg$c29 = peg$literalExpectation("}", false),
- peg$c30 = "",
- peg$c31 = function(attrs) {
- /** **/
- return maybeJSON( attrs );
- },
- peg$c32 = /^[ \t\r\n]/,
- peg$c33 = peg$classExpectation([" ", "\t", "\r", "\n"], false, false),
-
- peg$currPos = 0,
- peg$savedPos = 0,
- peg$posDetailsCache = [{ line: 1, column: 1 }],
- peg$maxFailPos = 0,
- peg$maxFailExpected = [],
- peg$silentFails = 0,
-
- peg$result;
-
- if ("startRule" in options) {
- if (!(options.startRule in peg$startRuleFunctions)) {
- throw new Error("Can't start parsing from rule \"" + options.startRule + "\".");
- }
-
- peg$startRuleFunction = peg$startRuleFunctions[options.startRule];
- }
-
- function text() {
- return input.substring(peg$savedPos, peg$currPos);
- }
-
- function location() {
- return peg$computeLocation(peg$savedPos, peg$currPos);
- }
-
- function expected(description, location) {
- location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos)
-
- throw peg$buildStructuredError(
- [peg$otherExpectation(description)],
- input.substring(peg$savedPos, peg$currPos),
- location
- );
- }
-
- function error(message, location) {
- location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos)
-
- throw peg$buildSimpleError(message, location);
- }
-
- function peg$literalExpectation(text, ignoreCase) {
- return { type: "literal", text: text, ignoreCase: ignoreCase };
- }
-
- function peg$classExpectation(parts, inverted, ignoreCase) {
- return { type: "class", parts: parts, inverted: inverted, ignoreCase: ignoreCase };
- }
-
- function peg$anyExpectation() {
- return { type: "any" };
- }
-
- function peg$endExpectation() {
- return { type: "end" };
- }
-
- function peg$otherExpectation(description) {
- return { type: "other", description: description };
- }
-
- function peg$computePosDetails(pos) {
- var details = peg$posDetailsCache[pos], p;
-
- if (details) {
- return details;
- } else {
- p = pos - 1;
- while (!peg$posDetailsCache[p]) {
- p--;
- }
-
- details = peg$posDetailsCache[p];
- details = {
- line: details.line,
- column: details.column
- };
-
- while (p < pos) {
- if (input.charCodeAt(p) === 10) {
- details.line++;
- details.column = 1;
- } else {
- details.column++;
- }
-
- p++;
- }
-
- peg$posDetailsCache[pos] = details;
- return details;
- }
- }
-
- function peg$computeLocation(startPos, endPos) {
- var startPosDetails = peg$computePosDetails(startPos),
- endPosDetails = peg$computePosDetails(endPos);
-
- return {
- start: {
- offset: startPos,
- line: startPosDetails.line,
- column: startPosDetails.column
- },
- end: {
- offset: endPos,
- line: endPosDetails.line,
- column: endPosDetails.column
- }
- };
- }
-
- function peg$fail(expected) {
- if (peg$currPos < peg$maxFailPos) { return; }
-
- if (peg$currPos > peg$maxFailPos) {
- peg$maxFailPos = peg$currPos;
- peg$maxFailExpected = [];
- }
-
- peg$maxFailExpected.push(expected);
- }
-
- function peg$buildSimpleError(message, location) {
- return new peg$SyntaxError(message, null, null, location);
- }
-
- function peg$buildStructuredError(expected, found, location) {
- return new peg$SyntaxError(
- peg$SyntaxError.buildMessage(expected, found),
- expected,
- found,
- location
- );
- }
-
- function peg$parseBlock_List() {
- var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;
-
- s0 = peg$currPos;
- s1 = peg$currPos;
- s2 = [];
- s3 = peg$currPos;
- s4 = peg$currPos;
- peg$silentFails++;
- s5 = peg$parseBlock();
- peg$silentFails--;
- if (s5 === peg$FAILED) {
- s4 = void 0;
- } else {
- peg$currPos = s4;
- s4 = peg$FAILED;
- }
- if (s4 !== peg$FAILED) {
- if (input.length > peg$currPos) {
- s5 = input.charAt(peg$currPos);
- peg$currPos++;
- } else {
- s5 = peg$FAILED;
- if (peg$silentFails === 0) { peg$fail(peg$c0); }
- }
- if (s5 !== peg$FAILED) {
- s4 = [s4, s5];
- s3 = s4;
- } else {
- peg$currPos = s3;
- s3 = peg$FAILED;
- }
- } else {
- peg$currPos = s3;
- s3 = peg$FAILED;
- }
- while (s3 !== peg$FAILED) {
- s2.push(s3);
- s3 = peg$currPos;
- s4 = peg$currPos;
- peg$silentFails++;
- s5 = peg$parseBlock();
- peg$silentFails--;
- if (s5 === peg$FAILED) {
- s4 = void 0;
- } else {
- peg$currPos = s4;
- s4 = peg$FAILED;
- }
- if (s4 !== peg$FAILED) {
- if (input.length > peg$currPos) {
- s5 = input.charAt(peg$currPos);
- peg$currPos++;
- } else {
- s5 = peg$FAILED;
- if (peg$silentFails === 0) { peg$fail(peg$c0); }
- }
- if (s5 !== peg$FAILED) {
- s4 = [s4, s5];
- s3 = s4;
- } else {
- peg$currPos = s3;
- s3 = peg$FAILED;
- }
- } else {
- peg$currPos = s3;
- s3 = peg$FAILED;
- }
- }
- if (s2 !== peg$FAILED) {
- s1 = input.substring(s1, peg$currPos);
- } else {
- s1 = s2;
- }
- if (s1 !== peg$FAILED) {
- s2 = [];
- s3 = peg$currPos;
- s4 = peg$parseBlock();
- if (s4 !== peg$FAILED) {
- s5 = peg$currPos;
- s6 = [];
- s7 = peg$currPos;
- s8 = peg$currPos;
- peg$silentFails++;
- s9 = peg$parseBlock();
- peg$silentFails--;
- if (s9 === peg$FAILED) {
- s8 = void 0;
- } else {
- peg$currPos = s8;
- s8 = peg$FAILED;
- }
- if (s8 !== peg$FAILED) {
- if (input.length > peg$currPos) {
- s9 = input.charAt(peg$currPos);
- peg$currPos++;
- } else {
- s9 = peg$FAILED;
- if (peg$silentFails === 0) { peg$fail(peg$c0); }
- }
- if (s9 !== peg$FAILED) {
- s8 = [s8, s9];
- s7 = s8;
- } else {
- peg$currPos = s7;
- s7 = peg$FAILED;
- }
- } else {
- peg$currPos = s7;
- s7 = peg$FAILED;
- }
- while (s7 !== peg$FAILED) {
- s6.push(s7);
- s7 = peg$currPos;
- s8 = peg$currPos;
- peg$silentFails++;
- s9 = peg$parseBlock();
- peg$silentFails--;
- if (s9 === peg$FAILED) {
- s8 = void 0;
- } else {
- peg$currPos = s8;
- s8 = peg$FAILED;
- }
- if (s8 !== peg$FAILED) {
- if (input.length > peg$currPos) {
- s9 = input.charAt(peg$currPos);
- peg$currPos++;
- } else {
- s9 = peg$FAILED;
- if (peg$silentFails === 0) { peg$fail(peg$c0); }
- }
- if (s9 !== peg$FAILED) {
- s8 = [s8, s9];
- s7 = s8;
- } else {
- peg$currPos = s7;
- s7 = peg$FAILED;
- }
- } else {
- peg$currPos = s7;
- s7 = peg$FAILED;
- }
- }
- if (s6 !== peg$FAILED) {
- s5 = input.substring(s5, peg$currPos);
- } else {
- s5 = s6;
- }
- if (s5 !== peg$FAILED) {
- peg$savedPos = s3;
- s4 = peg$c1(s1, s4, s5);
- s3 = s4;
- } else {
- peg$currPos = s3;
- s3 = peg$FAILED;
- }
- } else {
- peg$currPos = s3;
- s3 = peg$FAILED;
- }
- while (s3 !== peg$FAILED) {
- s2.push(s3);
- s3 = peg$currPos;
- s4 = peg$parseBlock();
- if (s4 !== peg$FAILED) {
- s5 = peg$currPos;
- s6 = [];
- s7 = peg$currPos;
- s8 = peg$currPos;
- peg$silentFails++;
- s9 = peg$parseBlock();
- peg$silentFails--;
- if (s9 === peg$FAILED) {
- s8 = void 0;
- } else {
- peg$currPos = s8;
- s8 = peg$FAILED;
- }
- if (s8 !== peg$FAILED) {
- if (input.length > peg$currPos) {
- s9 = input.charAt(peg$currPos);
- peg$currPos++;
- } else {
- s9 = peg$FAILED;
- if (peg$silentFails === 0) { peg$fail(peg$c0); }
- }
- if (s9 !== peg$FAILED) {
- s8 = [s8, s9];
- s7 = s8;
- } else {
- peg$currPos = s7;
- s7 = peg$FAILED;
- }
- } else {
- peg$currPos = s7;
- s7 = peg$FAILED;
- }
- while (s7 !== peg$FAILED) {
- s6.push(s7);
- s7 = peg$currPos;
- s8 = peg$currPos;
- peg$silentFails++;
- s9 = peg$parseBlock();
- peg$silentFails--;
- if (s9 === peg$FAILED) {
- s8 = void 0;
- } else {
- peg$currPos = s8;
- s8 = peg$FAILED;
- }
- if (s8 !== peg$FAILED) {
- if (input.length > peg$currPos) {
- s9 = input.charAt(peg$currPos);
- peg$currPos++;
- } else {
- s9 = peg$FAILED;
- if (peg$silentFails === 0) { peg$fail(peg$c0); }
- }
- if (s9 !== peg$FAILED) {
- s8 = [s8, s9];
- s7 = s8;
- } else {
- peg$currPos = s7;
- s7 = peg$FAILED;
- }
- } else {
- peg$currPos = s7;
- s7 = peg$FAILED;
- }
- }
- if (s6 !== peg$FAILED) {
- s5 = input.substring(s5, peg$currPos);
- } else {
- s5 = s6;
- }
- if (s5 !== peg$FAILED) {
- peg$savedPos = s3;
- s4 = peg$c1(s1, s4, s5);
- s3 = s4;
- } else {
- peg$currPos = s3;
- s3 = peg$FAILED;
- }
- } else {
- peg$currPos = s3;
- s3 = peg$FAILED;
- }
- }
- if (s2 !== peg$FAILED) {
- s3 = peg$currPos;
- s4 = [];
- if (input.length > peg$currPos) {
- s5 = input.charAt(peg$currPos);
- peg$currPos++;
- } else {
- s5 = peg$FAILED;
- if (peg$silentFails === 0) { peg$fail(peg$c0); }
- }
- while (s5 !== peg$FAILED) {
- s4.push(s5);
- if (input.length > peg$currPos) {
- s5 = input.charAt(peg$currPos);
- peg$currPos++;
- } else {
- s5 = peg$FAILED;
- if (peg$silentFails === 0) { peg$fail(peg$c0); }
- }
- }
- if (s4 !== peg$FAILED) {
- s3 = input.substring(s3, peg$currPos);
- } else {
- s3 = s4;
- }
- if (s3 !== peg$FAILED) {
- peg$savedPos = s0;
- s1 = peg$c2(s1, s2, s3);
- s0 = s1;
- } else {
- peg$currPos = s0;
- s0 = peg$FAILED;
- }
- } else {
- peg$currPos = s0;
- s0 = peg$FAILED;
- }
- } else {
- peg$currPos = s0;
- s0 = peg$FAILED;
- }
-
- return s0;
- }
-
- function peg$parseBlock() {
- var s0;
-
- s0 = peg$parseBlock_Void();
- if (s0 === peg$FAILED) {
- s0 = peg$parseBlock_Balanced();
- }
-
- return s0;
- }
-
- function peg$parseBlock_Void() {
- var s0, s1, s2, s3, s4, s5, s6, s7, s8;
-
- s0 = peg$currPos;
- if (input.substr(peg$currPos, 4) === peg$c3) {
- s1 = peg$c3;
- peg$currPos += 4;
- } else {
- s1 = peg$FAILED;
- if (peg$silentFails === 0) { peg$fail(peg$c4); }
- }
- if (s1 !== peg$FAILED) {
- s2 = peg$parse__();
- if (s2 !== peg$FAILED) {
- if (input.substr(peg$currPos, 3) === peg$c5) {
- s3 = peg$c5;
- peg$currPos += 3;
- } else {
- s3 = peg$FAILED;
- if (peg$silentFails === 0) { peg$fail(peg$c6); }
- }
- if (s3 !== peg$FAILED) {
- s4 = peg$parseBlock_Name();
- if (s4 !== peg$FAILED) {
- s5 = peg$parse__();
- if (s5 !== peg$FAILED) {
- s6 = peg$currPos;
- s7 = peg$parseBlock_Attributes();
- if (s7 !== peg$FAILED) {
- s8 = peg$parse__();
- if (s8 !== peg$FAILED) {
- peg$savedPos = s6;
- s7 = peg$c7(s4, s7);
- s6 = s7;
- } else {
- peg$currPos = s6;
- s6 = peg$FAILED;
- }
- } else {
- peg$currPos = s6;
- s6 = peg$FAILED;
- }
- if (s6 === peg$FAILED) {
- s6 = null;
- }
- if (s6 !== peg$FAILED) {
- if (input.substr(peg$currPos, 4) === peg$c8) {
- s7 = peg$c8;
- peg$currPos += 4;
- } else {
- s7 = peg$FAILED;
- if (peg$silentFails === 0) { peg$fail(peg$c9); }
- }
- if (s7 !== peg$FAILED) {
- peg$savedPos = s0;
- s1 = peg$c10(s4, s6);
- s0 = s1;
- } else {
- peg$currPos = s0;
- s0 = peg$FAILED;
- }
- } else {
- peg$currPos = s0;
- s0 = peg$FAILED;
- }
- } else {
- peg$currPos = s0;
- s0 = peg$FAILED;
- }
- } else {
- peg$currPos = s0;
- s0 = peg$FAILED;
- }
- } else {
- peg$currPos = s0;
- s0 = peg$FAILED;
- }
- } else {
- peg$currPos = s0;
- s0 = peg$FAILED;
- }
- } else {
- peg$currPos = s0;
- s0 = peg$FAILED;
- }
-
- return s0;
- }
-
- function peg$parseBlock_Balanced() {
- var s0, s1, s2, s3, s4, s5, s6, s7, s8;
-
- s0 = peg$currPos;
- s1 = peg$parseBlock_Start();
- if (s1 !== peg$FAILED) {
- s2 = [];
- s3 = peg$parseBlock();
- if (s3 === peg$FAILED) {
- s3 = peg$currPos;
- s4 = [];
- s5 = peg$currPos;
- s6 = peg$currPos;
- peg$silentFails++;
- s7 = peg$parseBlock();
- peg$silentFails--;
- if (s7 === peg$FAILED) {
- s6 = void 0;
- } else {
- peg$currPos = s6;
- s6 = peg$FAILED;
- }
- if (s6 !== peg$FAILED) {
- s7 = peg$currPos;
- peg$silentFails++;
- s8 = peg$parseBlock_End();
- peg$silentFails--;
- if (s8 === peg$FAILED) {
- s7 = void 0;
- } else {
- peg$currPos = s7;
- s7 = peg$FAILED;
- }
- if (s7 !== peg$FAILED) {
- if (input.length > peg$currPos) {
- s8 = input.charAt(peg$currPos);
- peg$currPos++;
- } else {
- s8 = peg$FAILED;
- if (peg$silentFails === 0) { peg$fail(peg$c0); }
- }
- if (s8 !== peg$FAILED) {
- s6 = [s6, s7, s8];
- s5 = s6;
- } else {
- peg$currPos = s5;
- s5 = peg$FAILED;
- }
- } else {
- peg$currPos = s5;
- s5 = peg$FAILED;
- }
- } else {
- peg$currPos = s5;
- s5 = peg$FAILED;
- }
- if (s5 !== peg$FAILED) {
- while (s5 !== peg$FAILED) {
- s4.push(s5);
- s5 = peg$currPos;
- s6 = peg$currPos;
- peg$silentFails++;
- s7 = peg$parseBlock();
- peg$silentFails--;
- if (s7 === peg$FAILED) {
- s6 = void 0;
- } else {
- peg$currPos = s6;
- s6 = peg$FAILED;
- }
- if (s6 !== peg$FAILED) {
- s7 = peg$currPos;
- peg$silentFails++;
- s8 = peg$parseBlock_End();
- peg$silentFails--;
- if (s8 === peg$FAILED) {
- s7 = void 0;
- } else {
- peg$currPos = s7;
- s7 = peg$FAILED;
- }
- if (s7 !== peg$FAILED) {
- if (input.length > peg$currPos) {
- s8 = input.charAt(peg$currPos);
- peg$currPos++;
- } else {
- s8 = peg$FAILED;
- if (peg$silentFails === 0) { peg$fail(peg$c0); }
- }
- if (s8 !== peg$FAILED) {
- s6 = [s6, s7, s8];
- s5 = s6;
- } else {
- peg$currPos = s5;
- s5 = peg$FAILED;
- }
- } else {
- peg$currPos = s5;
- s5 = peg$FAILED;
- }
- } else {
- peg$currPos = s5;
- s5 = peg$FAILED;
- }
- }
- } else {
- s4 = peg$FAILED;
- }
- if (s4 !== peg$FAILED) {
- s3 = input.substring(s3, peg$currPos);
- } else {
- s3 = s4;
- }
- }
- while (s3 !== peg$FAILED) {
- s2.push(s3);
- s3 = peg$parseBlock();
- if (s3 === peg$FAILED) {
- s3 = peg$currPos;
- s4 = [];
- s5 = peg$currPos;
- s6 = peg$currPos;
- peg$silentFails++;
- s7 = peg$parseBlock();
- peg$silentFails--;
- if (s7 === peg$FAILED) {
- s6 = void 0;
- } else {
- peg$currPos = s6;
- s6 = peg$FAILED;
- }
- if (s6 !== peg$FAILED) {
- s7 = peg$currPos;
- peg$silentFails++;
- s8 = peg$parseBlock_End();
- peg$silentFails--;
- if (s8 === peg$FAILED) {
- s7 = void 0;
- } else {
- peg$currPos = s7;
- s7 = peg$FAILED;
- }
- if (s7 !== peg$FAILED) {
- if (input.length > peg$currPos) {
- s8 = input.charAt(peg$currPos);
- peg$currPos++;
- } else {
- s8 = peg$FAILED;
- if (peg$silentFails === 0) { peg$fail(peg$c0); }
- }
- if (s8 !== peg$FAILED) {
- s6 = [s6, s7, s8];
- s5 = s6;
- } else {
- peg$currPos = s5;
- s5 = peg$FAILED;
- }
- } else {
- peg$currPos = s5;
- s5 = peg$FAILED;
- }
- } else {
- peg$currPos = s5;
- s5 = peg$FAILED;
- }
- if (s5 !== peg$FAILED) {
- while (s5 !== peg$FAILED) {
- s4.push(s5);
- s5 = peg$currPos;
- s6 = peg$currPos;
- peg$silentFails++;
- s7 = peg$parseBlock();
- peg$silentFails--;
- if (s7 === peg$FAILED) {
- s6 = void 0;
- } else {
- peg$currPos = s6;
- s6 = peg$FAILED;
- }
- if (s6 !== peg$FAILED) {
- s7 = peg$currPos;
- peg$silentFails++;
- s8 = peg$parseBlock_End();
- peg$silentFails--;
- if (s8 === peg$FAILED) {
- s7 = void 0;
- } else {
- peg$currPos = s7;
- s7 = peg$FAILED;
- }
- if (s7 !== peg$FAILED) {
- if (input.length > peg$currPos) {
- s8 = input.charAt(peg$currPos);
- peg$currPos++;
- } else {
- s8 = peg$FAILED;
- if (peg$silentFails === 0) { peg$fail(peg$c0); }
- }
- if (s8 !== peg$FAILED) {
- s6 = [s6, s7, s8];
- s5 = s6;
- } else {
- peg$currPos = s5;
- s5 = peg$FAILED;
- }
- } else {
- peg$currPos = s5;
- s5 = peg$FAILED;
- }
- } else {
- peg$currPos = s5;
- s5 = peg$FAILED;
- }
- }
- } else {
- s4 = peg$FAILED;
- }
- if (s4 !== peg$FAILED) {
- s3 = input.substring(s3, peg$currPos);
- } else {
- s3 = s4;
- }
- }
- }
- if (s2 !== peg$FAILED) {
- s3 = peg$parseBlock_End();
- if (s3 !== peg$FAILED) {
- peg$savedPos = s0;
- s1 = peg$c11(s1, s2, s3);
- s0 = s1;
- } else {
- peg$currPos = s0;
- s0 = peg$FAILED;
- }
- } else {
- peg$currPos = s0;
- s0 = peg$FAILED;
- }
- } else {
- peg$currPos = s0;
- s0 = peg$FAILED;
- }
-
- return s0;
- }
-
- function peg$parseBlock_Start() {
- var s0, s1, s2, s3, s4, s5, s6, s7, s8;
-
- s0 = peg$currPos;
- if (input.substr(peg$currPos, 4) === peg$c3) {
- s1 = peg$c3;
- peg$currPos += 4;
- } else {
- s1 = peg$FAILED;
- if (peg$silentFails === 0) { peg$fail(peg$c4); }
- }
- if (s1 !== peg$FAILED) {
- s2 = peg$parse__();
- if (s2 !== peg$FAILED) {
- if (input.substr(peg$currPos, 3) === peg$c5) {
- s3 = peg$c5;
- peg$currPos += 3;
- } else {
- s3 = peg$FAILED;
- if (peg$silentFails === 0) { peg$fail(peg$c6); }
- }
- if (s3 !== peg$FAILED) {
- s4 = peg$parseBlock_Name();
- if (s4 !== peg$FAILED) {
- s5 = peg$parse__();
- if (s5 !== peg$FAILED) {
- s6 = peg$currPos;
- s7 = peg$parseBlock_Attributes();
- if (s7 !== peg$FAILED) {
- s8 = peg$parse__();
- if (s8 !== peg$FAILED) {
- peg$savedPos = s6;
- s7 = peg$c7(s4, s7);
- s6 = s7;
- } else {
- peg$currPos = s6;
- s6 = peg$FAILED;
- }
- } else {
- peg$currPos = s6;
- s6 = peg$FAILED;
- }
- if (s6 === peg$FAILED) {
- s6 = null;
- }
- if (s6 !== peg$FAILED) {
- if (input.substr(peg$currPos, 3) === peg$c12) {
- s7 = peg$c12;
- peg$currPos += 3;
- } else {
- s7 = peg$FAILED;
- if (peg$silentFails === 0) { peg$fail(peg$c13); }
- }
- if (s7 !== peg$FAILED) {
- peg$savedPos = s0;
- s1 = peg$c14(s4, s6);
- s0 = s1;
- } else {
- peg$currPos = s0;
- s0 = peg$FAILED;
- }
- } else {
- peg$currPos = s0;
- s0 = peg$FAILED;
- }
- } else {
- peg$currPos = s0;
- s0 = peg$FAILED;
- }
- } else {
- peg$currPos = s0;
- s0 = peg$FAILED;
- }
- } else {
- peg$currPos = s0;
- s0 = peg$FAILED;
- }
- } else {
- peg$currPos = s0;
- s0 = peg$FAILED;
- }
- } else {
- peg$currPos = s0;
- s0 = peg$FAILED;
- }
-
- return s0;
- }
-
- function peg$parseBlock_End() {
- var s0, s1, s2, s3, s4, s5, s6;
-
- s0 = peg$currPos;
- if (input.substr(peg$currPos, 4) === peg$c3) {
- s1 = peg$c3;
- peg$currPos += 4;
- } else {
- s1 = peg$FAILED;
- if (peg$silentFails === 0) { peg$fail(peg$c4); }
- }
- if (s1 !== peg$FAILED) {
- s2 = peg$parse__();
- if (s2 !== peg$FAILED) {
- if (input.substr(peg$currPos, 4) === peg$c15) {
- s3 = peg$c15;
- peg$currPos += 4;
- } else {
- s3 = peg$FAILED;
- if (peg$silentFails === 0) { peg$fail(peg$c16); }
- }
- if (s3 !== peg$FAILED) {
- s4 = peg$parseBlock_Name();
- if (s4 !== peg$FAILED) {
- s5 = peg$parse__();
- if (s5 !== peg$FAILED) {
- if (input.substr(peg$currPos, 3) === peg$c12) {
- s6 = peg$c12;
- peg$currPos += 3;
- } else {
- s6 = peg$FAILED;
- if (peg$silentFails === 0) { peg$fail(peg$c13); }
- }
- if (s6 !== peg$FAILED) {
- peg$savedPos = s0;
- s1 = peg$c17(s4);
- s0 = s1;
- } else {
- peg$currPos = s0;
- s0 = peg$FAILED;
- }
- } else {
- peg$currPos = s0;
- s0 = peg$FAILED;
- }
- } else {
- peg$currPos = s0;
- s0 = peg$FAILED;
- }
- } else {
- peg$currPos = s0;
- s0 = peg$FAILED;
- }
- } else {
- peg$currPos = s0;
- s0 = peg$FAILED;
- }
- } else {
- peg$currPos = s0;
- s0 = peg$FAILED;
- }
-
- return s0;
- }
-
- function peg$parseBlock_Name() {
- var s0;
-
- s0 = peg$parseNamespaced_Block_Name();
- if (s0 === peg$FAILED) {
- s0 = peg$parseCore_Block_Name();
- }
-
- return s0;
- }
-
- function peg$parseNamespaced_Block_Name() {
- var s0, s1, s2, s3, s4;
-
- s0 = peg$currPos;
- s1 = peg$currPos;
- s2 = peg$parseBlock_Name_Part();
- if (s2 !== peg$FAILED) {
- if (input.charCodeAt(peg$currPos) === 47) {
- s3 = peg$c18;
- peg$currPos++;
- } else {
- s3 = peg$FAILED;
- if (peg$silentFails === 0) { peg$fail(peg$c19); }
- }
- if (s3 !== peg$FAILED) {
- s4 = peg$parseBlock_Name_Part();
- if (s4 !== peg$FAILED) {
- s2 = [s2, s3, s4];
- s1 = s2;
- } else {
- peg$currPos = s1;
- s1 = peg$FAILED;
- }
- } else {
- peg$currPos = s1;
- s1 = peg$FAILED;
- }
- } else {
- peg$currPos = s1;
- s1 = peg$FAILED;
- }
- if (s1 !== peg$FAILED) {
- s0 = input.substring(s0, peg$currPos);
- } else {
- s0 = s1;
- }
-
- return s0;
- }
-
- function peg$parseCore_Block_Name() {
- var s0, s1, s2;
-
- s0 = peg$currPos;
- s1 = peg$currPos;
- s2 = peg$parseBlock_Name_Part();
- if (s2 !== peg$FAILED) {
- s1 = input.substring(s1, peg$currPos);
- } else {
- s1 = s2;
- }
- if (s1 !== peg$FAILED) {
- peg$savedPos = s0;
- s1 = peg$c20(s1);
- }
- s0 = s1;
-
- return s0;
- }
-
- function peg$parseBlock_Name_Part() {
- var s0, s1, s2, s3, s4;
-
- s0 = peg$currPos;
- s1 = peg$currPos;
- if (peg$c21.test(input.charAt(peg$currPos))) {
- s2 = input.charAt(peg$currPos);
- peg$currPos++;
- } else {
- s2 = peg$FAILED;
- if (peg$silentFails === 0) { peg$fail(peg$c22); }
- }
- if (s2 !== peg$FAILED) {
- s3 = [];
- if (peg$c23.test(input.charAt(peg$currPos))) {
- s4 = input.charAt(peg$currPos);
- peg$currPos++;
- } else {
- s4 = peg$FAILED;
- if (peg$silentFails === 0) { peg$fail(peg$c24); }
- }
- while (s4 !== peg$FAILED) {
- s3.push(s4);
- if (peg$c23.test(input.charAt(peg$currPos))) {
- s4 = input.charAt(peg$currPos);
- peg$currPos++;
- } else {
- s4 = peg$FAILED;
- if (peg$silentFails === 0) { peg$fail(peg$c24); }
- }
- }
- if (s3 !== peg$FAILED) {
- s2 = [s2, s3];
- s1 = s2;
- } else {
- peg$currPos = s1;
- s1 = peg$FAILED;
- }
- } else {
- peg$currPos = s1;
- s1 = peg$FAILED;
- }
- if (s1 !== peg$FAILED) {
- s0 = input.substring(s0, peg$currPos);
- } else {
- s0 = s1;
- }
-
- return s0;
- }
-
- function peg$parseBlock_Attributes() {
- var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12;
-
- peg$silentFails++;
- s0 = peg$currPos;
- s1 = peg$currPos;
- s2 = peg$currPos;
- if (input.charCodeAt(peg$currPos) === 123) {
- s3 = peg$c26;
- peg$currPos++;
- } else {
- s3 = peg$FAILED;
- if (peg$silentFails === 0) { peg$fail(peg$c27); }
- }
- if (s3 !== peg$FAILED) {
- s4 = [];
- s5 = peg$currPos;
- s6 = peg$currPos;
- peg$silentFails++;
- s7 = peg$currPos;
- if (input.charCodeAt(peg$currPos) === 125) {
- s8 = peg$c28;
- peg$currPos++;
- } else {
- s8 = peg$FAILED;
- if (peg$silentFails === 0) { peg$fail(peg$c29); }
- }
- if (s8 !== peg$FAILED) {
- s9 = peg$parse__();
- if (s9 !== peg$FAILED) {
- s10 = peg$c30;
- if (s10 !== peg$FAILED) {
- if (input.charCodeAt(peg$currPos) === 47) {
- s11 = peg$c18;
- peg$currPos++;
- } else {
- s11 = peg$FAILED;
- if (peg$silentFails === 0) { peg$fail(peg$c19); }
- }
- if (s11 === peg$FAILED) {
- s11 = null;
- }
- if (s11 !== peg$FAILED) {
- if (input.substr(peg$currPos, 3) === peg$c12) {
- s12 = peg$c12;
- peg$currPos += 3;
- } else {
- s12 = peg$FAILED;
- if (peg$silentFails === 0) { peg$fail(peg$c13); }
- }
- if (s12 !== peg$FAILED) {
- s8 = [s8, s9, s10, s11, s12];
- s7 = s8;
- } else {
- peg$currPos = s7;
- s7 = peg$FAILED;
- }
- } else {
- peg$currPos = s7;
- s7 = peg$FAILED;
- }
- } else {
- peg$currPos = s7;
- s7 = peg$FAILED;
- }
- } else {
- peg$currPos = s7;
- s7 = peg$FAILED;
- }
- } else {
- peg$currPos = s7;
- s7 = peg$FAILED;
- }
- peg$silentFails--;
- if (s7 === peg$FAILED) {
- s6 = void 0;
- } else {
- peg$currPos = s6;
- s6 = peg$FAILED;
- }
- if (s6 !== peg$FAILED) {
- if (input.length > peg$currPos) {
- s7 = input.charAt(peg$currPos);
- peg$currPos++;
- } else {
- s7 = peg$FAILED;
- if (peg$silentFails === 0) { peg$fail(peg$c0); }
- }
- if (s7 !== peg$FAILED) {
- s6 = [s6, s7];
- s5 = s6;
- } else {
- peg$currPos = s5;
- s5 = peg$FAILED;
- }
- } else {
- peg$currPos = s5;
- s5 = peg$FAILED;
- }
- while (s5 !== peg$FAILED) {
- s4.push(s5);
- s5 = peg$currPos;
- s6 = peg$currPos;
- peg$silentFails++;
- s7 = peg$currPos;
- if (input.charCodeAt(peg$currPos) === 125) {
- s8 = peg$c28;
- peg$currPos++;
- } else {
- s8 = peg$FAILED;
- if (peg$silentFails === 0) { peg$fail(peg$c29); }
- }
- if (s8 !== peg$FAILED) {
- s9 = peg$parse__();
- if (s9 !== peg$FAILED) {
- s10 = peg$c30;
- if (s10 !== peg$FAILED) {
- if (input.charCodeAt(peg$currPos) === 47) {
- s11 = peg$c18;
- peg$currPos++;
- } else {
- s11 = peg$FAILED;
- if (peg$silentFails === 0) { peg$fail(peg$c19); }
- }
- if (s11 === peg$FAILED) {
- s11 = null;
- }
- if (s11 !== peg$FAILED) {
- if (input.substr(peg$currPos, 3) === peg$c12) {
- s12 = peg$c12;
- peg$currPos += 3;
- } else {
- s12 = peg$FAILED;
- if (peg$silentFails === 0) { peg$fail(peg$c13); }
- }
- if (s12 !== peg$FAILED) {
- s8 = [s8, s9, s10, s11, s12];
- s7 = s8;
- } else {
- peg$currPos = s7;
- s7 = peg$FAILED;
- }
- } else {
- peg$currPos = s7;
- s7 = peg$FAILED;
- }
- } else {
- peg$currPos = s7;
- s7 = peg$FAILED;
- }
- } else {
- peg$currPos = s7;
- s7 = peg$FAILED;
- }
- } else {
- peg$currPos = s7;
- s7 = peg$FAILED;
- }
- peg$silentFails--;
- if (s7 === peg$FAILED) {
- s6 = void 0;
- } else {
- peg$currPos = s6;
- s6 = peg$FAILED;
- }
- if (s6 !== peg$FAILED) {
- if (input.length > peg$currPos) {
- s7 = input.charAt(peg$currPos);
- peg$currPos++;
- } else {
- s7 = peg$FAILED;
- if (peg$silentFails === 0) { peg$fail(peg$c0); }
- }
- if (s7 !== peg$FAILED) {
- s6 = [s6, s7];
- s5 = s6;
- } else {
- peg$currPos = s5;
- s5 = peg$FAILED;
- }
- } else {
- peg$currPos = s5;
- s5 = peg$FAILED;
- }
- }
- if (s4 !== peg$FAILED) {
- if (input.charCodeAt(peg$currPos) === 125) {
- s5 = peg$c28;
- peg$currPos++;
- } else {
- s5 = peg$FAILED;
- if (peg$silentFails === 0) { peg$fail(peg$c29); }
- }
- if (s5 !== peg$FAILED) {
- s3 = [s3, s4, s5];
- s2 = s3;
- } else {
- peg$currPos = s2;
- s2 = peg$FAILED;
- }
- } else {
- peg$currPos = s2;
- s2 = peg$FAILED;
- }
- } else {
- peg$currPos = s2;
- s2 = peg$FAILED;
- }
- if (s2 !== peg$FAILED) {
- s1 = input.substring(s1, peg$currPos);
- } else {
- s1 = s2;
- }
- if (s1 !== peg$FAILED) {
- peg$savedPos = s0;
- s1 = peg$c31(s1);
- }
- s0 = s1;
- peg$silentFails--;
- if (s0 === peg$FAILED) {
- s1 = peg$FAILED;
- if (peg$silentFails === 0) { peg$fail(peg$c25); }
- }
-
- return s0;
- }
-
- function peg$parse__() {
- var s0, s1;
-
- s0 = [];
- if (peg$c32.test(input.charAt(peg$currPos))) {
- s1 = input.charAt(peg$currPos);
- peg$currPos++;
- } else {
- s1 = peg$FAILED;
- if (peg$silentFails === 0) { peg$fail(peg$c33); }
- }
- if (s1 !== peg$FAILED) {
- while (s1 !== peg$FAILED) {
- s0.push(s1);
- if (peg$c32.test(input.charAt(peg$currPos))) {
- s1 = input.charAt(peg$currPos);
- peg$currPos++;
- } else {
- s1 = peg$FAILED;
- if (peg$silentFails === 0) { peg$fail(peg$c33); }
- }
- }
- } else {
- s0 = peg$FAILED;
- }
-
- return s0;
- }
-
-
-
- /*
- *
- * _____ _ _
- * / ____| | | | |
- * | | __ _ _| |_ ___ _ __ | |__ ___ _ __ __ _
- * | | |_ | | | | __/ _ \ '_ \| '_ \ / _ \ '__/ _` |
- * | |__| | |_| | || __/ | | | |_) | __/ | | (_| |
- * \_____|\__,_|\__\___|_| |_|_.__/ \___|_| \__, |
- * __/ |
- * GRAMMAR |___/
- *
- *
- * Welcome to the grammar file for Gutenberg posts!
- *
- * Please don't be distracted by the functions at the top
- * here - they're just helpers for the grammar below. We
- * try to keep them as minimal and simple as possible,
- * but the parser generator forces us to declare them at
- * the beginning of the file.
- *
- * What follows is the official specification grammar for
- * documents created or edited in Gutenberg. It starts at
- * the top-level rule `Block_List`
- *
- * The grammar is defined by a series of _rules_ and ways
- * to return matches on those rules. It's a _PEG_, a
- * parsing expression grammar, which simply means that for
- * each of our rules we have a set of sub-rules to match
- * on and the generated parser will try them in order
- * until it finds the first match.
- *
- * This grammar is a _specification_ (with as little actual
- * code as we can get away with) which is used by the
- * parser generator to generate the actual _parser_ which
- * is used by Gutenberg. We generate two parsers: one in
- * JavaScript for use the browser and one in PHP for
- * WordPress itself. PEG parser generators are available
- * in many languages, though different libraries may require
- * some translation of this grammar into their syntax.
- *
- * For more information:
- * @see https://pegjs.org
- * @see https://en.wikipedia.org/wiki/Parsing_expression_grammar
- *
- */
-
- /** null,
- 'attrs' => peg_empty_attrs(),
- 'innerBlocks' => array(),
- 'innerHTML' => $pre,
- 'innerContent' => array( $pre ),
- );
- }
-
- foreach ( $tokens as $token ) {
- list( $token, $html ) = $token;
-
- $blocks[] = $token;
-
- if ( ! empty( $html ) ) {
- $blocks[] = array(
- 'blockName' => null,
- 'attrs' => peg_empty_attrs(),
- 'innerBlocks' => array(),
- 'innerHTML' => $html,
- 'innerContent' => array( $html ),
- );
- }
- }
-
- if ( ! empty( $post ) ) {
- $blocks[] = array(
- 'blockName' => null,
- 'attrs' => peg_empty_attrs(),
- 'innerBlocks' => array(),
- 'innerHTML' => $post,
- 'innerContent' => array( $post ),
- );
- }
-
- return $blocks;
- }
- }
-
- ?> **/
-
- function freeform( s ) {
- return s.length && {
- blockName: null,
- attrs: {},
- innerBlocks: [],
- innerHTML: s,
- innerContent: [ s ],
- };
- }
-
- function joinBlocks( pre, tokens, post ) {
- var blocks = [], i, l, html, item, token;
-
- if ( pre.length ) {
- blocks.push( freeform( pre ) );
- }
-
- for ( i = 0, l = tokens.length; i < l; i++ ) {
- item = tokens[ i ];
- token = item[ 0 ];
- html = item[ 1 ];
-
- blocks.push( token );
- if ( html.length ) {
- blocks.push( freeform( html ) );
- }
- }
-
- if ( post.length ) {
- blocks.push( freeform( post ) );
- }
-
- return blocks;
- }
-
- function maybeJSON( s ) {
- try {
- return JSON.parse( s );
- } catch (e) {
- return null;
- }
- }
-
- function processInnerContent( list ) {
- var i, l, item;
- var html = '';
- var blocks = [];
- var content = [];
-
- // nod to performance over a simpler reduce
- // and clone model we could have taken here
- for ( i = 0, l = list.length; i < l; i++ ) {
- item = list[ i ];
-
- if ( 'string' === typeof item ) {
- html += item;
- content.push( item );
- } else {
- blocks.push( item );
- content.push( null );
- }
- };
-
- return [ html, blocks, content ];
- }
-
-
-
- peg$result = peg$startRuleFunction();
-
- if (peg$result !== peg$FAILED && peg$currPos === input.length) {
- return peg$result;
- } else {
- if (peg$result !== peg$FAILED && peg$currPos < input.length) {
- peg$fail(peg$endExpectation());
- }
-
- throw peg$buildStructuredError(
- peg$maxFailExpected,
- peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,
- peg$maxFailPos < input.length
- ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)
- : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)
- );
- }
- }
-
- return {
- SyntaxError: peg$SyntaxError,
- parse: peg$parse
- };
-});
diff --git a/packages/block-serialization-spec-parser/test/test-parser.php b/packages/block-serialization-spec-parser/test/test-parser.php
index 28c523951c343..a55183c44b8e5 100644
--- a/packages/block-serialization-spec-parser/test/test-parser.php
+++ b/packages/block-serialization-spec-parser/test/test-parser.php
@@ -8,7 +8,7 @@
*/
// Include the generated parser.
-require_once dirname( __FILE__ ) . '/../../../lib/parser.php';
+require_once dirname( __FILE__ ) . '/../parser.php';
$parser = new Gutenberg_PEG_Parser();
diff --git a/packages/components/CHANGELOG.md b/packages/components/CHANGELOG.md
index 1ec2b397bcea6..427e5aa90759a 100644
--- a/packages/components/CHANGELOG.md
+++ b/packages/components/CHANGELOG.md
@@ -12,6 +12,7 @@
### New Feature
- `Dropdown` now has a `focusOnMount` prop which is passed directly to the contained `Popover`.
+- `DatePicker` has new prop `isInvalidDate` exposing react-dates' `isOutsideRange`.
## 7.0.5 (2019-01-03)
diff --git a/packages/components/src/date-time/README.md b/packages/components/src/date-time/README.md
index c70c8199952b3..1366be8312635 100644
--- a/packages/components/src/date-time/README.md
+++ b/packages/components/src/date-time/README.md
@@ -60,3 +60,10 @@ Whether we use a 12-hour clock. With a 12-hour clock, an AM/PM widget is display
- Type: `bool`
- Required: No
+
+### isInvalidDate
+
+A callback function which receives a Date object representing a day as an argument, and should return a Boolean to signify if the day is valid or not.
+
+- Type: `Function`
+- Required: No
diff --git a/packages/components/src/date-time/date.js b/packages/components/src/date-time/date.js
index 7da1bf4f41823..92be3a3970a90 100644
--- a/packages/components/src/date-time/date.js
+++ b/packages/components/src/date-time/date.js
@@ -36,7 +36,7 @@ class DatePicker extends Component {
}
render() {
- const { currentDate } = this.props;
+ const { currentDate, isInvalidDate } = this.props;
const momentDate = currentDate ? moment( currentDate ) : moment();
@@ -56,6 +56,9 @@ class DatePicker extends Component {
transitionDuration={ 0 }
weekDayFormat="ddd"
isRTL={ isRTL() }
+ isOutsideRange={ ( date ) => {
+ return isInvalidDate && isInvalidDate( date.toDate() );
+ } }
/>
);
diff --git a/packages/components/src/range-control/README.md b/packages/components/src/range-control/README.md
index b35557b867a07..28fcae0c82c95 100644
--- a/packages/components/src/range-control/README.md
+++ b/packages/components/src/range-control/README.md
@@ -1,17 +1,101 @@
# RangeControl
-RangeControl component is used to create range slider to input numerical values.
+RangeControls are used to make selections from a range of incremental values.
+![](https://make.wordpress.org/design/files/2018/12/rangecontrol.png)
-## Usage
+A RangeControl for volume
+
+## Table of contents
+
+1. [Design guidelines](#design-guidelines)
+2. [Development guidelines](#development-guidelines)
+3. [Related components](#related-components)
+
+## Design guidelines
+
+### Anatomy
+
+![](https://make.wordpress.org/design/files/2018/12/rangecontrol-anatomy.png)
+
+A RangeControl can contain the following elements:
+
+1. **Track**: The track shows the range available for user selection. For left-to-right (LTR) languages, the smallest value appears on the far left, and the largest value on the far right. For right-to-left (RTL) languages this orientation is reversed, with the smallest value on the far right and the largest value on the far left.
+2. **Thumb**: The thumb slides along the track, displaying the selected value through its position.
+3. **Value entry field** (optional): The value entry field displays the currently selected, specific numerical value.
+4. **Icon** (optional): An icon can be displayed before or after the slider.
+5. **Tick mark** (optional): Tick marks represent predetermined values to which the user can move the slider.
+
+### Types
+
+#### Continuous sliders
+
+Continuous sliders allow users to select a value along a subjective range. They do not display the selected numeric value. Use them when displaying/editing the numeric value is not important, like volume.
+
+#### Discrete sliders
+
+Discrete sliders can be adjusted to a specific value by referencing its value entry field. Use them when it’s important to display/edit the numeric value, like text size.
+
+Possible selections may be organized through the use of tick marks, which a thumb will snap to (or to which an input will round up or down).
+
+### Behavior
+
+- **Click and drag**: The slider is controlled by clicking the thumb and dragging it.
+- **Click jump**: The slider is controlled by clicking the track.
+- **Click and arrow**: The slider is controlled by clicking the thumb, then using arrow keys to move it.
+- **Tab and arrow**: The slider is controlled by using the tab key to select the thumb of the desired slider, then using arrow keys to move it.
+- **Tick marks** (Optional) Discrete sliders can use evenly spaced tick marks along the slider track, and the thumb will snap to them. Each tick mark should change the setting in increments that are discernible to the user.
+- **Value entry field** (Optional): Discrete sliders have value entry fields. After a text entry is made, the slider position automatically updates to reflect the new value.
+
+### Usage
+
+RangeControls reflect a range of values along a track, from which users may select a single value. They are ideal for adjusting settings such as volume, opacity, or text size.
+
+RangeControls can have icons on both ends of the track that reflect a range of values.
+
+#### Immediate effects
+
+Changes made with RangeControls are immediate, allowing a user to make adjustments until finding their preference. They shouldn’t be paired with settings that have delays in providing feedback.
+
+![A RangeControl that requires a save action](https://make.wordpress.org/design/files/2018/12/rangecontrol-save-action.png)
+
+**Don’t**
+Don’t use RangeControls if the effect isn’t immediate.
+
+#### Current state
+
+RangeControls reflect the current state of the settings they control.
+
+#### Values
+
+![](https://make.wordpress.org/design/files/2018/12/rangecontrol-field.png)
+
+A RangeControl with an editable numeric value
+
+**Editable numeric values**: Editable numeric values allow users to set the exact value of a RangeControl. After setting a value, the thumb position is immediately updated to match the new value.
+
+![A RangeControl with only two values](https://make.wordpress.org/design/files/2018/12/rangecontrol-2-values.png)
+
+**Don’t**
+RangeControls should only be used for choosing selections from a range of values (e.g., don’t use a RangeControl if there are only 2 values).
+
+![](https://make.wordpress.org/design/files/2018/12/rangecontrol-disabled.png)
+
+**Don’t**
+RangeControls should provide the full range of choices available for the user to select from (e.g., don’t disable only part of a RangeControl).
+
+## Development guidelines
+
+### Usage
+
+Render a RangeControl to make a selection from a range of incremental values.
-Render a user interface to select the number of columns between 2 and 10.
```jsx
import { RangeControl } from '@wordpress/components';
import { withState } from '@wordpress/compose';
const MyRangeControl = withState( {
- columns: 2,
+ columns: 2,
} )( ( { columns, setState } ) => (
x
+ => f( g( x ) );
+```
+
+Here's a simplified example of **compose** in use from Gutenberg's [`PluginSidebar` component](https://github.com/WordPress/gutenberg/blob/master/packages/edit-post/src/components/sidebar/plugin-sidebar/index.js):
+
+Using compose:
+
+```js
+const applyWithSelect = withSelect( ( select, ownProps ) => {
+ return doSomething( select, ownProps);
+} );
+const applyWithDispatch = withDispatch( ( dispatch, ownProps ) => {
+ return doSomethingElse( dispatch, ownProps );
+} );
+
+export default compose(
+ withPluginContext,
+ applyWithSelect,
+ applyWithDispatch,
+)( PluginSidebarMoreMenuItem );
+```
+
+Without `compose`, the code would look like this:
+
+```js
+const applyWithSelect = withSelect( ( select, ownProps ) => {
+ return doSomething( select, ownProps);
+} );
+const applyWithDispatch = withDispatch( ( dispatch, ownProps ) => {
+ return doSomethingElse( dispatch, ownProps );
+} );
+
+export default withPluginContext(
+ applyWithSelect(
+ applyWithDispatch(
+ PluginSidebarMoreMenuItem
+ )
+ )
+);
+
+
## Installation
Install the module
@@ -14,6 +61,8 @@ _This package assumes that your code will run in an **ES2015+** environment. If
## Usage
+An example using the HOC `withInstanceId` from the compose package:
+
```js
import { withInstanceId } from '@wordpress/compose';
@@ -24,6 +73,6 @@ function WrappedComponent( props ) {
const ComponentWithInstanceIdProp = withInstanceId( WrappedComponent );
```
-Refer to each Higher Order Component's README file for more details.
+For more details, you can refer to each Higher Order Component's README file. [Available components are located here.](https://github.com/WordPress/gutenberg/tree/master/packages/compose/src)
diff --git a/packages/edit-post/src/components/header/fullscreen-mode-close/index.js b/packages/edit-post/src/components/header/fullscreen-mode-close/index.js
index 00aa63134d1b7..2cbde749470f6 100644
--- a/packages/edit-post/src/components/header/fullscreen-mode-close/index.js
+++ b/packages/edit-post/src/components/header/fullscreen-mode-close/index.js
@@ -19,12 +19,12 @@ function FullscreenModeClose( { isActive, postType } ) {
return (
diff --git a/packages/editor/CHANGELOG.md b/packages/editor/CHANGELOG.md
index e4cc87f80faa4..30e57fd4f033f 100644
--- a/packages/editor/CHANGELOG.md
+++ b/packages/editor/CHANGELOG.md
@@ -4,6 +4,10 @@
- Added `createCustomColorsHOC` for creating a higher order `withCustomColors` component.
+### Bug Fixes
+
+- BlockSwitcher will now consistently render an icon for block multi-selections.
+
### Internal
- Removed `jQuery` dependency
diff --git a/packages/editor/src/components/block-switcher/index.js b/packages/editor/src/components/block-switcher/index.js
index adc4bf4efc142..3bd61ff38e210 100644
--- a/packages/editor/src/components/block-switcher/index.js
+++ b/packages/editor/src/components/block-switcher/index.js
@@ -1,7 +1,7 @@
/**
* External dependencies
*/
-import { castArray, filter, first, mapKeys, orderBy } from 'lodash';
+import { castArray, filter, first, mapKeys, orderBy, uniq, map } from 'lodash';
/**
* WordPress dependencies
@@ -53,13 +53,20 @@ export class BlockSwitcher extends Component {
'desc'
);
- const sourceBlockName = blocks[ 0 ].name;
- const blockType = getBlockType( sourceBlockName );
+ // When selection consists of blocks of multiple types, display an
+ // appropriate icon to communicate the non-uniformity.
+ const isSelectionOfSameType = uniq( map( blocks, 'name' ) ).length === 1;
+
+ let icon;
+ if ( isSelectionOfSameType ) {
+ const sourceBlockName = blocks[ 0 ].name;
+ const blockType = getBlockType( sourceBlockName );
+ icon = blockType.icon;
+ } else {
+ icon = 'layout';
+ }
if ( ! hasBlockStyles && ! possibleBlockTransformations.length ) {
- if ( blocks.length > 1 ) {
- return null;
- }
return (
-
+
);
@@ -110,7 +117,7 @@ export class BlockSwitcher extends Component {
tooltip={ label }
onKeyDown={ openOnArrowDown }
>
-
+
diff --git a/packages/editor/src/components/block-switcher/test/__snapshots__/index.js.snap b/packages/editor/src/components/block-switcher/test/__snapshots__/index.js.snap
index f8a340a0480ad..9e03c4e31fb0d 100644
--- a/packages/editor/src/components/block-switcher/test/__snapshots__/index.js.snap
+++ b/packages/editor/src/components/block-switcher/test/__snapshots__/index.js.snap
@@ -1,5 +1,30 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
+exports[`BlockSwitcher should render disabled block switcher with multi block of different types when no transforms 1`] = `
+
+
+
+
+
+`;
+
+exports[`BlockSwitcher should render enabled block switcher with multi block when transforms exist 1`] = `
+
+`;
+
exports[`BlockSwitcher should render switcher with blocks 1`] = `
{
level: 3,
},
isValid: true,
- name: 'core/paragraph',
+ name: 'core/heading',
originalContent: 'I am the greatest!
',
clientId: 'c2403fd2-4e63-5ffa-b71c-1e0ea656c5b0',
};
@@ -54,11 +54,19 @@ describe( 'BlockSwitcher', () => {
edit: () => { },
save: () => {},
transforms: {
- to: [ {
- type: 'block',
- blocks: [ 'core/paragraph' ],
- transform: () => {},
- } ],
+ to: [
+ {
+ type: 'block',
+ blocks: [ 'core/paragraph' ],
+ transform: () => {},
+ },
+ {
+ type: 'block',
+ blocks: [ 'core/paragraph' ],
+ transform: () => {},
+ isMultiBlock: true,
+ },
+ ],
},
} );
@@ -93,6 +101,7 @@ describe( 'BlockSwitcher', () => {
headingBlock1,
];
const inserterItems = [
+ { name: 'core/heading', frecency: 1 },
{ name: 'core/paragraph', frecency: 1 },
];
@@ -101,24 +110,28 @@ describe( 'BlockSwitcher', () => {
expect( wrapper ).toMatchSnapshot();
} );
- test( 'should not render block switcher with multi block of different types.', () => {
- const blocks = [
- headingBlock1,
- textBlock,
+ test( 'should render disabled block switcher with multi block of different types when no transforms', () => {
+ const blocks = [ headingBlock1, textBlock ];
+ const inserterItems = [
+ { name: 'core/heading', frecency: 1 },
+ { name: 'core/paragraph', frecency: 1 },
];
- const wrapper = shallow( );
- expect( wrapper.html() ).toBeNull();
+ const wrapper = shallow( );
+
+ expect( wrapper ).toMatchSnapshot();
} );
- test( 'should not render a component when the multi selected types of blocks match.', () => {
- const blocks = [
- headingBlock1,
- headingBlock2,
+ test( 'should render enabled block switcher with multi block when transforms exist', () => {
+ const blocks = [ headingBlock1, headingBlock2 ];
+ const inserterItems = [
+ { name: 'core/heading', frecency: 1 },
+ { name: 'core/paragraph', frecency: 1 },
];
- const wrapper = shallow( );
- expect( wrapper.html() ).toBeNull();
+ const wrapper = shallow( );
+
+ expect( wrapper ).toMatchSnapshot();
} );
describe( 'Dropdown', () => {
diff --git a/packages/editor/src/components/inserter/menu.js b/packages/editor/src/components/inserter/menu.js
index bae98e911b090..0f5ebb437f9e1 100644
--- a/packages/editor/src/components/inserter/menu.js
+++ b/packages/editor/src/components/inserter/menu.js
@@ -224,7 +224,7 @@ export class InserterMenu extends Component {
resultCount
);
- debouncedSpeak( resultsFoundMessage, 'assertive' );
+ debouncedSpeak( resultsFoundMessage );
}
onKeyDown( event ) {
diff --git a/phpcs.xml.dist b/phpcs.xml.dist
index 9e0d0f2bd2a4b..85a39fbd82a4a 100644
--- a/phpcs.xml.dist
+++ b/phpcs.xml.dist
@@ -33,7 +33,7 @@
./languages/gutenberg-translations.php
- ./lib/parser.php
+ ./packages/block-serialization-spec-parser/parser.php
lib/class-wp-rest-block-renderer-controller.php
diff --git a/phpunit/class-admin-test.php b/phpunit/class-admin-test.php
index 59991a196366c..b13995af52300 100644
--- a/phpunit/class-admin-test.php
+++ b/phpunit/class-admin-test.php
@@ -192,13 +192,4 @@ function test_gutenberg_revisions_restore() {
$link = apply_filters( 'wp_prepare_revision_for_js', array( 'restoreUrl' => 'http://test.com' ) );
$this->assertEquals( array( 'restoreUrl' => 'http://test.com' ), $link );
}
-
- /**
- * Ensure gutenberg_preload_api_request() works without notices in PHP 5.2.
- *
- * The array_reduce() function only accepts mixed variables starting with PHP 5.3.
- */
- function test_preload_api_request_no_notices_php_52() {
- $this->assertTrue( is_array( gutenberg_preload_api_request( 0, '/' ) ) );
- }
}
diff --git a/phpunit/class-prepare-for-js-test.php b/phpunit/class-prepare-for-js-test.php
deleted file mode 100644
index 38dceb8fec6df..0000000000000
--- a/phpunit/class-prepare-for-js-test.php
+++ /dev/null
@@ -1,34 +0,0 @@
-unregister( 'core/dummy' );
- }
-
- function test_gutenberg_prepare_blocks_for_js() {
- $name = 'core/dummy';
- $settings = array(
- 'icon' => 'text',
- 'render_callback' => 'foo',
- );
-
- register_block_type( $name, $settings );
-
- $blocks = gutenberg_prepare_blocks_for_js();
-
- $this->assertArrayHasKey( $name, $blocks );
- $this->assertSame( array( 'icon' => 'text' ), $blocks[ $name ] );
- }
-}