home *** CD-ROM | disk | FTP | other *** search
/ HTML Examples / WP.iso / wordpress / wp-includes / SimplePie / XML / Declaration / Parser.php
Encoding:
PHP Script  |  2012-11-21  |  7.0 KB  |  363 lines

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