1 |
<?php |
2 |
|
3 |
/* |
4 |
* This script is for upgrading from 1.3.2 -> 1.4.0. |
5 |
* This script will convert Smarty variable references from the old format to |
6 |
* the new one. For example, what used to look like $section1/foo.bar will now |
7 |
* be $foo[section1].bar. This allows for more readable syntax and also allows |
8 |
* referencing deeply nested structures of arbitrary complexity. |
9 |
*/ |
10 |
|
11 |
/* |
12 |
* Set these to match your template delimeters. |
13 |
*/ |
14 |
$left_delimiter = '{'; |
15 |
$right_delimiter = '}'; |
16 |
|
17 |
|
18 |
if ($argc < 2) { |
19 |
die("\nUsage: php -q fix_vars.php <templates>\n\n"); |
20 |
} |
21 |
|
22 |
$ldq = preg_quote($left_delimiter, '!'); |
23 |
$rdq = preg_quote($right_delimiter, '!'); |
24 |
|
25 |
$qstr_regexp = '"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"|\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\''; |
26 |
$pwd = $HTTP_ENV_VARS['PWD']; |
27 |
|
28 |
foreach (array_slice($argv, 1) as $template) { |
29 |
$template = $pwd . '/' . $template; |
30 |
if (!is_file($template)) continue; |
31 |
|
32 |
$input = implode('', file($template)); |
33 |
$fp = fopen($template.'.out', 'w'); |
34 |
if (!$fp) { |
35 |
die("\nError: could not open $template.out for writing\n\n"); |
36 |
} |
37 |
|
38 |
/* Gather all template tags. */ |
39 |
preg_match_all("!({$ldq}\s*)(.*?)(\s*{$rdq})!s", $input, $match); |
40 |
$template_tags = $match[2]; |
41 |
$template_pre_tags = $match[1]; |
42 |
$template_post_tags = $match[3]; |
43 |
/* Split content by template tags to obtain non-template content. */ |
44 |
$text_blocks = preg_split("!{$ldq}.*?{$rdq}!s", $input); |
45 |
|
46 |
$fixed_tags = array(); |
47 |
for ($i = 0; $i < count($template_tags); $i++) { |
48 |
$fixed_tags[] = fix_tag($template_tags[$i]); |
49 |
} |
50 |
|
51 |
$output = ''; |
52 |
/* Interleave the compiled contents and text blocks to get the final result. */ |
53 |
for ($i = 0; $i < count($fixed_tags); $i++) { |
54 |
$output .= $text_blocks[$i].$template_pre_tags[$i].$fixed_tags[$i].$template_post_tags[$i]; |
55 |
} |
56 |
$output .= $text_blocks[$i]; |
57 |
|
58 |
fwrite($fp, $output); |
59 |
fclose($fp); |
60 |
copy($template.'.out', $template); |
61 |
unlink($template.'.out'); |
62 |
|
63 |
print "Fixed $template.\n"; |
64 |
} |
65 |
|
66 |
function fix_tag($template_tag) |
67 |
{ |
68 |
global $qstr_regexp; |
69 |
|
70 |
if ($template_tag{0} == '*' && $template_tag{strlen($template_tag)-1} == '*') |
71 |
return $template_tag; |
72 |
|
73 |
/* Split tag into two parts: command and the arguments. */ |
74 |
preg_match('/^( |
75 |
(?: ' . $qstr_regexp . ' | (?>[^"\'\s]+))+ |
76 |
) |
77 |
(\s+(.*))? |
78 |
/xs', $template_tag, $match); |
79 |
list(, $tag_command, $tag_args) = $match; |
80 |
if (preg_match('!^\$(\w+(\.\w+)?/)*\w+(?>\.\w+)*(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tag_command)) |
81 |
$tag_command = fix_var($tag_command); |
82 |
else if (preg_match('!^#(\w+)#(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tag_command)) |
83 |
$tag_command = fix_other_var($tag_command); |
84 |
else if (preg_match('!^%\w+\.\w+%(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tag_command)) |
85 |
$tag_command = fix_other_var($tag_command); |
86 |
|
87 |
if (function_exists("preg_replace_callback")) { |
88 |
$tag_args = preg_replace_callback('!(?<=[\s(:=])\$(\w+(\.\w+)?/)*\w+(?>\.\w+)*(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|}\s]+))*)*!', 'fix_var_match', $tag_args); |
89 |
$tag_args = preg_replace_callback('!(?<=[\s(:=])#(\w+)#(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|}\s]+))*)*!', 'fix_other_var_match', $tag_args); |
90 |
$tag_args = preg_replace_callback('!(?<=[\s(:=])%\w+\.\w+%(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|}\s]+))*)*!', 'fix_other_var_match', $tag_args); |
91 |
} else { |
92 |
$tag_args = preg_replace('!(?<=[\s(:=])\$(\w+(\.\w+)?/)*\w+(?>\.\w+)*(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|}\s]+))*)*!F', 'fix_var_match', $tag_args); |
93 |
$tag_args = preg_replace('!(?<=[\s(:=])#(\w+)#(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|}\s]+))*)*!F', 'fix_other_var_match', $tag_args); |
94 |
$tag_args = preg_replace('!(?<=[\s(:=])%\w+\.\w+%(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|}\s]+))*)*!F', 'fix_other_var_match', $tag_args); |
95 |
} |
96 |
|
97 |
return $tag_command.$tag_args; |
98 |
} |
99 |
|
100 |
function fix_vars_props($tokens) |
101 |
{ |
102 |
global $qstr_regexp; |
103 |
|
104 |
$var_exprs = preg_grep('!^\$(\w+(\.\w+)?/)*\w+(?>\.\w+)*(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tokens); |
105 |
$conf_var_exprs = preg_grep('!^#(\w+)#(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tokens); |
106 |
$sect_prop_exprs = preg_grep('!^%\w+\.\w+%(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tokens); |
107 |
|
108 |
if (count($var_exprs)) { |
109 |
foreach ($var_exprs as $expr_index => $var_expr) { |
110 |
$tokens[$expr_index] = fix_var($var_expr); |
111 |
} |
112 |
} |
113 |
|
114 |
/* |
115 |
if (count($conf_var_exprs)) { |
116 |
foreach ($conf_var_exprs as $expr_index => $var_expr) { |
117 |
$tokens[$expr_index] = $this->_parse_conf_var($var_expr); |
118 |
} |
119 |
} |
120 |
|
121 |
if (count($sect_prop_exprs)) { |
122 |
foreach ($sect_prop_exprs as $expr_index => $section_prop_expr) { |
123 |
$tokens[$expr_index] = $this->_parse_section_prop($section_prop_expr); |
124 |
} |
125 |
} |
126 |
*/ |
127 |
|
128 |
return $tokens; |
129 |
} |
130 |
|
131 |
function fix_var_match($match) |
132 |
{ |
133 |
return fix_var($match[0]); |
134 |
} |
135 |
|
136 |
function fix_other_var_match($match) |
137 |
{ |
138 |
return fix_other_var($match[0]); |
139 |
} |
140 |
|
141 |
function fix_var($var_expr) |
142 |
{ |
143 |
list($var_ref, $modifiers) = explode('|', substr($var_expr, 1), 2); |
144 |
|
145 |
$sections = explode('/', $var_ref); |
146 |
$props = explode('.', array_pop($sections)); |
147 |
$var_name = array_shift($props); |
148 |
|
149 |
$output = "\$$var_name"; |
150 |
|
151 |
foreach ($sections as $section_ref) { |
152 |
$output .= "[$section_ref]"; |
153 |
} |
154 |
if (count($props)) |
155 |
$output .= ".".implode('.', $props); |
156 |
|
157 |
if ($modifiers) |
158 |
$output .= fix_modifiers($modifiers); |
159 |
|
160 |
return $output; |
161 |
} |
162 |
|
163 |
function fix_other_var($var_expr) |
164 |
{ |
165 |
list($var_ref, $modifiers) = explode('|', $var_expr, 2); |
166 |
|
167 |
$output = $var_ref; |
168 |
if ($modifiers) |
169 |
$output .= fix_modifiers($modifiers); |
170 |
|
171 |
return $output; |
172 |
} |
173 |
|
174 |
function fix_modifiers($modifier_string) |
175 |
{ |
176 |
global $qstr_regexp; |
177 |
|
178 |
preg_match_all('!\|(@?\w+)((?>:(?:'. $qstr_regexp . '|[^|]+))*)!', '|' . $modifier_string, $match); |
179 |
list(, $modifiers, $modifier_arg_strings) = $match; |
180 |
$output = ''; |
181 |
for ($i = 0; $i < count($modifiers); $i++) { |
182 |
$modifier_name = $modifiers[$i]; |
183 |
preg_match_all('!:(' . $qstr_regexp . '|[^:]+)!', $modifier_arg_strings[$i], $match); |
184 |
$modifier_args = fix_vars_props($match[1]); |
185 |
|
186 |
$output .= '|' . $modifier_name; |
187 |
if ($modifier_args) |
188 |
$output .= ':'.implode(':', $modifier_args); |
189 |
} |
190 |
|
191 |
return $output; |
192 |
} |
193 |
|
194 |
?> |