gwynne Sat Jul 28 23:58:06 2007 UTC
Modified files: /phd/formats xhtml.php /phd/include PhDReader.class.php Log: Revert my last commit. It was dumb.
http://cvs.php.net/viewvc.cgi/phd/formats/xhtml.php?r1=1.6&r2=1.7&diff_format=u Index: phd/formats/xhtml.php diff -u phd/formats/xhtml.php:1.6 phd/formats/xhtml.php:1.7 --- phd/formats/xhtml.php:1.6 Sat Jul 28 14:27:32 2007 +++ phd/formats/xhtml.php Sat Jul 28 23:58:06 2007 @@ -1,6 +1,6 @@ <?php -/* $Id: xhtml.php,v 1.6 2007/07/28 14:27:32 gwynne Exp $ +/* $Id: xhtml.php,v 1.7 2007/07/28 23:58:06 gwynne Exp $ +-------------------------------------------------------------------------+ | Copyright(c) 2007 | | Authors: | @@ -155,7 +155,7 @@ public function format_listing_hyperlink_function( $matches ) { $link = str_replace( '_', '-', $matches[ 1 ] ); - $link = "function{$link}.html"; + $link = "function${link}.html"; return '<a class="phpfunc" href="'.$link.'">'.$matches[ 1 ].'</a></span>'.$matches[ 2 ]; } http://cvs.php.net/viewvc.cgi/phd/include/PhDReader.class.php?r1=1.5&r2=1.6&diff_format=u Index: phd/include/PhDReader.class.php diff -u phd/include/PhDReader.class.php:1.5 phd/include/PhDReader.class.php:1.6 --- phd/include/PhDReader.class.php:1.5 Sat Jul 28 14:27:32 2007 +++ phd/include/PhDReader.class.php Sat Jul 28 23:58:06 2007 @@ -1,6 +1,6 @@ <?php -/* $Id: PhDReader.class.php,v 1.5 2007/07/28 14:27:32 gwynne Exp $ +/* $Id: PhDReader.class.php,v 1.6 2007/07/28 23:58:06 gwynne Exp $ +-------------------------------------------------------------------------+ | Copyright(c) 2007 | | Authors: | @@ -17,34 +17,8 @@ +-------------------------------------------------------------------------+ */ -// All XML namespaces used by PhD must be defined as constants here. NEVER hardcode namespace URLs. -define( 'XMLNS_XML', 'http://www.w3.org/XML/1998/namespace' ); -define( 'XMLNS_XLINK', 'http://www.w3.org/1999/xlink' ); -define( 'XMLNS_PHD', 'http://phd.php.net/namespace' ); - -// Special flag for non-iterative attributes -define( 'PHD_WANT_INLINE_ATTRIBUTES', 99 ); - abstract class PhDReader extends XMLReader { - // *** - // Properties - - // What END_ELEMENT node name, namespace, and depth to stop at, NULL if none. - protected $lastElementName = NULL; - protected $lastElementNS = NULL; - protected $lastElementDepth = NULL; - - // The current list of attributes for inline attribute access. - protected $attrList = NULL; - - // The current list of name->value replacements from <define/> elements. - protected $replacementList = array(); - - // The current input stream. This isn't so unlike the flex idea of multiple input streams. - // We use this to implement includes without doing all kinds of crazy things. - protected $inputSource = NULL; - protected $map = array(); public function __construct( $file, $encoding = "utf-8", $options = NULL ) { @@ -52,155 +26,30 @@ if ( !parent::open( $file, $encoding, $options ) ) { throw new Exception(); } - $this->inputSource = $this; } public function __destruct() { } - // *** - // Format subclasses must implement these to make them real formats. - // THIS IS THE OFFICIAL OUTPUT FORMAT INTERFACE. - - // proto string getFormatName( void ) - // Return the name of the format. + /* Format subclasses must implement these to make them real formats. */ abstract public function getFormatName(); - - // proto array getNodeTypeList( void ) - // Return an array of node types that the format cares about - // processing. Nodes with types not in this array will be SKIPPED. In - // the special case of a NULL value being returned, PhD will pass all - // nodes through to the output file unmodified; the identity - // transformation format would do this. A format that returns an empty - // array will result in an empty output document! - abstract protected function getNodeTypeList(); + abstract protected function transformFromMap( $open, $name ); - // proto string transformNode( string name, int type ) - // Transform a given node, returning the binary string output. Binary - // strings ARE handled safely. This function will be called for all - // types of nodes returned by getNodeTypeList(). In the special case - // of a NULL (not empty!) value being returned, parsing will halt - // immediately WITHOUT an error. Use the usual means to trigger a - // processing error. It is always valid for this method to make the - // parser move around in the file. - abstract protected function transformNode( $name, $type ); + /* These are new functions, extending XMLReader. */ - // proto bool isChunkBoundary( void ) - // Return TRUE if it's time to chunk the output, FALSE otherwise. - // Always return FALSE to avoid chunking. A chunk boundary always - // includes the current node. This will often be modified by themes. - abstract protected function isChunkBoundary(); - - // *** - // Public methods - - // Seek to an ID. This is used to start the parser somewhere that isn't at - // the beginning (duh). Be careful; this does not cause the parser to halt - // at the closing element of a successful seek. Use setRoot() for that. - // Don't forget to check the return value. + /* Seek to an ID within the file. */ public function seek( $id ) { - while ( $this->inputSource->read() ) { - if ( $this->inputSource->nodeType == XMLReader::ELEMENT && $this->inputSource->hasAttributes && - $id == $this->inputSource->getAttributeNs( "id", XMLNS_XML ) ) { - return TRUE; + while( parent::read() ) { + if ( $this->nodeType == XMLREADER::ELEMENT && $this->hasAttributes && + $this->moveToAttributeNs( "id", "http://www.w3.org/XML/1998/namespace" ) && $this->value == $id ) { + return $this->moveToElement(); } } return FALSE; } - - // Seek to an ID AND set it as the root element for the parser. The node - // must be an element for this to succeed. - public function setRoot( $id ) { - - if ( $this->inputSource->seek( $id ) ) { - if ( $this->inputSource->nodeType != XMLReader::ELEMENT ) { - return FALSE; - } - $this->lastElementName = $this->inputSource->name; - $this->lastElementNS = $this->inputSource->namespaceURI; - $this->lastElementDepth = $this->inputSource->depth; - return TRUE; - } - return FALSE; - - } - - // Run a transformation starting from the current node until the next chunk - // boundary. This is recommended for small to medium-sized chunks. If the - // chunk buffer grows beyond a reasonable limit (adjusted in config.php), - // the parser will start spooling to disk. - public function transformChunk() { - global $OPTIONS; - - if ( ( $chunkData = fopen( "php://temp/maxmemory:{$OPTIONS[ 'chunking_memory_limit' ]}", 'r+' ) ) === FALSE ) { - PhD_Error( "Couldn't create the chunk spooling stream. Why?" ); - } - $nodeTypeList = $this->getNodeTypeList(); - $attributeMode = ( in_array( PHD_WANT_INLINE_ATTRIBUTES, $nodeTypeList ) ? 1 : - in_array( XMLReader::ATTRIBUTE, $nodeTypeList ) ? 2 : 0 ); - - do { - $type = $this->inputSource->nodeType; - - // First, handle elements in the PhD namespace specially. - if ( $type == XMLReader::ELEMENT && $this->inputSource->namespaceURI == XMLNS_PHD ) { - if ( $this->handlePhDElement() ) { // this will probably recurse! - continue; - } - } - - // Next, check for a chunking boundary. - if ( $this->isChunkingBoundary() ) { - break; - } - - // If the format wanted inline attributes and this is an element node, gobble up the attrs for the format to use. - if ( $attributeMode == 1 && $type == XMLReader::ELEMENT && $this->inputSource->hasAttributes ) { - $this->gobbleAttributes(); - } - - // Next, pass the node to the format, if it wants it. - if ( in_array( $type, $nodeTypeList ) ) { - fwrite( $chunkData, $this->transformNode( $this->inputSource->name, $type ) ); - } - - // Next, if this is an element node AND the format wants attribute nodes iteratively, iterate them as a subset - if ( $type == XMLReader::ELEMENT && $this->inputSource->hasAttributes && $attributeMode == 2 ) { - fwrite( $chunkData, $this->iterateAttributes() ); - } - - // Next, clear out the last set of attributes if any. - $this->attrList = NULL; - - // And finally, advance to the next node. - } while ( $this->inputSource->read() ); - - rewind( $chunkData ); - $finalData = stream_get_contents( $chunkData ); - fclose( $chunkData ); - return $finalData; - - } - - // This is probably the most problematic issue in all the engine: - // How to handle all our custom elements gracefully with a pull model - protected function handlePhDElement() { - - switch ( $this->name ) { - case 'include': { - $this->includeFile( strlen( $t = $this->inputSource->getAttribute( 'target' ) ) ? $t : - $this->inputSource->getAttributeNs( 'href', XMLNS_XLINK ) ); - return TRUE; - } - case 'define': { - $this->replacementList[ $this->inputSource->getAttribute( 'name' ) ] = $this->inputSource->readInnerXML(); - return TRUE; - } - case 'constant': { - $this->substituteConstant( /* Go to the next useful node in the file. */ public function nextNode() { @@ -281,7 +130,7 @@ if( isset( $this->map[ $name ] ) ) { return $this->transformFromMap( $type == XMLReader::ELEMENT, $name ); } - return call_user_func( array( $this, "format_{$name}" ), $type == XMLReader::ELEMENT ); + return call_user_func( array( $this, "format_${name}" ), $type == XMLReader::ELEMENT ); break; case XMLReader::TEXT: