@@ -424,6 +424,55 @@ function ( WP_HTML_Token $token ): void {
424
424
};
425
425
}
426
426
427
+ /**
428
+ * Creates a fragment processor with the current node as its context element.
429
+ *
430
+ * @see https://html.spec.whatwg.org/multipage/parsing.html#html-fragment-parsing-algorithm
431
+ *
432
+ * @param string $html Input HTML fragment to process.
433
+ * @return static|null The created processor if successful, otherwise null.
434
+ */
435
+ private function spawn_fragment_parser ( string $ html ): ?self {
436
+ if ( $ this ->get_token_type () !== '#tag ' ) {
437
+ return null ;
438
+ }
439
+
440
+ /*
441
+ * Prevent creating fragments at "self-contained" nodes.
442
+ *
443
+ * @see https://github.com/WordPress/wordpress-develop/pull/7141
444
+ * @see https://github.com/WordPress/wordpress-develop/pull/7198
445
+ */
446
+ if (
447
+ 'html ' === $ this ->get_namespace () &&
448
+ in_array ( $ this ->get_tag (), array ( 'IFRAME ' , 'NOEMBED ' , 'NOFRAMES ' , 'SCRIPT ' , 'STYLE ' , 'TEXTAREA ' , 'TITLE ' , 'XMP ' ), true )
449
+ ) {
450
+ return null ;
451
+ }
452
+
453
+ $ fragment_processor = self ::create_fragment ( $ html );
454
+ $ fragment_processor ->compat_mode = $ this ->compat_mode ;
455
+
456
+ // @todo The context element probably needs a namespace{
457
+ $ context_element = array ( $ this ->get_tag (), array () );
458
+ foreach ( $ this ->get_attribute_names_with_prefix ( '' ) as $ name => $ value ) {
459
+ $ context_element [1 ][ $ name ] = $ value ;
460
+ }
461
+ $ fragment_processor ->state ->context_node = $ context_element ;
462
+
463
+ if ( 'TEMPLATE ' === $ context_element [0 ] ) {
464
+ $ fragment_processor ->state ->stack_of_template_insertion_modes [] = WP_HTML_Processor_State::INSERTION_MODE_IN_TEMPLATE ;
465
+ }
466
+
467
+ $ fragment_processor ->reset_insertion_mode_appropriately ();
468
+
469
+ // @todo Set the parser's form element pointer.
470
+
471
+ $ fragment_processor ->state ->encoding_confidence = 'irrelevant ' ;
472
+
473
+ return $ fragment_processor ;
474
+ }
475
+
427
476
/**
428
477
* Stops the parser and terminates its execution when encountering unsupported markup.
429
478
*
0 commit comments