]> scripts.mit.edu Git - autoinstallsdev/mediawiki.git/blobdiff - vendor/wikimedia/remex-html/RemexHtml/TreeBuilder/InTableText.php
MediaWiki 1.30.2
[autoinstallsdev/mediawiki.git] / vendor / wikimedia / remex-html / RemexHtml / TreeBuilder / InTableText.php
diff --git a/vendor/wikimedia/remex-html/RemexHtml/TreeBuilder/InTableText.php b/vendor/wikimedia/remex-html/RemexHtml/TreeBuilder/InTableText.php
new file mode 100644 (file)
index 0000000..0ec571c
--- /dev/null
@@ -0,0 +1,82 @@
+<?php
+
+namespace RemexHtml\TreeBuilder;
+use RemexHtml\Tokenizer\Attributes;
+
+/**
+ * The "in table text" insertion mode
+ */
+class InTableText extends InsertionMode {
+       public function characters( $text, $start, $length, $sourceStart, $sourceLength ) {
+               $handleNonNull = function ( $text, $start, $length, $sourceStart, $sourceLength ) {
+                       $this->builder->pendingTableCharacters[] = [
+                               $text, $start, $length, $sourceStart, $sourceLength ];
+               };
+               if ( !$this->builder->ignoreNulls ) {
+                       $this->stripNulls( $handleNonNull, $text, $start, $length,
+                               $sourceStart, $sourceLength );
+               } else {
+                       $handleNonNull( $text, $start, $length, $sourceStart, $sourceLength );
+               }
+       }
+
+       public function doctype( $name, $public, $system, $quirks, $sourceStart, $sourceLength ) {
+               $this->processPendingCharacters();
+               $this->dispatcher->restoreMode()
+                       ->doctype( $name, $public, $system, $quirks, $sourceStart, $sourceLength );
+       }
+
+       public function comment( $text, $sourceStart, $sourceLength ) {
+               $this->processPendingCharacters();
+               $this->dispatcher->restoreMode()
+                       ->comment( $text, $sourceStart, $sourceLength );
+       }
+
+       public function startTag( $name, Attributes $attrs, $selfClose, $sourceStart, $sourceLength ) {
+               $this->processPendingCharacters();
+               $this->dispatcher->restoreMode()
+                       ->startTag( $name, $attrs, $selfClose, $sourceStart, $sourceLength );
+       }
+
+       public function endTag( $name, $sourceStart, $sourceLength ) {
+               $this->processPendingCharacters();
+               $this->dispatcher->restoreMode()
+                       ->endTag( $name, $sourceStart, $sourceLength );
+       }
+
+       public function endDocument( $pos ) {
+               $this->processPendingCharacters();
+               $this->dispatcher->restoreMode()
+                       ->endDocument( $pos );
+       }
+
+       /**
+        * Common code for the "anything else" case. Process the pending table
+        * character tokens.
+        */
+       protected function processPendingCharacters() {
+               $builder = $this->builder;
+               $allSpace = true;
+               foreach ( $builder->pendingTableCharacters as $token ) {
+                       list( $text, $start, $length, $sourceStart, $sourceLength ) = $token;
+                       if ( strspn( $text, "\t\n\f\r ", $start, $length ) !== $length ) {
+                               $allSpace = false;
+                       }
+               }
+               if ( $allSpace ) {
+                       foreach ( $builder->pendingTableCharacters as $token ) {
+                               list( $text, $start, $length, $sourceStart, $sourceLength ) = $token;
+                               $builder->insertCharacters( $text, $start, $length, $sourceStart, $sourceLength );
+                       }
+               } else {
+                       $builder->fosterParenting = true;
+                       foreach ( $builder->pendingTableCharacters as $token ) {
+                               list( $text, $start, $length, $sourceStart, $sourceLength ) = $token;
+                               $builder->error( 'invalid characters in table text, fostering', $sourceStart );
+                               $this->dispatcher->inBody->characters( $text, $start, $length,
+                                       $sourceStart, $sourceLength );
+                       }
+                       $builder->fosterParenting = false;
+               }
+       }
+}