[gosa.git] / gosa-core / include / smarty / sysplugins / smarty_internal_compile_private_print_expression.php
1 <?php
2 /**
3 * Smarty Internal Plugin Compile Print Expression
4 *
5 * Compiles any tag which will output an expression or variable
6 *
7 * @package Smarty
8 * @subpackage Compiler
9 * @author Uwe Tews
10 */
12 /**
13 * Smarty Internal Plugin Compile Print Expression Class
14 *
15 * @package Smarty
16 * @subpackage Compiler
17 */
18 class Smarty_Internal_Compile_Private_Print_Expression extends Smarty_Internal_CompileBase {
20 /**
21 * Attribute definition: Overwrites base class.
22 *
23 * @var array
24 * @see Smarty_Internal_CompileBase
25 */
26 public $optional_attributes = array('assign');
27 /**
28 * Attribute definition: Overwrites base class.
29 *
30 * @var array
31 * @see Smarty_Internal_CompileBase
32 */
33 public $option_flags = array('nocache', 'nofilter');
35 /**
36 * Compiles code for gererting output from any expression
37 *
38 * @param array $args array with attributes from parser
39 * @param object $compiler compiler object
40 * @param array $parameter array with compilation parameter
41 * @return string compiled code
42 */
43 public function compile($args, $compiler, $parameter)
44 {
45 // check and get attributes
46 $_attr = $this->getAttributes($compiler, $args);
47 // nocache option
48 if ($_attr['nocache'] === true) {
49 $compiler->tag_nocache = true;
50 }
51 // filter handling
52 if ($_attr['nofilter'] === true) {
53 $_filter = 'false';
54 } else {
55 $_filter = 'true';
56 }
57 if (isset($_attr['assign'])) {
58 // assign output to variable
59 $output = "<?php \$_smarty_tpl->assign({$_attr['assign']},{$parameter['value']});?>";
60 } else {
61 // display value
62 $output = $parameter['value'];
63 // tag modifier
64 if (!empty($parameter['modifierlist'])) {
65 $output = $compiler->compileTag('private_modifier', array(), array('modifierlist' => $parameter['modifierlist'], 'value' => $output));
66 }
67 if (!$_attr['nofilter']) {
68 // default modifier
69 if (!empty($compiler->smarty->default_modifiers)) {
70 if (empty($compiler->default_modifier_list)) {
71 $modifierlist = array();
72 foreach ($compiler->smarty->default_modifiers as $key => $single_default_modifier) {
73 preg_match_all('/(\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\'|"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"|:|[^:]+)/', $single_default_modifier, $mod_array);
74 for ($i = 0, $count = count($mod_array[0]);$i < $count;$i++) {
75 if ($mod_array[0][$i] != ':') {
76 $modifierlist[$key][] = $mod_array[0][$i];
77 }
78 }
79 }
80 $compiler->default_modifier_list = $modifierlist;
81 }
82 $output = $compiler->compileTag('private_modifier', array(), array('modifierlist' => $compiler->default_modifier_list, 'value' => $output));
83 }
84 // autoescape html
85 if ($compiler->template->smarty->escape_html) {
86 $output = "htmlspecialchars({$output}, ENT_QUOTES, SMARTY_RESOURCE_CHAR_SET)";
87 }
88 // loop over registerd filters
89 if (!empty($compiler->template->smarty->registered_filters[Smarty::FILTER_VARIABLE])) {
90 foreach ($compiler->template->smarty->registered_filters[Smarty::FILTER_VARIABLE] as $key => $function) {
91 if (!is_array($function)) {
92 $output = "{$function}({$output},\$_smarty_tpl)";
93 } else if (is_object($function[0])) {
94 $output = "\$_smarty_tpl->smarty->registered_filters[Smarty::FILTER_VARIABLE][{$key}][0]->{$function[1]}({$output},\$_smarty_tpl)";
95 } else {
96 $output = "{$function[0]}::{$function[1]}({$output},\$_smarty_tpl)";
97 }
98 }
99 }
100 // auto loaded filters
101 if (isset($compiler->smarty->autoload_filters[Smarty::FILTER_VARIABLE])) {
102 foreach ((array)$compiler->template->smarty->autoload_filters[Smarty::FILTER_VARIABLE] as $name) {
103 $result = $this->compile_output_filter($compiler, $name, $output);
104 if ($result !== false) {
105 $output = $result;
106 } else {
107 // not found, throw exception
108 throw new SmartyException("Unable to load filter '{$name}'");
109 }
110 }
111 }
112 if (isset($compiler->template->variable_filters)) {
113 foreach ($compiler->template->variable_filters as $filter) {
114 if (count($filter) == 1 && ($result = $this->compile_output_filter($compiler, $filter[0], $output)) !== false) {
115 $output = $result;
116 } else {
117 $output = $compiler->compileTag('private_modifier', array(), array('modifierlist' => array($filter), 'value' => $output));
118 }
119 }
120 }
121 }
123 $compiler->has_output = true;
124 $output = "<?php echo {$output};?>";
125 }
126 return $output;
127 }
129 /**
130 * @param object $compiler compiler object
131 * @param string $name name of variable filter
132 * @param type $output embedded output
133 * @return string
134 */
135 private function compile_output_filter($compiler, $name, $output)
136 {
137 $plugin_name = "smarty_variablefilter_{$name}";
138 $path = $compiler->smarty->loadPlugin($plugin_name, false);
139 if ($path) {
140 if ($compiler->template->caching) {
141 $compiler->template->required_plugins['nocache'][$name][Smarty::FILTER_VARIABLE]['file'] = $path;
142 $compiler->template->required_plugins['nocache'][$name][Smarty::FILTER_VARIABLE]['function'] = $plugin_name;
143 } else {
144 $compiler->template->required_plugins['compiled'][$name][Smarty::FILTER_VARIABLE]['file'] = $path;
145 $compiler->template->required_plugins['compiled'][$name][Smarty::FILTER_VARIABLE]['function'] = $plugin_name;
146 }
147 } else {
148 // not found
149 return false;
150 }
151 return "{$plugin_name}({$output},\$_smarty_tpl)";
152 }
154 }
156 ?>