]> scripts.mit.edu Git - autoinstallsdev/mediawiki.git/blob - vendor/wikimedia/remex-html/RemexHtml/TreeBuilder/AfterHead.php
MediaWiki 1.30.2
[autoinstallsdev/mediawiki.git] / vendor / wikimedia / remex-html / RemexHtml / TreeBuilder / AfterHead.php
1 <?php
2
3 namespace RemexHtml\TreeBuilder;
4 use RemexHtml\Tokenizer\Attributes;
5 use RemexHtml\Tokenizer\PlainAttributes;
6
7 /**
8  * The "after head" insertion mode
9  */
10 class AfterHead extends InsertionMode {
11         public function characters( $text, $start, $length, $sourceStart, $sourceLength ) {
12                 $builder = $this->builder;
13                 $dispatcher = $this->dispatcher;
14
15                 // Insert whitespace
16                 list( $part1, $part2 ) = $this->splitInitialMatch(
17                         true, "\t\n\f\r ", $text, $start, $length, $sourceStart, $sourceLength );
18                 list( $start, $length, $sourceStart, $sourceLength ) = $part1;
19                 if ( $length ) {
20                         $builder->insertCharacters( $text, $start, $length,
21                                 $sourceStart, $sourceLength );
22                 }
23
24                 // Switch mode on non-whitespace
25                 list( $start, $length, $sourceStart, $sourceLength ) = $part2;
26                 if ( $length ) {
27                         $builder->insertElement( 'body', new PlainAttributes, false, $sourceStart, 0 );
28                         $dispatcher->switchMode( Dispatcher::IN_BODY )
29                                 ->characters( $text, $start, $length, $sourceStart, $sourceLength );
30                 }
31         }
32
33         public function startTag( $name, Attributes $attrs, $selfClose, $sourceStart, $sourceLength ) {
34                 $builder = $this->builder;
35                 $stack = $builder->stack;
36                 $dispatcher = $this->dispatcher;
37
38                 switch ( $name ) {
39                 case 'html':
40                         $dispatcher->inBody->startTag( $name, $attrs, $selfClose,
41                                 $sourceStart, $sourceLength );
42                         break;
43
44                 case 'frameset':
45                         $builder->insertElement( $name, $attrs, false, $sourceStart, $sourceLength );
46                         $dispatcher->switchMode( Dispatcher::IN_FRAMESET );
47                         break;
48
49                 case 'base':
50                 case 'basefont':
51                 case 'bgsound':
52                 case 'link':
53                 case 'meta':
54                 case 'noframes':
55                 case 'script':
56                 case 'style':
57                 case 'template':
58                 case 'title':
59                         $builder->error( "unexpected <$name> after </head>, accepting", $sourceStart );
60                         $stack->push( $builder->headElement );
61                         $dispatcher->inHead->startTag(
62                                 $name, $attrs, $selfClose, $sourceStart, $sourceLength );
63                         $stack->remove( $builder->headElement );
64                         break;
65
66                 case 'head':
67                         $builder->error( "unexpected <head> after </head>, ignoring", $sourceStart );
68                         return;
69
70                 default:
71                         $builder->insertElement( 'body', new PlainAttributes, false, $sourceStart, 0 );
72                         $dispatcher->switchMode( Dispatcher::IN_BODY )
73                                 ->startTag( $name, $attrs, $selfClose, $sourceStart, $sourceLength );
74                 }
75         }
76
77         public function endTag( $name, $sourceStart, $sourceLength ) {
78                 $builder = $this->builder;
79                 $dispatcher = $this->dispatcher;
80
81                 switch ( $name ) {
82                 case 'template':
83                         $dispatcher->inHead->endTag( $name, $sourceStart, $sourceLength );
84                         break;
85
86                 case 'body':
87                 case 'html':
88                 case 'br':
89                         $builder->insertElement( 'body', new PlainAttributes, false, $sourceStart, 0 );
90                         $dispatcher->switchMode( Dispatcher::IN_BODY )
91                                 ->endTag( $name, $sourceStart, $sourceLength );
92                         break;
93
94                 default:
95                         $builder->error( "unexpected </$name> after head, ignoring", $sourceStart );
96                         return;
97                 }
98         }
99
100         public function endDocument( $pos ) {
101                 $this->builder->insertElement( 'body', new PlainAttributes, false, $pos, 0 );
102                 $this->dispatcher->switchMode( Dispatcher::IN_BODY )
103                         ->endDocument( $pos );
104         }
105 }