Author: kn
Date: Thu Feb 14 15:45:25 2008
New Revision: 7375

Log:
- Redefined parser structure
- Successfully parse empty documents

Added:
    experimental/Document/tests/document_rst_parser_tests.php   (with props)
    experimental/Document/tests/files/rst/parser/
    experimental/Document/tests/files/rst/parser/SOURCE
    experimental/Document/tests/files/rst/parser/empty.rst
    experimental/Document/tests/files/rst/parser/empty.txt   (with props)
    experimental/Document/tests/files/rst/parser/titles.txt   (with props)
Modified:
    experimental/Document/design/class_diagram.png
    experimental/Document/src/document/rst/node.php
    experimental/Document/src/document/rst/nodes/document.php
    experimental/Document/src/document/rst/parser.php
    experimental/Document/src/document_autoload.php
    experimental/Document/tests/suite.php

Modified: experimental/Document/design/class_diagram.png
==============================================================================
Binary files - no diff available.

Modified: experimental/Document/src/document/rst/node.php
==============================================================================
--- experimental/Document/src/document/rst/node.php [iso-8859-1] (original)
+++ experimental/Document/src/document/rst/node.php [iso-8859-1] Thu Feb 14 
15:45:25 2008
@@ -16,7 +16,7 @@
  * @copyright Copyright (C) 2005-2008 eZ systems as. All rights reserved.
  * @license http://ez.no/licenses/new_bsd New BSD License
  */
-class ezcDocumentRstNode extends ezcBaseStruct implements RecursiveIterator
+class ezcDocumentRstNode extends ezcBaseStruct // implements RecursiveIterator
 {
     // Node types
     const DOCUMENT      = 0;
@@ -42,11 +42,8 @@
     /**
      * Construct RST node
      * 
-     * @ignore
      * @param int $type 
-     * @param mixed $content 
-     * @param int $line 
-     * @param int $position 
+     * @param array $nodes 
      * @return void
      */
     public function __construct( $type, array $nodes = array() )
@@ -64,7 +61,7 @@
      */
     public static function __set_state( $properties )
     {
-        return new ezcDocumentRstNode(
+        return new static(
             $properties['type'],
             $properties['nodes']
         );

Modified: experimental/Document/src/document/rst/nodes/document.php
==============================================================================
--- experimental/Document/src/document/rst/nodes/document.php [iso-8859-1] 
(original)
+++ experimental/Document/src/document/rst/nodes/document.php [iso-8859-1] Thu 
Feb 14 15:45:25 2008
@@ -21,11 +21,7 @@
     /**
      * Construct RST document node
      * 
-     * @ignore
-     * @param int $type 
-     * @param mixed $content 
-     * @param int $line 
-     * @param int $position 
+     * @param array $nodes 
      * @return void
      */
     public function __construct( array $nodes = array() )
@@ -34,6 +30,20 @@
         // added.
         parent::__construct( self::DOCUMENT, $nodes );
     }
+
+    /**
+     * Set state after var_export
+     * 
+     * @param array $properties 
+     * @return void
+     * @ignore
+     */
+    public static function __set_state( $properties )
+    {
+        return new ezcDocumentRstDocumentNode(
+            $properties['nodes']
+        );
+    }
 }
 
 ?>

Modified: experimental/Document/src/document/rst/parser.php
==============================================================================
--- experimental/Document/src/document/rst/parser.php [iso-8859-1] (original)
+++ experimental/Document/src/document/rst/parser.php [iso-8859-1] Thu Feb 14 
15:45:25 2008
@@ -51,11 +51,14 @@
         ezcDocumentRstToken::NEWLINE => array(
         ),
         ezcDocumentRstToken::BACKSLASH => array(
-            'reduceBackslash'
+            'shiftBackslash'
         ),
         ezcDocumentRstToken::SPECIAL_CHARS => array(
         ),
         ezcDocumentRstToken::TEXT_LINE => array(
+        ),
+        ezcDocumentRstToken::EOF => array(
+            'shiftDocument'
         ),
     );
 
@@ -69,9 +72,7 @@
      *
      * <code>
      *  array(
-     *      end_of_file => array(
-     *          'reduceDocument'
-     *      ),
+     *      ezcDocumentRstNode::DOCUMENT => 'reduceDocument'
      *      ...
      *  )
      * </code>
@@ -79,6 +80,7 @@
      * @var array
      */
     protected $reductions = array(
+        ezcDocumentRstNode::DOCUMENT    => 'reduceDocument',
     );
 
     /**
@@ -97,14 +99,11 @@
     protected $documentStack = array();
 
     /**
-     * List with parsed tokens.
-     *
-     * Each token which has been parsed will be removed from the list, until
-     * the list is empty.
-     * 
-     * @var array
-     */
-    protected $tokens = array();
+     * The resulting sucessfully parsed document.
+     * 
+     * @var ezcDocumentRstDocumentNode
+     */
+    protected $parsedDocument = null;
 
     /**
      * Construct parser
@@ -112,11 +111,92 @@
      * Construct the parser from an array of tokens (ezcDocumentRstToken), and
      * create a cocument out of this token array.
      *
+     * @ignore
      * @return void
-     */
-    public function __construct( array $tokens )
-    {
-        // @TODO: Implement
+     * /
+    public function __construct()
+    {
+    } // */
+
+    /**
+     * Shift- / reduce-parser for RST token stack
+     * 
+     * @param array $tokens 
+     * @return void
+     */
+    public function parse( array $tokens )
+    {
+        while ( ( $token = array_shift( $tokens ) ) !== null )
+        {
+            // First shift given token by the defined reduction methods
+            foreach ( $this->shifts[$token->type] as $method )
+            {
+                if ( ( $node = $this->$method( $token, $tokens ) ) === false )
+                {
+                    // The shift method processed the token, go to next one.
+                    continue;
+                }
+
+                // Call reduce methods for node
+                $reduction = $this->reductions[$node->type];
+                $this->$reduction( $node );
+
+                // We found a matching rule, so that we can leave the loop
+                break;
+            }
+        }
+
+        // This should always be set at this point, each other case should have
+        // caused an exception.
+        return $this->parsedDocument;
+    }
+
+    /**
+     * Create new document node
+     * 
+     * @param ezcDocumentRstToken $token 
+     * @param array $tokens 
+     * @return ezcDocumentRstDocumentNode
+     */
+    protected function shiftDocument( ezcDocumentRstToken $token, array 
$tokens )
+    {
+        // If there are any tokens left after the end of the file, something
+        // went seriously wrong in the tokenizer.
+        if ( count( $tokens ) )
+        {
+            throw new ezcDocumentRstParserException(
+                $token, ezcDocumentRstParserException::FATAL,
+                'Unexpected end of file.'
+            );
+        }
+
+        return new ezcDocumentRstDocumentNode();
+    }
+
+    /**
+     * Reduce all elements to one document node.
+     * 
+     * @param ezcDocumentRstDocumentNode $node 
+     * @return void
+     */
+    protected function reduceDocument( ezcDocumentRstDocumentNode $node )
+    {
+        foreach ( $this->documentStack as $child )
+        {
+            if ( ( $child->type !== ezcDocumentRstNode::SECTION ) &&
+                 ( $child->type !== ezcDocumentRstNode::METADATA ) )
+            {
+                throw new ezcDocumentRstParserException(
+                    $child, ezcDocumentRstParserException::FATAL,
+                    'Unexpected node.'
+                );
+            }
+
+            $node->nodes[] = $child;
+        }
+
+        $this->documentStack = array();
+        $this->parsedDocument = $node;
     }
 }
 

Modified: experimental/Document/src/document_autoload.php
==============================================================================
--- experimental/Document/src/document_autoload.php [iso-8859-1] (original)
+++ experimental/Document/src/document_autoload.php [iso-8859-1] Thu Feb 14 
15:45:25 2008
@@ -18,6 +18,7 @@
     'ezcDocumentConverter'                  => 
'Document/interfaces/converter.php',
     'ezcDocumentValidation'                 => 
'Document/interfaces/validation.php',
     'ezcDocumentConverterBaseOptions'       => 
'Document/options/converter_base.php',
+    'ezcDocumentRstNode'                    => 
'Document/document/rst/node.php',
     'ezcDocumentXmlBase'                    => 
'Document/document/xml_base.php',
     'ezcDocumentXmlBaseOptions'             => 
'Document/options/document_xml_base.php',
     'ezcDocumentXsltConverter'              => 'Document/converters/xslt.php',
@@ -33,7 +34,9 @@
     'ezcDocumentManager'                    => 'Document/document_manager.php',
     'ezcDocumentRelaxNgValidator'           => 
'Document/validator/realxng.php',
     'ezcDocumentRst'                        => 'Document/document/rst.php',
+    'ezcDocumentRstDocumentNode'            => 
'Document/document/rst/nodes/document.php',
     'ezcDocumentRstOptions'                 => 
'Document/options/document_rst.php',
+    'ezcDocumentRstParser'                  => 
'Document/document/rst/parser.php',
     'ezcDocumentRstToken'                   => 
'Document/document/rst/token.php',
     'ezcDocumentRstTokenizer'               => 
'Document/document/rst/tokenizer.php',
     'ezcDocumentXhtml'                      => 
'Document/document/xml/xhtml.php',

Added: experimental/Document/tests/document_rst_parser_tests.php
==============================================================================
--- experimental/Document/tests/document_rst_parser_tests.php (added)
+++ experimental/Document/tests/document_rst_parser_tests.php [iso-8859-1] Thu 
Feb 14 15:45:25 2008
@@ -1,0 +1,83 @@
+<?php
+/**
+ * ezcDocumentRstParserTests
+ * 
+ * @package Document
+ * @version //autogen//
+ * @subpackage Tests
+ * @copyright Copyright (C) 2005-2007 eZ systems as. All rights reserved.
+ * @license http://ez.no/licenses/new_bsd New BSD License
+ */
+
+/**
+ * Test suite for class.
+ * 
+ * @package Document
+ * @subpackage Tests
+ */
+class ezcDocumentRstParserTests extends ezcTestCase
+{
+    protected static $testDocuments = null;
+
+    public static function suite()
+    {
+        return new PHPUnit_Framework_TestSuite( __CLASS__ );
+    }
+
+    public static function getTestDocuments()
+    {
+        if ( self::$testDocuments === null )
+        {
+            // Get a list of all test files from the respektive folder
+            $testFiles = glob( dirname( __FILE__ ) . '/files/rst/parser/*.txt' 
);
+
+            // Create array with the test file and the expected result file
+            foreach ( $testFiles as $file )
+            {
+                self::$testDocuments[] = array(
+                    $file,
+                    substr( $file, 0, -3 ) . 'rst'
+                );
+            }
+        }
+
+        return self::$testDocuments;
+    }
+
+    /**
+     * @dataProvider getTestDocuments
+     */
+    public function testParseRstFile( $from, $to )
+    {
+        if ( !is_file( $to ) )
+        {
+            $this->markTestSkipped( "Comparision file '$to' not yet defined." 
);
+        }
+
+        $tokenizer  = new ezcDocumentRstTokenizer();
+        $parser     = new ezcDocumentRstParser();
+
+        $document = $parser->parse( $tokenizer->tokenizeFile( $from ) );
+
+        $this->assertTrue(
+            $document instanceof ezcDocumentRstDocumentNode
+        );
+
+        $expected = include $to;
+
+        // Store test file, to have something to compare on failure
+        $tempDir = $this->createTempDir( 'rst_parser_' ) . '/';
+        file_put_contents( $tempDir . basename( $to ), "<?php\n\nreturn " . 
var_export( $document, true ) . ";\n\n" );
+
+        $this->assertEquals(
+            $expected,
+            $document,
+            'Parsed document does not match expected document.'
+        );
+
+        // Remove tempdir, when nothing failed.
+        $this->removeTempDir();
+    }
+}
+
+?>

