123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253 |
- <?php
- /* SVN FILE: $Id: HamlNode.php 92 2010-05-20 17:42:59Z chris.l.yates $ */
- /**
- * HamlNode class file.
- * @author Chris Yates <chris.l.yates@gmail.com>
- * @copyright Copyright (c) 2010 PBM Web Development
- * @license http://phamlp.googlecode.com/files/license.txt
- * @package PHamlP
- * @subpackage Haml.tree
- */
- require_once('HamlRootNode.php');
- require_once('HamlCommentNode.php');
- require_once('HamlDoctypeNode.php');
- require_once('HamlElementNode.php');
- require_once('HamlFilterNode.php');
- require_once('HamlHelperNode.php');
- require_once('HamlCodeBlockNode.php');
- require_once('HamlNodeExceptions.php');
- /**
- * HamlNode class.
- * Base class for all Haml nodes.
- * @package PHamlP
- * @subpackage Haml.tree
- */
- class HamlNode {
- /**
- * @var HamlNode root node of this node
- */
- protected $root;
- /**
- * @var HamlNode parent of this node
- */
- protected $parent;
- /**
- * @var array children of this node
- */
- protected $children = array();
- /**
- * @var array source line token
- */
- public $token;
- /**
- * @var boolean whether to show the output in the browser for debug
- */
- public $showOutput;
- /**
- * @var boolean whether to show the source in the browser for debug
- */
- public $showSource;
- /**
- * @var string content to render
- */
- public $content;
- /**
- * @var string output buffer
- */
- protected $output;
- /**
- * @var HamlRenderer Renderer object
- */
- private $_r;
- /**
- * @var array Options
- */
- private $_o;
- public function __construct($content, $parent) {
- $this->content = $content;
- if (!is_null($parent)) { // $parent === null for "else" code blocks
- $this->parent = $parent;
- $this->root = $parent->root;
- $parent->children[] = $this;
- }
- }
- /**
- * Getter.
- * @param string name of property to get
- * @return mixed return value of getter function
- */
- public function __get($name) {
- $getter = 'get' . ucfirst($name);
- if (method_exists($this, $getter)) {
- return $this->$getter();
- }
- throw new HamlNodeException('No getter function for {what}', array('{what}'=>$name));
- }
- /**
- * Setter.
- * @param string name of property to set
- * @return mixed value of property
- * @return HamlNode this node
- */
- public function __set($name, $value) {
- $setter = 'set' . ucfirst($name);
- if (method_exists($this, $setter)) {
- $this->$setter($value);
- return $this;
- }
- throw new HamlNodeException('No setter function for {what}', array('{what}'=>$name));
- }
- /**
- * Return a value indicating if this node has a parent
- * @return array the node's parent
- */
- public function hasParent() {
- return !empty($this->parent);
- }
- /**
- * Returns the node's content and that of its child nodes
- * @param integer the indent level. This is to allow properly indented output
- * that filters (e.g. Sass) may need.
- * @return string the node's content and that of its child nodes
- */
- public function getContent($indentLevel = 0) {
- $output = str_repeat(' ', 2 * $indentLevel++) . $this->content . "\n";
- foreach ($this->children as $child) {
- $output .= $child->getContent($indentLevel);
- } // foreach
- return $output;
- }
- /**
- * Returns the node's parent
- * @return array the node's parent
- */
- public function getParent() {
- return $this->parent;
- }
- /**
- * Returns a value indicating if this node has children
- * @return boolean true if the node has children, false if not
- */
- public function hasChildren() {
- return !empty($this->children);
- }
- /**
- * Returns the node's children
- * @return array the node's children
- */
- public function getChildren() {
- return $this->children;
- }
- /**
- * Returns the last child node of this node.
- * @return HamlNode the last child node of this node
- */
- public function getLastChild() {
- return $this->children[count($this->children) - 1];
- }
- /**
- * Returns the indent level of this node.
- * @return integer the indent level of this node
- */
- private function getLevel() {
- return $this->token['level'];
- }
- /**
- * Sets the indent level of this node.
- * Used during rendering to give correct indentation.
- * @param integer the indent level of this node
- * @return HamlNode this node
- */
- private function setLevel($level) {
- $this->token['level'] = $level;
- return $this;
- }
- /**
- * Returns the source for this node
- * @return string the source for this node
- */
- private function getSource() {
- return $this->token[HamlParser::HAML_SOURCE];
- }
- /**
- * Returns the source for this node
- * @return string the source for this node
- */
- private function getLine() {
- return $this->token['line'];
- }
- /**
- * Returns the filename for this node
- * @return string the filename for this node
- */
- private function getFilename() {
- return $this->token['filename'];
- }
- /**
- * Returns the options.
- * @return array the options
- */
- public function getOptions() {
- if (empty($this->_o)) {
- $this->_r = $this->root->options;
- }
- return $this->_o;
- }
- /**
- * Returns the renderer.
- * @return HamlRenderer the rendered
- */
- public function getRenderer() {
- if (empty($this->_r)) {
- $this->_r = $this->root->renderer;
- }
- return $this->_r;
- }
- public function render() {
- $output = $this->renderer->renderContent($this);
- foreach ($this->children as $child) {
- $output .= $child->render();
- } // foreach
- return $this->debug($output);
- }
- protected function debug($output) {
- $output = ($this->showSource ? $this->showSource($output) : $output);
- return ($this->showOutput && $this->line['indentLevel'] == 0 ?
- nl2br(str_replace(' ', ' ', htmlspecialchars($output))) :
- $output);
- }
- /**
- * Adds a comment with source debug information for the current line to the output.
- * The debug information is:
- * + source file (relative to the application path)
- * + line number
- * + indent level
- * + source code
- * @param array source line(s) that generated the ouput
- */
- protected function showSource($output) {
- return "<!--\n ({$this->line['file']} {$this->line['number']}:{$this->line['indentLevel']})\n {$this->line[HamlParser::HAML_SOURCE]}\n-->\n$output";
- }
- }
|