requireAttributes('id'); $id = $renderer->doText($this->getAttribute('id')); $value = &$context->get($id); if ($value) { return $renderer->doNode($node); } } } class FADefaultTag extends FATemplateTag { function parse(&$context, &$renderer, &$node) { $this->requireAttributes('list'); $id = $this->getAttribute('list'); $list = &$context->get($id); if (is_a($list, 'FAIterator') && !$list->hasNext()) { return $renderer->doNode($node); } } } class FAIfTag extends FATemplateTag { function parse(&$context, &$renderer, &$node) { $this->requireAttributes('var'); $op = $this->requireOne('eq', 'neq', 'gt', 'lt', 'geq', 'leq', 'eqvar', 'neqvar', 'geqvar', 'leqvar'); $operations = array( 'eq' => '==', 'eqvar' => '==', 'neq' => '!=', 'neqvar' => '!=', 'gt' => '>', 'lt' => '<', 'geq' => '>=', 'geqvar' => '>=', 'leq' => '<=', 'leqvar' => '<=', ); $a = $context->get($this->getAttribute('var')); $b = $this->getAttribute($op); // TODO:{[this is ugly[parse[FAIfTag} if(strpos($op, 'var') !== FALSE) { $b = $context->get($b); } $op = $operations[$op]; eval("\$ret = (bool)('$a' $op '$b');"); if ($ret) { return $renderer->doNode($node); } } } class FAImportTag extends FATemplateTag { function parse(&$context, &$renderer, &$node) { $this->requireOne('id', 'file'); if ($this->isAttribute('file')) { $filename = $this->getAttribute('file'); } else { $filename = $context->get($this->getAttribute('id')); } if ($filename) { return $this->renderTemplate($context, $renderer, $filename); } } function renderTemplate(&$context, &$renderer, $filename) { if (!file_exists($filename)) { $filename = $context->get('_base_dir') . $filename; } if (!is_readable($filename)) { trigger_error("Unable to read subtemplate: ".basename($filename), E_USER_WARNING); } else { $parser = &new FATemplateParser; $root = &$parser->parse(file_get_contents($filename)); $buffer = $renderer->doNode($root); return $buffer; } } } class FAListTag extends FATemplateTag { function parse(&$context, &$renderer, &$node) { $this->requireAttributes('list'); $id = $this->getAttribute('list'); $list = &$context->get($id); $ret = ''; if (is_a($list, 'FAIterator')) { $ret = $renderer->doNode($node); } return $ret; } } class FARepeatTag extends FATemplateTag { function parse(&$context, &$renderer, &$node) { $this->requireAttributes('list'); $id = $this->getAttribute('list'); $list = &$context->get($id); $ret = ''; if (is_a($list, 'FAIterator') && $list->reset()) { $alias = $this->getAttribute('as'); while ($list->next()) { $current = &$list->current(); if ($alias) { $scope = array($alias => &$current); } else { $scope = &$current; } $context->push($scope); $ret .= $renderer->doNode($node); $context->pop(); } } return $ret; } } class FASeparatorTag extends FATemplateTag { function parse(&$context, &$renderer, &$node) { $this->requireAttributes('list'); $id = $this->getAttribute('list'); $list = &$context->get($id); $ret = ''; if (is_a($list, 'FAIterator') && $list->hasNext()) { $ret = $renderer->doNode($node); } return $ret; } } class FASwitchTag extends FATemplateTag { function parse(&$context, &$renderer, &$node) { $this->requireAttributes('list', 'var'); $id = $this->getAttribute('list'); $list = &$context->get($id); $ret = ''; // nice hack, using key % count, to get the switch tag to work // peter for the win! $count = count($this->getAttributeArray()) - 2; if (is_a($list, 'FAIterator') && $count > 0) { $key = (int)$list->key(); $val = $this->getAttribute(chr(ord('a') + ($key % $count) )); //echo $key.':'.$this->getAttribute('var').':'. $val .'
'; $scope = array($this->getAttribute('var') => $val); $context->push($scope); $ret = $renderer->doNode($node); $context->pop(); } return $ret; } } ?>