Propchange: experimental/Document/tests/document_rst_parser_tests.php
------------------------------------------------------------------------------
    svn:eol-style = native

Added: experimental/Document/tests/files/rst/parser/SOURCE
==============================================================================
--- experimental/Document/tests/files/rst/parser/SOURCE (added)
+++ experimental/Document/tests/files/rst/parser/SOURCE [iso-8859-1] Thu Feb 14 
15:45:25 2008
@@ -1,0 +1,5 @@
+Test data
+=========
+
+Extracted from
+http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html

Added: experimental/Document/tests/files/rst/parser/empty.rst
==============================================================================
--- experimental/Document/tests/files/rst/parser/empty.rst (added)
+++ experimental/Document/tests/files/rst/parser/empty.rst [iso-8859-1] Thu Feb 
14 15:45:25 2008
@@ -1,0 +1,9 @@
+<?php
+
+return ezcDocumentRstDocumentNode::__set_state(array(
+   'type' => 0,
+   'nodes' => 
+  array (
+  ),
+));
+

Added: experimental/Document/tests/files/rst/parser/empty.txt
==============================================================================
    (empty)

Propchange: experimental/Document/tests/files/rst/parser/empty.txt
------------------------------------------------------------------------------
    svn:eol-style = native

Added: experimental/Document/tests/files/rst/parser/titles.txt
==============================================================================
--- experimental/Document/tests/files/rst/parser/titles.txt (added)
+++ experimental/Document/tests/files/rst/parser/titles.txt [iso-8859-1] Thu 
Feb 14 15:45:25 2008
@@ -1,0 +1,34 @@
+===============
+ Section Title
+===============
+
+---------------
+ Section Title
+---------------
+
+Section Title
+=============
+
+Section Title
+-------------
+
+Section Title
+`````````````
+
+Section Title
+'''''''''''''
+
+Section Title
+.............
+
+Section Title
+~~~~~~~~~~~~~
+
+Section Title
+*************
+
+Section Title
++++++++++++++
+
+Section Title
+^^^^^^^^^^^^^

Propchange: experimental/Document/tests/files/rst/parser/titles.txt
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: experimental/Document/tests/suite.php
==============================================================================
--- experimental/Document/tests/suite.php [iso-8859-1] (original)
+++ experimental/Document/tests/suite.php [iso-8859-1] Thu Feb 14 15:45:25 2008
@@ -20,6 +20,7 @@
 require_once 'document_options_xml_base_test.php';
 require_once 'document_xml_base_test.php';
 require_once 'document_rst_tokenizer_tests.php';
+require_once 'document_rst_parser_tests.php';
 
 require_once 'converter_options_ezp3_ezp4_test.php';
 require_once 'converter_ezp3_ezp4_test.php';
@@ -41,6 +42,7 @@
         $this->addTest( ezcDocumentOptionsXmlBaseTests::suite() );
         $this->addTest( ezcDocumentXmlBaseTests::suite() );
         $this->addTest( ezcDocumentRstTokenizerTests::suite() );
+        $this->addTest( ezcDocumentRstParserTests::suite() );
 
         $this->addTest( ezcDocumentConverterOptionsEzp3ToEzp4Tests::suite() );
         $this->addTest( ezcDocumentConverterEzp3ToEzp4Tests::suite() );


-- 
svn-components mailing list
svn-components@lists.ez.no
http://lists.ez.no/mailman/listinfo/svn-components

Reply via email to