@@ -355,6 +355,109 @@ public static function create_full_parser( $html, $known_definite_encoding = 'UT
355
355
return $ processor ;
356
356
}
357
357
358
+ public function set_inner_html ( $ html ) {
359
+ if ( $ this ->is_virtual () ) {
360
+ return false ;
361
+ }
362
+
363
+ if ( $ this ->get_token_type () !== '#tag ' ) {
364
+ return false ;
365
+ }
366
+
367
+ if ( $ this ->is_tag_closer () ) {
368
+ return false ;
369
+ }
370
+
371
+ if ( ! $ this ->expects_closer () ) {
372
+ return false ;
373
+ }
374
+
375
+ if (
376
+ 'html ' !== $ this ->state ->current_token ->namespace &&
377
+ $ this ->state ->current_token ->has_self_closing_flag
378
+ ) {
379
+ return false ;
380
+ }
381
+
382
+ $ html_for_replacement = $ this ->normalize ( $ html );
383
+ if ( empty ( $ html_for_replacement ) ) {
384
+ return false ;
385
+ }
386
+
387
+ // @todo apply modifications if there are any???
388
+
389
+ if ( ! parent ::set_bookmark ( 'SET_INNER_HTML: opener ' ) ) {
390
+ return false ;
391
+ }
392
+
393
+ if ( ! $ this ->seek_to_matching_closer () ) {
394
+ parent ::seek ( 'SET_INNER_HTML: opener ' );
395
+ return false ;
396
+ }
397
+
398
+ if ( ! parent ::set_bookmark ( 'SET_INNER_HTML: closer ' ) ) {
399
+ return false ;
400
+ }
401
+
402
+ $ inner_html_start = $ this ->bookmarks ['SET_INNER_HTML: opener ' ]->start + $ this ->bookmarks ['SET_INNER_HTML: opener ' ]->length ;
403
+ $ inner_html_length = $ this ->bookmarks ['SET_INNER_HTML: closer ' ]->start - $ inner_html_start ;
404
+
405
+ echo 'INNER HTML: ' . substr ( $ this ->html , $ inner_html_start , $ inner_html_length ) . "\n" ;
406
+
407
+ echo "BEFORE: \n" ;
408
+ var_dump ( $ this ->get_updated_html () );
409
+
410
+ $ this ->lexical_updates ['innerHTML ' ] = new WP_HTML_Text_Replacement (
411
+ $ inner_html_start ,
412
+ $ inner_html_length ,
413
+ $ html_for_replacement
414
+ );
415
+
416
+ parent ::seek ( 'SET_INNER_HTML: opener ' );
417
+ parent ::release_bookmark ( 'SET_INNER_HTML: opener ' );
418
+ parent ::release_bookmark ( 'SET_INNER_HTML: closer ' );
419
+ echo "AFTER: \n" ;
420
+ var_dump ( $ this ->get_updated_html () );
421
+
422
+ // @todo check for whether that html will make a mess!
423
+ // Will it break out of tags?
424
+
425
+ return true ;
426
+ }
427
+
428
+ public function seek_to_matching_closer (): bool {
429
+ $ tag_name = $ this ->get_tag ();
430
+
431
+ if ( null === $ tag_name ) {
432
+ return false ;
433
+ }
434
+
435
+ if ( $ this ->is_tag_closer () ) {
436
+ return false ;
437
+ }
438
+
439
+ if ( ! $ this ->expects_closer () ) {
440
+ return false ;
441
+ }
442
+
443
+ $ breadcrumbs = $ this ->breadcrumbs ;
444
+ array_pop ( $ breadcrumbs );
445
+
446
+ // @todo Can't use these queries together
447
+ while ( $ this ->next_tag (
448
+ array (
449
+ 'tag_name ' => $ this ->get_tag (),
450
+ 'tag_closers ' => 'visit ' ,
451
+ )
452
+ ) ) {
453
+ if ( $ this ->get_breadcrumbs () === $ breadcrumbs ) {
454
+ return true ;
455
+ }
456
+ }
457
+ return false ;
458
+ }
459
+
460
+
358
461
/**
359
462
* Constructor.
360
463
*
@@ -522,6 +625,7 @@ public function get_unsupported_exception() {
522
625
* 1 for "first" tag, 3 for "third," etc.
523
626
* Defaults to first tag.
524
627
* @type string|null $class_name Tag must contain this whole class name to match.
628
+ * @type string $tag_name Tag name to match.
525
629
* @type string[] $breadcrumbs DOM sub-path at which element is found, e.g. `array( 'FIGURE', 'IMG' )`.
526
630
* May also contain the wildcard `*` which matches a single element, e.g. `array( 'SECTION', '*' )`.
527
631
* }
@@ -545,7 +649,7 @@ public function next_tag( $query = null ): bool {
545
649
}
546
650
547
651
if ( is_string ( $ query ) ) {
548
- $ query = array ( 'breadcrumbs ' => array ( $ query ) );
652
+ $ query = array ( 'tag_name ' => $ query );
549
653
}
550
654
551
655
if ( ! is_array ( $ query ) ) {
0 commit comments