From 4a674acf0f3576739772601b1f51cdb340a05051 Mon Sep 17 00:00:00 2001 From: Dennis Snell Date: Tue, 9 Oct 2018 10:37:19 -0500 Subject: [PATCH] Parser: Tabs or spaces? This never should have gotten in MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Oops ¯\(ツ)/¯ well I was waiting until I could do this in one fell swoop instead of mixing it in with actual changes. there should be no functional, behavioral, or visual changes in this. --- .../parser.php | 532 +++++++++--------- 1 file changed, 266 insertions(+), 266 deletions(-) diff --git a/packages/block-serialization-default-parser/parser.php b/packages/block-serialization-default-parser/parser.php index a7c04d1ba0806..78b6921787cc4 100644 --- a/packages/block-serialization-default-parser/parser.php +++ b/packages/block-serialization-default-parser/parser.php @@ -16,7 +16,7 @@ class WP_Block_Parser_Block { * @since 3.8.0 * @var string */ - public $blockName; + public $blockName; /** * Optional set of attributes from block comment delimiters @@ -27,7 +27,7 @@ class WP_Block_Parser_Block { * @since 3.8.0 * @var array|null */ - public $attrs; + public $attrs; /** * List of inner blocks (of this same class) @@ -35,7 +35,7 @@ class WP_Block_Parser_Block { * @since 3.8.0 * @var WP_Block_Parser_Block[] */ - public $innerBlocks; + public $innerBlocks; /** * Resultant HTML from inside block comment delimiters @@ -46,14 +46,14 @@ class WP_Block_Parser_Block { * @since 3.8.0 * @var string */ - public $innerHTML; - - function __construct( $name, $attrs, $innerBlocks, $innerHTML ) { - $this->blockName = $name; - $this->attrs = $attrs; - $this->innerBlocks = $innerBlocks; - $this->innerHTML = $innerHTML; - } + public $innerHTML; + + function __construct( $name, $attrs, $innerBlocks, $innerHTML ) { + $this->blockName = $name; + $this->attrs = $attrs; + $this->innerBlocks = $innerBlocks; + $this->innerHTML = $innerHTML; + } } /** @@ -71,7 +71,7 @@ class WP_Block_Parser_Frame { * @since 3.8.0 * @var WP_Block_Parser_Block */ - public $block; + public $block; /** * Byte offset into document for start of parse token @@ -79,7 +79,7 @@ class WP_Block_Parser_Frame { * @since 3.8.0 * @var int */ - public $token_start; + public $token_start; /** * Byte length of entire parse token string @@ -87,7 +87,7 @@ class WP_Block_Parser_Frame { * @since 3.8.0 * @var int */ - public $token_length; + public $token_length; /** * Byte offset into document for after parse token ends @@ -96,7 +96,7 @@ class WP_Block_Parser_Frame { * @since 3.8.0 * @var int */ - public $prev_offset; + public $prev_offset; /** * Byte offset into document where leading HTML before token starts @@ -104,15 +104,15 @@ class WP_Block_Parser_Frame { * @since 3.8.0 * @var int */ - public $leading_html_start; - - function __construct( $block, $token_start, $token_length, $prev_offset = null, $leading_html_start = null ) { - $this->block = $block; - $this->token_start = $token_start; - $this->token_length = $token_length; - $this->prev_offset = isset($prev_offset) ? $prev_offset : $token_start + $token_length; - $this->leading_html_start = $leading_html_start; - } + public $leading_html_start; + + function __construct( $block, $token_start, $token_length, $prev_offset = null, $leading_html_start = null ) { + $this->block = $block; + $this->token_start = $token_start; + $this->token_length = $token_length; + $this->prev_offset = isset( $prev_offset ) ? $prev_offset : $token_start + $token_length; + $this->leading_html_start = $leading_html_start; + } } /** @@ -132,7 +132,7 @@ class WP_Block_Parser { * @since 3.8.0 * @var string */ - public $document; + public $document; /** * Tracks parsing progress through document @@ -140,7 +140,7 @@ class WP_Block_Parser { * @since 3.8.0 * @var int */ - public $offset; + public $offset; /** * List of parsed blocks @@ -148,7 +148,7 @@ class WP_Block_Parser { * @since 3.8.0 * @var WP_Block_Parser_Block[] */ - public $output; + public $output; /** * Stack of partially-parsed structures in memory during parse @@ -156,7 +156,7 @@ class WP_Block_Parser { * @since 3.8.0 * @var WP_Block_Parser_Frame[] */ - public $stack; + public $stack; /** * Parses a document and returns a list of block structures @@ -170,18 +170,18 @@ class WP_Block_Parser { * @param string $document * @return WP_Block_Parser_Block[] */ - function parse( $document ) { - $this->document = $document; - $this->offset = 0; - $this->output = array(); - $this->stack = array(); + function parse( $document ) { + $this->document = $document; + $this->offset = 0; + $this->output = array(); + $this->stack = array(); - do { - // twiddle our thumbs - } while ( $this->proceed() ); + do { + // twiddle our thumbs + } while ( $this->proceed() ); - return $this->output; - } + return $this->output; + } /** * Processes the next token from the input document @@ -197,133 +197,133 @@ function parse( $document ) { * @since 3.8.0 * @return bool */ - function proceed() { - $next_token = $this->next_token(); - list( $token_type, $block_name, $attrs, $start_offset, $token_length ) = $next_token; - $stack_depth = count( $this->stack ); - - // we may have some HTML soup before the next block - $leading_html_start = $start_offset > $this->offset ? $this->offset : null; - - switch ( $token_type ) { - case 'no-more-tokens': - // if not in a block then flush output - if ( 0 === $stack_depth ) { - $this->add_freeform(); - return false; - } - - /* - * Otherwise we have a problem - * This is an error - * - * we have options - * - treat it all as freeform text - * - assume an implicit closer (easiest when not nesting) - */ - - // for the easy case we'll assume an implicit closer - if ( 1 === $stack_depth ) { - $this->add_block_from_stack(); - return false; - } - - /* - * for the nested case where it's more difficult we'll - * have to assume that multiple closers are missing - * and so we'll collapse the whole stack piecewise - */ - while ( 0 < count( $this->stack ) ) { - $this->add_block_from_stack(); - } - return false; - - case 'void-block': - /* - * easy case is if we stumbled upon a void block - * in the top-level of the document - */ - if ( 0 === $stack_depth ) { - if ( isset( $leading_html_start ) ) { - $this->output[] = (array) self::freeform( substr( - $this->document, - $leading_html_start, - $start_offset - $leading_html_start - ) ); - } - - $this->output[] = (array) new WP_Block_Parser_Block( $block_name, $attrs, array(), '' ); - $this->offset = $start_offset + $token_length; - return true; - } - - // otherwise we found an inner block - $this->add_inner_block( - new WP_Block_Parser_Block( $block_name, $attrs, array(), '' ), - $start_offset, - $token_length - ); - $this->offset = $start_offset + $token_length; - return true; - - case 'block-opener': - // track all newly-opened blocks on the stack - array_push( $this->stack, new WP_Block_Parser_Frame( - new WP_Block_Parser_Block( $block_name, $attrs, array(), '' ), - $start_offset, - $token_length, - $start_offset + $token_length, - $leading_html_start - ) ); - $this->offset = $start_offset + $token_length; - return true; - - case 'block-closer': - /* - * if we're missing an opener we're in trouble - * This is an error - */ - if ( 0 === $stack_depth ) { - /* - * we have options - * - assume an implicit opener - * - assume _this_ is the opener - * - give up and close out the document - */ - $this->add_freeform(); - return false; - } - - // if we're not nesting then this is easy - close the block - if ( 1 === $stack_depth ) { - $this->add_block_from_stack( $start_offset ); - $this->offset = $start_offset + $token_length; - return true; - } - - /* - * otherwise we're nested and we have to close out the current - * block and add it as a new innerBlock to the parent - */ - $stack_top = array_pop( $this->stack ); - $stack_top->block->innerHTML .= substr( $this->document, $stack_top->prev_offset, $start_offset - $stack_top->prev_offset ); - $stack_top->prev_offset = $start_offset + $token_length; - - $this->add_inner_block( - $stack_top->block, - $stack_top->token_start, - $stack_top->token_length, - $start_offset + $token_length - ); - $this->offset = $start_offset + $token_length; - return true; - - default: - // This is an error - $this->add_freeform(); - return false; - } - } + function proceed() { + $next_token = $this->next_token(); + list( $token_type, $block_name, $attrs, $start_offset, $token_length ) = $next_token; + $stack_depth = count( $this->stack ); + + // we may have some HTML soup before the next block + $leading_html_start = $start_offset > $this->offset ? $this->offset : null; + + switch ( $token_type ) { + case 'no-more-tokens': + // if not in a block then flush output + if ( 0 === $stack_depth ) { + $this->add_freeform(); + return false; + } + + /* + * Otherwise we have a problem + * This is an error + * + * we have options + * - treat it all as freeform text + * - assume an implicit closer (easiest when not nesting) + */ + + // for the easy case we'll assume an implicit closer + if ( 1 === $stack_depth ) { + $this->add_block_from_stack(); + return false; + } + + /* + * for the nested case where it's more difficult we'll + * have to assume that multiple closers are missing + * and so we'll collapse the whole stack piecewise + */ + while ( 0 < count( $this->stack ) ) { + $this->add_block_from_stack(); + } + return false; + + case 'void-block': + /* + * easy case is if we stumbled upon a void block + * in the top-level of the document + */ + if ( 0 === $stack_depth ) { + if ( isset( $leading_html_start ) ) { + $this->output[] = (array) self::freeform( substr( + $this->document, + $leading_html_start, + $start_offset - $leading_html_start + ) ); + } + + $this->output[] = (array) new WP_Block_Parser_Block( $block_name, $attrs, array(), '' ); + $this->offset = $start_offset + $token_length; + return true; + } + + // otherwise we found an inner block + $this->add_inner_block( + new WP_Block_Parser_Block( $block_name, $attrs, array(), '' ), + $start_offset, + $token_length + ); + $this->offset = $start_offset + $token_length; + return true; + + case 'block-opener': + // track all newly-opened blocks on the stack + array_push( $this->stack, new WP_Block_Parser_Frame( + new WP_Block_Parser_Block( $block_name, $attrs, array(), '' ), + $start_offset, + $token_length, + $start_offset + $token_length, + $leading_html_start + ) ); + $this->offset = $start_offset + $token_length; + return true; + + case 'block-closer': + /* + * if we're missing an opener we're in trouble + * This is an error + */ + if ( 0 === $stack_depth ) { + /* + * we have options + * - assume an implicit opener + * - assume _this_ is the opener + * - give up and close out the document + */ + $this->add_freeform(); + return false; + } + + // if we're not nesting then this is easy - close the block + if ( 1 === $stack_depth ) { + $this->add_block_from_stack( $start_offset ); + $this->offset = $start_offset + $token_length; + return true; + } + + /* + * otherwise we're nested and we have to close out the current + * block and add it as a new innerBlock to the parent + */ + $stack_top = array_pop( $this->stack ); + $stack_top->block->innerHTML .= substr( $this->document, $stack_top->prev_offset, $start_offset - $stack_top->prev_offset ); + $stack_top->prev_offset = $start_offset + $token_length; + + $this->add_inner_block( + $stack_top->block, + $stack_top->token_start, + $stack_top->token_length, + $start_offset + $token_length + ); + $this->offset = $start_offset + $token_length; + return true; + + default: + // This is an error + $this->add_freeform(); + return false; + } + } /** * Scans the document from where we last left off @@ -335,79 +335,79 @@ function proceed() { * @since 3.8.0 * @return array */ - function next_token() { - $matches = null; - - /* - * aye the magic - * we're using a single RegExp to tokenize the block comment delimiters - * we're also using a trick here because the only difference between a - * block opener and a block closer is the leading `/` before `wp:` (and - * a closer has no attributes). we can trap them both and process the - * match back in PHP to see which one it was. - */ - $has_match = preg_match( - '/).)+?}\s+)?(?\/)?-->/s', - $this->document, - $matches, - PREG_OFFSET_CAPTURE, - $this->offset - ); - - // we have no more tokens - if ( 0 === $has_match ) { - return array( 'no-more-tokens', null, null, null, null ); - } - - list( $match, $started_at ) = $matches[ 0 ]; - - $length = strlen( $match ); - $is_closer = isset( $matches[ 'closer' ] ) && -1 !== $matches[ 'closer' ][ 1 ]; - $is_void = isset( $matches[ 'void' ] ) && -1 !== $matches[ 'void' ][ 1 ]; - $namespace = $matches[ 'namespace' ]; - $namespace = ( isset( $namespace ) && -1 !== $namespace[ 1 ] ) ? $namespace[ 0 ] : 'core/'; - $name = $namespace . $matches[ 'name' ][ 0 ]; - $has_attrs = isset( $matches[ 'attrs' ] ) && -1 !== $matches[ 'attrs' ][ 1 ]; - - /* - * Fun fact! It's not trivial in PHP to create "an empty associative array" since all arrays - * are associative arrays. If we use `array()` we get a JSON `[]` - */ - $attrs = $has_attrs + function next_token() { + $matches = null; + + /* + * aye the magic + * we're using a single RegExp to tokenize the block comment delimiters + * we're also using a trick here because the only difference between a + * block opener and a block closer is the leading `/` before `wp:` (and + * a closer has no attributes). we can trap them both and process the + * match back in PHP to see which one it was. + */ + $has_match = preg_match( + '/).)+?}\s+)?(?\/)?-->/s', + $this->document, + $matches, + PREG_OFFSET_CAPTURE, + $this->offset + ); + + // we have no more tokens + if ( 0 === $has_match ) { + return array( 'no-more-tokens', null, null, null, null ); + } + + list( $match, $started_at ) = $matches[ 0 ]; + + $length = strlen( $match ); + $is_closer = isset( $matches[ 'closer' ] ) && -1 !== $matches[ 'closer' ][ 1 ]; + $is_void = isset( $matches[ 'void' ] ) && -1 !== $matches[ 'void' ][ 1 ]; + $namespace = $matches[ 'namespace' ]; + $namespace = ( isset( $namespace ) && -1 !== $namespace[ 1 ] ) ? $namespace[ 0 ] : 'core/'; + $name = $namespace . $matches[ 'name' ][ 0 ]; + $has_attrs = isset( $matches[ 'attrs' ] ) && -1 !== $matches[ 'attrs' ][ 1 ]; + + /* + * Fun fact! It's not trivial in PHP to create "an empty associative array" since all arrays + * are associative arrays. If we use `array()` we get a JSON `[]` + */ + $attrs = $has_attrs ? json_decode( $matches[ 'attrs' ][ 0 ], /* as-associative */ true ) : json_decode( '{}', /* don't ask why, just verify in PHP */ false ); - /* - * This state isn't allowed - * This is an error - */ - if ( $is_closer && ( $is_void || $has_attrs ) ) { - // we can ignore them since they don't hurt anything - } - - if ( $is_void ) { - return array( 'void-block', $name, $attrs, $started_at, $length ); - } - - if ( $is_closer ) { - return array( 'block-closer', $name, null, $started_at, $length ); - } - - return array( 'block-opener', $name, $attrs, $started_at, $length ); - } - - /** - * Returns a new block object for freeform HTML - * - * @internal - * @since 3.9.0 - * - * @param string $innerHTML HTML content of block - * @return WP_Block_Parser_Block freeform block object - */ - static function freeform( $innerHTML ) { - return new WP_Block_Parser_Block( null, array(), array(), $innerHTML ); - } + /* + * This state isn't allowed + * This is an error + */ + if ( $is_closer && ( $is_void || $has_attrs ) ) { + // we can ignore them since they don't hurt anything + } + + if ( $is_void ) { + return array( 'void-block', $name, $attrs, $started_at, $length ); + } + + if ( $is_closer ) { + return array( 'block-closer', $name, null, $started_at, $length ); + } + + return array( 'block-opener', $name, $attrs, $started_at, $length ); + } + + /** + * Returns a new block object for freeform HTML + * + * @internal + * @since 3.9.0 + * + * @param string $innerHTML HTML content of block + * @return WP_Block_Parser_Block freeform block object + */ + static function freeform( $innerHTML ) { + return new WP_Block_Parser_Block( null, array(), array(), $innerHTML ); + } /** * Pushes a length of text from the input document @@ -417,15 +417,15 @@ static function freeform( $innerHTML ) { * @since 3.8.0 * @param null $length how many bytes of document text to output */ - function add_freeform( $length = null ) { - $length = $length ? $length : strlen( $this->document ) - $this->offset; + function add_freeform( $length = null ) { + $length = $length ? $length : strlen( $this->document ) - $this->offset; - if ( 0 === $length ) { - return; - } + if ( 0 === $length ) { + return; + } - $this->output[] = (array) self::freeform( substr( $this->document, $this->offset, $length ) ); - } + $this->output[] = (array) self::freeform( substr( $this->document, $this->offset, $length ) ); + } /** * Given a block structure from memory pushes @@ -438,12 +438,12 @@ function add_freeform( $length = null ) { * @param int $token_length byte length of entire block from start of opening token to end of closing token * @param int|null $last_offset last byte offset into document if continuing form earlier output */ - function add_inner_block( WP_Block_Parser_Block $block, $token_start, $token_length, $last_offset = null ) { - $parent = $this->stack[ count( $this->stack ) - 1 ]; - $parent->block->innerBlocks[] = $block; - $parent->block->innerHTML .= substr( $this->document, $parent->prev_offset, $token_start - $parent->prev_offset ); - $parent->prev_offset = $last_offset ? $last_offset : $token_start + $token_length; - } + function add_inner_block( WP_Block_Parser_Block $block, $token_start, $token_length, $last_offset = null ) { + $parent = $this->stack[ count( $this->stack ) - 1 ]; + $parent->block->innerBlocks[] = $block; + $parent->block->innerHTML .= substr( $this->document, $parent->prev_offset, $token_start - $parent->prev_offset ); + $parent->prev_offset = $last_offset ? $last_offset : $token_start + $token_length; + } /** * Pushes the top block from the parsing stack to the output list @@ -452,22 +452,22 @@ function add_inner_block( WP_Block_Parser_Block $block, $token_start, $token_len * @since 3.8.0 * @param int|null $end_offset byte offset into document for where we should stop sending text output as HTML */ - function add_block_from_stack( $end_offset = null ) { - $stack_top = array_pop( $this->stack ); - $prev_offset = $stack_top->prev_offset; - - $stack_top->block->innerHTML .= isset( $end_offset ) - ? substr( $this->document, $prev_offset, $end_offset - $prev_offset ) - : substr( $this->document, $prev_offset ); - - if ( isset( $stack_top->leading_html_start ) ) { - $this->output[] = (array) self::freeform( substr( - $this->document, - $stack_top->leading_html_start, - $stack_top->token_start - $stack_top->leading_html_start - ) ); - } - - $this->output[] = (array) $stack_top->block; - } + function add_block_from_stack( $end_offset = null ) { + $stack_top = array_pop( $this->stack ); + $prev_offset = $stack_top->prev_offset; + + $stack_top->block->innerHTML .= isset( $end_offset ) + ? substr( $this->document, $prev_offset, $end_offset - $prev_offset ) + : substr( $this->document, $prev_offset ); + + if ( isset( $stack_top->leading_html_start ) ) { + $this->output[] = (array) self::freeform( substr( + $this->document, + $stack_top->leading_html_start, + $stack_top->token_start - $stack_top->leading_html_start + ) ); + } + + $this->output[] = (array) $stack_top->block; + } }