<?php/** * Copyright 2010 Joey Mazzarelli. All rights reserved. * * Redistribution and use in source, with or without modification, is * permitted provided that the following condition is met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * THIS SOFTWARE IS PROVIDED BY JOEY MAZZARELLI ``AS IS'' AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL JOEY MAZZARELLI OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. * * The views and conclusions contained in the software and documentation * are those of the authors and should not be interpreted as representing * official policies, either expressed or implied, of Joey Mazzarelli. *//** * Abstract node in the trekel parse tree * * The term "tree" is used loosely here. The grammar is constructed * such that the tree will only ever be a list. So only one child will * ever exist for a given node. * * @package Trekel * @subpackage Trekel_Node * @author Joey Mazzarelli <joey@mazzarelli.com> * @copyright 2011 Joey Mazzarelli */abstractclassTrekel_Node{/** * Reduce a node * @param object $node Node of tree to evaluate * @param int $idx Index of node in matched results * @param int $total Total number of matched results * @return Trekel_List */abstractpublicfunctionreduce($node,$idx,$total);/** * A node only has one child. * @var Trekel_Node */protected$child=null;/** * The identifier of this node, the meaning of which may be context sensitive. * @var string */protected$identifier=null;/** * The selector of this node, the meaning of which may be context sensitive. * @var string */protected$selector=null;/** * Set the selector * @param string $selector Selector for this node * @return void */publicfunctionsetSelector($selector){$this->selector=$selector;}/** * Get the selector * @return string */publicfunctiongetSelector(){return$this->selector;}/** * Set the identifier * @param string $identifier Identifier for this node * @return void */publicfunctionsetIdentifier($id){$this->setSelector($id);$this->identifier=$id;}/** * Get the identifier * @return string */publicfunctiongetIdentifier(){return$this->identifier;}/** * Set the child * @param Trekel_Node $node Node to use as child * @return void */publicfunctionsetChild($node){$this->child=$node;}/** * Push a child to the bottom of the tree * @param Trekel_Node $node Node to push onto tree * @return void */publicfunctionpushChild($node){if($this->child){$this->child->pushChild($node);}else{$this->setChild($node);}}/** * Get the child * @return Trekel_Node */publicfunctiongetChild(){return$this->child;}/** * List of matching nodes * @var Trekel_List */private$matches=null;/** * Get ready to collect matches * @return void */protectedfunctioninitMatches(){$this->matches=newTrekel_List();}/** * Match based on type * @param object $node Node to match * @return void */protectedfunctionmatchType($node){$type=$this->getIdentifier();if('*'==$type||$nodeinstanceof$type){$this->matches->append($node);}}/** * Unconditionally match a node * @param object $node Node to add as a match * @return void */protectedfunctionmatchNode($node){$this->matches->append($node);}/** * Match a node when values are equal * @param mixed $actual Actual value to match * @param mixed $expected Expected value to match against * @param object $node Node to match upon value equality * @return Trekel_List */protectedfunctionmatchValue($actual,$expected,$node){$this->initMatches();if($actual===$expected){$this->matchNode($node);}return$this->getMatches();}/** * Get the list of matches * @return Trekel_List */protectedfunctiongetMatches(){return$this->matches;}/** * Queue used for state * @var Trekel_List */private$queue;/** * Start the queue with a give node or nodes * @param array|object $node Node to initialize with * @return void */protectedfunctioninitQueue($node){$this->queue=newTrekel_List();$this->enqueue($node);}/** * Enqueue a node or nodes * @param array|object $node Node to enqueue * @return void */protectedfunctionenqueue($node){if(is_array($node)){$this->queue->appendAll($node);}else{$this->queue->append($node);}}/** * Dequeue a node * @return object */protectedfunctiondequeue(){return$this->queue->next();}}// end Trekel_Node