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: