Index: openacs-4/packages/acs-templating/tcl/parse-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-templating/tcl/parse-procs.tcl,v diff -u -N -r1.37 -r1.38 --- openacs-4/packages/acs-templating/tcl/parse-procs.tcl 24 Feb 2005 13:33:02 -0000 1.37 +++ openacs-4/packages/acs-templating/tcl/parse-procs.tcl 21 Nov 2005 17:32:48 -0000 1.38 @@ -449,15 +449,16 @@ # array variables # TODO: ad_quotehtml # TODO: lang::util::localize - regsub {^%([a-zA-Z0-9_]+)\.([a-zA-Z0-9_]+)%$} $substitution {$\1(\2)} substitution - # ordinary variables - regsub {^%([a-zA-Z0-9_:]+)%$} $substitution {$\1} substitution - - # Create command to execute in caller's scope - set command "subst -nocommands \"$substitution\"" - - # and execute that - set substitution [uplevel $command] + regsub -all {[\]\[\{\}\"]\\$} $substitution {\\&} substitution + if { [regexp {^%([a-zA-Z0-9_]+)\.([a-zA-Z0-9_]+)%$} $substitution match arr key] } { + # the array key name is substitured by the tcl parser s + regsub -all {[\]\[\{\}\"]\\$} $key {\\&} key + set substitution [uplevel $command] + } + if { [regexp {^%([a-zA-Z0-9_:]+)%$} $substitution match var] } { + set command "set $var" + set substitution [uplevel $command] + } } append formatted_message $substitution @@ -466,6 +467,15 @@ append formatted_message $remaining_message return $formatted_message + + +# + + + + + + } ad_proc -public template::adp_compile { source_type source } { Index: openacs-4/packages/acs-templating/tcl/test/parse-test-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-templating/tcl/test/parse-test-procs.tcl,v diff -u -N -r1.3 -r1.4 --- openacs-4/packages/acs-templating/tcl/test/parse-test-procs.tcl 17 Sep 2005 06:07:19 -0000 1.3 +++ openacs-4/packages/acs-templating/tcl/test/parse-test-procs.tcl 21 Nov 2005 17:32:48 -0000 1.4 @@ -60,3 +60,31 @@ aa_equals "parses list of 2 or more" [template::util::tcl_to_sql_list [list isn't hess' 'bit 'trippy']] "'isn''t', 'hess''', '''bit', '''trippy'''" } + +aa_register_case -cats {api smoke} expand_percentage_signs { + Test expand percentage signs to make sure it substitures correctly + + @author Dave Bauer + @creation-date 2005-11-20 +} { + set orig_message "Test message %one%" + set one "\[__does_not_exist__\]" + set message $orig_message + + aa_false "Expanded square bracket text" [catch {set expanded_message [template::expand_percentage_signs $message]} errmsg] + aa_log $errmsg + aa_equals "square brackets safe" $expanded_message "Test message \[__does_not_exist__\]" + + set one "\$__does_not_exist" + aa_false "Expanded dollar test" [catch {set expanded_message [template::expand_percentage_signs $message]} errmsg] + aa_log $errmsg + aa_equals "dollar sign safe" $expanded_message "Test message \$__does_not_exist" + + set one "\$two(\$three(\[__does_not_exist\]))" + + aa_false "Square bracket in array key test" [catch {set expanded_message [template::expand_percentage_signs $message]} errmsg] + aa_log $errmsg + aa_equals "square brackets in array key safe" $expanded_message "Test message \$two(\$three(\[__does_not_exist\]))" + +} +