public static function get_directive($directive_code, $component = null) { $directive_name = DirectiveParser::get_directive_name($directive_code); switch ($directive_name) { case 'include': $directive = new IncludeDirective($component); break; case 'foreach': $directive = new ForeachDirective(); break; case 'if': $directive = new IfDirective($component); break; case 'render_component_children': $directive = new RenderComponentChildren($component); break; case 'render_child_component_by_name': $directive = new RenderChildComponentByName($component); break; } self::init_directive($directive, $directive_code); return $directive; }
private function process_nested_directives($output) { $startpos = strpos($output, DirectiveParser::DIRECTIVE_START); while ($startpos > -1) { $endpos = strpos($output, DirectiveParser::DIRECTIVE_END, $startpos); $length = $endpos - $startpos + 3; $raw_directive = substr($output, $startpos, $length); $directive_name = DirectiveParser::get_directive_name($raw_directive); if (DirectiveFactory::is_nested_directive($directive_name)) { $end_tag = DirectiveParser::DIRECTIVE_START . '/' . $directive_name . DirectiveParser::DIRECTIVE_END; $endpos = strpos($output, $end_tag); $length = $endpos - $startpos + strlen($end_tag); $raw_directive = substr($output, $startpos, $length); $replace = $this->process_directive($raw_directive, $output); $endpos = $startpos + strlen($replace); $output = substr_replace($output, $replace, $startpos, $length); } $startpos = strpos($output, DirectiveParser::DIRECTIVE_START, $endpos); // next occurence } return $output; }