[ Index ]

PHP Cross Reference of WordPress Trunk (Updated Daily)

Search

title

Body

[close]

/wp-includes/SimplePie/src/XML/Declaration/ -> Parser.php (source)

   1  <?php
   2  
   3  /**
   4   * SimplePie
   5   *
   6   * A PHP-Based RSS and Atom Feed Framework.
   7   * Takes the hard work out of managing a complete RSS/Atom solution.
   8   *
   9   * Copyright (c) 2004-2022, Ryan Parman, Sam Sneddon, Ryan McCue, and contributors
  10   * All rights reserved.
  11   *
  12   * Redistribution and use in source and binary forms, with or without modification, are
  13   * permitted provided that the following conditions are met:
  14   *
  15   *     * Redistributions of source code must retain the above copyright notice, this list of
  16   *       conditions and the following disclaimer.
  17   *
  18   *     * Redistributions in binary form must reproduce the above copyright notice, this list
  19   *       of conditions and the following disclaimer in the documentation and/or other materials
  20   *       provided with the distribution.
  21   *
  22   *     * Neither the name of the SimplePie Team nor the names of its contributors may be used
  23   *       to endorse or promote products derived from this software without specific prior
  24   *       written permission.
  25   *
  26   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
  27   * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
  28   * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS
  29   * AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  30   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  31   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  32   * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
  33   * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  34   * POSSIBILITY OF SUCH DAMAGE.
  35   *
  36   * @package SimplePie
  37   * @copyright 2004-2016 Ryan Parman, Sam Sneddon, Ryan McCue
  38   * @author Ryan Parman
  39   * @author Sam Sneddon
  40   * @author Ryan McCue
  41   * @link http://simplepie.org/ SimplePie
  42   * @license http://www.opensource.org/licenses/bsd-license.php BSD License
  43   */
  44  
  45  namespace SimplePie\XML\Declaration;
  46  
  47  /**
  48   * Parses the XML Declaration
  49   *
  50   * @package SimplePie
  51   * @subpackage Parsing
  52   */
  53  class Parser
  54  {
  55      /**
  56       * XML Version
  57       *
  58       * @access public
  59       * @var string
  60       */
  61      public $version = '1.0';
  62  
  63      /**
  64       * Encoding
  65       *
  66       * @access public
  67       * @var string
  68       */
  69      public $encoding = 'UTF-8';
  70  
  71      /**
  72       * Standalone
  73       *
  74       * @access public
  75       * @var bool
  76       */
  77      public $standalone = false;
  78  
  79      private const STATE_BEFORE_VERSION_NAME = 'before_version_name';
  80  
  81      private const STATE_VERSION_NAME = 'version_name';
  82  
  83      private const STATE_VERSION_EQUALS = 'version_equals';
  84  
  85      private const STATE_VERSION_VALUE = 'version_value';
  86  
  87      private const STATE_ENCODING_NAME = 'encoding_name';
  88  
  89      private const STATE_EMIT = 'emit';
  90  
  91      private const STATE_ENCODING_EQUALS = 'encoding_equals';
  92  
  93      private const STATE_STANDALONE_NAME = 'standalone_name';
  94  
  95      private const STATE_ENCODING_VALUE = 'encoding_value';
  96  
  97      private const STATE_STANDALONE_EQUALS = 'standalone_equals';
  98  
  99      private const STATE_STANDALONE_VALUE = 'standalone_value';
 100  
 101      private const STATE_ERROR = false;
 102  
 103      /**
 104       * Current state of the state machine
 105       *
 106       * @access private
 107       * @var self::STATE_*
 108       */
 109      public $state = self::STATE_BEFORE_VERSION_NAME;
 110  
 111      /**
 112       * Input data
 113       *
 114       * @access private
 115       * @var string
 116       */
 117      public $data = '';
 118  
 119      /**
 120       * Input data length (to avoid calling strlen() everytime this is needed)
 121       *
 122       * @access private
 123       * @var int
 124       */
 125      public $data_length = 0;
 126  
 127      /**
 128       * Current position of the pointer
 129       *
 130       * @var int
 131       * @access private
 132       */
 133      public $position = 0;
 134  
 135      /**
 136       * Create an instance of the class with the input data
 137       *
 138       * @access public
 139       * @param string $data Input data
 140       */
 141      public function __construct($data)
 142      {
 143          $this->data = $data;
 144          $this->data_length = strlen($this->data);
 145      }
 146  
 147      /**
 148       * Parse the input data
 149       *
 150       * @access public
 151       * @return bool true on success, false on failure
 152       */
 153      public function parse()
 154      {
 155          while ($this->state && $this->state !== self::STATE_EMIT && $this->has_data()) {
 156              $state = $this->state;
 157              $this->$state();
 158          }
 159          $this->data = '';
 160          if ($this->state === self::STATE_EMIT) {
 161              return true;
 162          }
 163  
 164          $this->version = '';
 165          $this->encoding = '';
 166          $this->standalone = '';
 167          return false;
 168      }
 169  
 170      /**
 171       * Check whether there is data beyond the pointer
 172       *
 173       * @access private
 174       * @return bool true if there is further data, false if not
 175       */
 176      public function has_data()
 177      {
 178          return (bool) ($this->position < $this->data_length);
 179      }
 180  
 181      /**
 182       * Advance past any whitespace
 183       *
 184       * @return int Number of whitespace characters passed
 185       */
 186      public function skip_whitespace()
 187      {
 188          $whitespace = strspn($this->data, "\x09\x0A\x0D\x20", $this->position);
 189          $this->position += $whitespace;
 190          return $whitespace;
 191      }
 192  
 193      /**
 194       * Read value
 195       */
 196      public function get_value()
 197      {
 198          $quote = substr($this->data, $this->position, 1);
 199          if ($quote === '"' || $quote === "'") {
 200              $this->position++;
 201              $len = strcspn($this->data, $quote, $this->position);
 202              if ($this->has_data()) {
 203                  $value = substr($this->data, $this->position, $len);
 204                  $this->position += $len + 1;
 205                  return $value;
 206              }
 207          }
 208          return false;
 209      }
 210  
 211      public function before_version_name()
 212      {
 213          if ($this->skip_whitespace()) {
 214              $this->state = self::STATE_VERSION_NAME;
 215          } else {
 216              $this->state = self::STATE_ERROR;
 217          }
 218      }
 219  
 220      public function version_name()
 221      {
 222          if (substr($this->data, $this->position, 7) === 'version') {
 223              $this->position += 7;
 224              $this->skip_whitespace();
 225              $this->state = self::STATE_VERSION_EQUALS;
 226          } else {
 227              $this->state = self::STATE_ERROR;
 228          }
 229      }
 230  
 231      public function version_equals()
 232      {
 233          if (substr($this->data, $this->position, 1) === '=') {
 234              $this->position++;
 235              $this->skip_whitespace();
 236              $this->state = self::STATE_VERSION_VALUE;
 237          } else {
 238              $this->state = self::STATE_ERROR;
 239          }
 240      }
 241  
 242      public function version_value()
 243      {
 244          if ($this->version = $this->get_value()) {
 245              $this->skip_whitespace();
 246              if ($this->has_data()) {
 247                  $this->state = self::STATE_ENCODING_NAME;
 248              } else {
 249                  $this->state = self::STATE_EMIT;
 250              }
 251          } else {
 252              $this->state = self::STATE_ERROR;
 253          }
 254      }
 255  
 256      public function encoding_name()
 257      {
 258          if (substr($this->data, $this->position, 8) === 'encoding') {
 259              $this->position += 8;
 260              $this->skip_whitespace();
 261              $this->state = self::STATE_ENCODING_EQUALS;
 262          } else {
 263              $this->state = self::STATE_STANDALONE_NAME;
 264          }
 265      }
 266  
 267      public function encoding_equals()
 268      {
 269          if (substr($this->data, $this->position, 1) === '=') {
 270              $this->position++;
 271              $this->skip_whitespace();
 272              $this->state = self::STATE_ENCODING_VALUE;
 273          } else {
 274              $this->state = self::STATE_ERROR;
 275          }
 276      }
 277  
 278      public function encoding_value()
 279      {
 280          if ($this->encoding = $this->get_value()) {
 281              $this->skip_whitespace();
 282              if ($this->has_data()) {
 283                  $this->state = self::STATE_STANDALONE_NAME;
 284              } else {
 285                  $this->state = self::STATE_EMIT;
 286              }
 287          } else {
 288              $this->state = self::STATE_ERROR;
 289          }
 290      }
 291  
 292      public function standalone_name()
 293      {
 294          if (substr($this->data, $this->position, 10) === 'standalone') {
 295              $this->position += 10;
 296              $this->skip_whitespace();
 297              $this->state = self::STATE_STANDALONE_EQUALS;
 298          } else {
 299              $this->state = self::STATE_ERROR;
 300          }
 301      }
 302  
 303      public function standalone_equals()
 304      {
 305          if (substr($this->data, $this->position, 1) === '=') {
 306              $this->position++;
 307              $this->skip_whitespace();
 308              $this->state = self::STATE_STANDALONE_VALUE;
 309          } else {
 310              $this->state = self::STATE_ERROR;
 311          }
 312      }
 313  
 314      public function standalone_value()
 315      {
 316          if ($standalone = $this->get_value()) {
 317              switch ($standalone) {
 318                  case 'yes':
 319                      $this->standalone = true;
 320                      break;
 321  
 322                  case 'no':
 323                      $this->standalone = false;
 324                      break;
 325  
 326                  default:
 327                      $this->state = self::STATE_ERROR;
 328                      return;
 329              }
 330  
 331              $this->skip_whitespace();
 332              if ($this->has_data()) {
 333                  $this->state = self::STATE_ERROR;
 334              } else {
 335                  $this->state = self::STATE_EMIT;
 336              }
 337          } else {
 338              $this->state = self::STATE_ERROR;
 339          }
 340      }
 341  }
 342  
 343  class_alias('SimplePie\XML\Declaration\Parser', 'SimplePie_XML_Declaration_Parser');


Generated : Sat Nov 23 08:20:01 2024 Cross-referenced by PHPXref