--- loncom/xml/londefdef.pm 2005/11/27 23:54:00 1.294
+++ loncom/xml/londefdef.pm 2006/03/22 19:37:44 1.322
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Tags Default Definition Module
#
-# $Id: londefdef.pm,v 1.294 2005/11/27 23:54:00 foxr Exp $
+# $Id: londefdef.pm,v 1.322 2006/03/22 19:37:44 albertel Exp $
#
#
# Copyright Michigan State University Board of Trustees
@@ -48,7 +48,7 @@ use Apache::lonmenu();
use Apache::lonmeta();
use Apache::Constants qw(:common);
use File::Basename;
-use Data::Dumper;
+# use Data::Dumper;
BEGIN {
@@ -61,17 +61,15 @@ BEGIN {
# Need this 'cause evidently when given an array, Data::Dumper only seems
# to dump element 0.
#
-sub debug_dump_table {
- my $lastrow = $#Apache::londefdef::table;
- &Apache::lonnet::logthis("Dumping table: Last row index: $lastrow");
- my $row;
- for ($row =0; $row <= $lastrow; $row++ ) {
- my $text = Dumper($Apache::londefdef::table[$row]);
- &Apache::lonnet::logthis("table [ $row ]".$text);
-
- }
-}
-
+#sub debug_dump_table {
+# my $lastrow = $#Apache::londefdef::table;
+# &Apache::lonnet::logthis("Dumping table: Last row index: $lastrow");
+# my $row;
+# for ($row =0; $row <= $lastrow; $row++ ) {
+# my $text = Dumper($Apache::londefdef::table[$row]);
+# &Apache::lonnet::logthis("table [ $row ]".$text);
+# }
+#}
sub initialize_londefdef {
$Apache::londefdef::TD_redirection=0;
@Apache::londefdef::table = ();
@@ -107,11 +105,21 @@ sub start_m {
$inside=&Apache::run::evaluate($inside,$safeeval,$$parstack[-1]);
#&Apache::lonxml::debug("M is evaulated to:$inside:");
}
+ my $tex = $inside;
my $display=&Apache::lonxml::get_param('display',$parstack,$safeeval);
$currentstring = &Apache::lontexconvert::converted(\$inside,$display);
if ($Apache::lontexconvert::errorstring) {
- &Apache::lonxml::warning("tth error: ".
- $Apache::lontexconvert::errorstring);
+ my $errormsg='
tag (end tag required)
sub start_center {
- my ($target,$token) = @_;
+ my ($target,$token,$tagstack) = @_;
my $currentstring = &end_p(); # Close off any prior para.
if ($target eq 'web') {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
+ if (&is_inside_of($tagstack, "table")) {
+ $currentstring .= ¢er_correction();
+ }
$currentstring .= '\begin{center}';
}
return $currentstring;
}
sub end_center {
- my ($target,$token) = @_;
+ my ($target,$token,$tagstack) = @_;
my $currentstring = '';
if ($target eq 'web') {
$currentstring = $token->[2];
@@ -1178,11 +1194,15 @@ sub start_p {
$closing_string = ''; # Deal correctly with e.g.
}
} elsif ($target eq 'tex' && !$para_disabled) {
+
$currentstring .= &end_p(); # close off prior para if in progress.
my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
if ($align eq 'center') {
$currentstring .='\begin{center}\par';
$closing_string = '\end{center}';
+ if (&is_inside_of($tagstack, "table")) {
+ $currentstring = ¢er_correction().$currentstring;
+ }
} elsif ($align eq 'right') {
$currentstring.='\makebox['.$env{'form.textwidth'}.']{\hfill\llap{';
$closing_string= '}}';
@@ -1191,7 +1211,11 @@ sub start_p {
$closing_string = '}\hfill}';
} else {
$currentstring.='\par ';
- $closing_string = '\strut\\\\\strut ';
+ if (&is_inside_of($tagstack, 'table')) {
+ $closing_string = '\vskip 0pt'; # Seems to be consistent with in tables.
+ } else {
+ $closing_string = '\strut\\\\\strut ';
+ }
}
}
@@ -1524,6 +1548,9 @@ sub start_div {
if ($align eq 'center') {
$currentstring .= '\begin{center}';
$endstring = '\end{center}';
+ if (&is_inside_of($tagstack, "table")) {
+ $currentstring = ¢er_correction().$currentstring;
+ }
}
elsif ($align eq 'right') {
$currentstring .= '\begin{flushright}';
@@ -1944,11 +1971,16 @@ sub start_table {
# width either comes forced from the TeXwidth or the width parameters.
# in either case it can be a percentage or absolute width.
-
+ # in the width case we ignore absolute width
my $TeXwidth = &Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0);
- if (not defined $TeXwidth) {
- $TeXwidth = &Apache::lonxml::get_param('width',$parstack,$safeeval,undef,1);
-
+ if (!defined($TeXwidth)) {
+ my $htmlwidth = &Apache::lonxml::get_param('width',$parstack,
+ $safeeval,undef,1);
+ if ($htmlwidth =~ /%/) {
+ $TeXwidth = $htmlwidth;
+ } else {
+ $TeXwidth = $textwidth;
+ }
} else {
$Apache::londefdef::table[-1]{'forcedtablewidth'} = 1;
}
@@ -1958,7 +1990,12 @@ sub start_table {
$Apache::londefdef::table[-1]{'width'}=$1*$textwidth/100;
} else {
$Apache::londefdef::table[-1]{'width'}=$TeXwidth;
- }
+ }
+ # In the end, however the table width cannot be wider than $textwidth...
+
+ if ($Apache::londefdef::table[-1]{'width'} > $textwidth) {
+ $Apache::londefdef::table[-1]{'width'} = $textwidth;
+ }
#table's border
my $border = &Apache::lonxml::get_param('border',$parstack,$safeeval);
@@ -1987,9 +2024,7 @@ sub start_table {
$Apache::londefdef::table[-1]{'content'}=[];
$Apache::londefdef::table[-1]{'align'}=[];
$currentstring.='\keephidden{NEW TABLE ENTRY}';
- &Apache::lonnet::logthis("------ start-table------");
- &debug_dump_table;
- &Apache::lonnet::logthis("-------start-table------");
+
}
return $currentstring;
@@ -2005,8 +2040,6 @@ sub end_table {
my $output = '';
my $WARNING='';
#width of columns from TeXwidth attributes
- &Apache::lonnet::logthis("----------------end_table-----------------");
- &debug_dump_table;
for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {
for (my $jn=0;$jn<=$Apache::londefdef::table[-1]{'counter_columns'};$jn++) {
@@ -2190,30 +2223,88 @@ sub end_table {
$header_of_table .= '}';
#fill the table
for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {
+ my $have_rowspan = 0;
for (my $jn=0;$jn<=$#fwidth;$jn++) {
+
+ #-----------------------------------------------------------
+ # I think this order of doing things will ensure that
+ # single rowspan, columspan and combined row/colspans will
+ # work correctly. LaTeX is delicate here.
+ # RF.
+
+ # Start a rowspan if necessary:
+
+ my $rowspan = $Apache::londefdef::table[-1]{'rowspan'}[$in][$jn];
+ my $colspan = $Apache::londefdef::table[-1]{'colspan'}[$in][$jn];
+ #
+ # Do the appropriate magic if this has a colspan
+ #
+
+ if ($colspan > 1) {
+ $output .= '\multicolumn{'.
+ $colspan
+ .'}{|l|}{';
+ }
+
+ if ($rowspan > 1) {
+ $have_rowspan++;
+ $output .= '\multirow{'.$rowspan.'}[0]{'.$fwidth[$jn].'mm}{';
+ }
+ if (($rowspan eq '^') || ($rowspan eq '_')) {
+ $have_rowspan++;
+ }
+ #--------------------------------------------------------------
+
if ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'c') {
- # $output.='\vspace*{-6 mm}\begin{center}';
- $output.='\begin{center}';
+ $output.=¢er_correction().'\begin{center}';
} elsif ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'r') {
$output.=' \hfill \llap{'
}
$output.=$Apache::londefdef::table[-1]{'content'}[$in][$jn];
if ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'c') {
- # $output.='\end{center}\vspace*{-6 mm}';
$output.='\end{center}';
} elsif ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'r') {
$output.='} ';
}
+ # Close off any open multirow:
+
+ if ($rowspan > 1) {
+ $output .= '}';
+ }
+ # Close off the colspan...
+ #
+ if ($colspan > 1) {
+ $output .= '}';
+ $jn += $colspan-1; # Adjust for number of rows really left.
+ }
if ($jn!=$#fwidth) {$output.=' '.$Apache::londefdef::table[-1]{'vinc'};}
}
- $output.=' \\\\ '.$Apache::londefdef::table[-1]{'hinc'}.' ';
+ # If have_rowspan > 0, and borders are on, then
+ # we need to do more than put an \hline at the bottom of row.
+ # we need to do the appropriate \cline to ensure that
+ # the spanned rows don't have \hlines through them.
+
+ if (($Apache::londefdef::table[-1]{'hinc'} =~ /\\hline/) && $have_rowspan) {
+ $output .= ' \\\\ ';
+ for (my $jn=0; $jn<=$#fwidth;$jn++) {
+ my $rowspan = $Apache::londefdef::table[-1]{'rowspan'}[$in][$jn];
+ if ($rowspan ne "^") {
+ if (($rowspan <= 1) || ($rowspan eq '_')) {
+ my $column = $jn+1;
+ $output .= '\cline{'.$column.'-'.$column.'} ';
+ }
+ }
+ }
+
+ } else {
+ $output.=' \\\\ '.$Apache::londefdef::table[-1]{'hinc'}.' ';
+ }
}
# Note that \newline destroys alignment env's produced by e.g.
# $Apache::londefdef::table[-1]{'output'} .= $header_of_table.$Apache::londefdef::table[-1]{'hinc'}.$output.'\end{tabular}\strut\newline\strut ';
$Apache::londefdef::table[-1]{'output'} .= $header_of_table.$Apache::londefdef::table[-1]{'hinc'}.$output.'\end{tabular}\strut'.'\\\\'."\n".'\strut ';
if ($#Apache::londefdef::table > 0) {
my $inmemory = $Apache::londefdef::table[-1]{'output'};
- &Apache::lonnet::logthis("--- popping nested table --");
# Figure out max/and min width by summing us and then
# apply that to the current column of the table we nest in
# if it's larger than the current width or the current width
@@ -2222,20 +2313,17 @@ sub end_table {
my $min_nested_width = 0;
my $max_nested_width = 0;
for (my $col = 0; $col <= $Apache::londefdef::table[-1]{'counter_columns'}; $col++) {
-
$min_nested_width += $min_len[$col];
$max_nested_width += $max_len[$col];
+
}
# Fudge in an extra 5 mm for borders etc:
$min_nested_width += 5;
$max_nested_width += 5;
- &Apache::lonnet::logthis("Nested min: $min_nested_width");
- &Apache::lonnet::logthis("Nested max: $max_nested_width");
my $outer_column = $Apache::londefdef::table[-2]{'counter_columns'};
my $outer_row = $Apache::londefdef::table[-2]{'row_number'};
- &Apache::lonnet::logthis("Outer row/column: $outer_row : $outer_column");
if ($min_nested_width > $Apache::londefdef::table[-2]{'minlen'}[$outer_row][$outer_column]) {
$Apache::londefdef::table[-2]{'minlen'}[$outer_row][$outer_column] = $min_nested_width;
}
@@ -2250,9 +2338,6 @@ sub end_table {
pop @Apache::londefdef::table;
undef @Apache::londefdef::table;
}
- &debug_dump_table;
- &Apache::lonnet::logthis("---------end table------");
-
}
return $currentstring;
}
@@ -2264,7 +2349,6 @@ sub start_tr {
if ($target eq 'web') {
$currentstring = $token->[4];
} elsif ($target eq 'tex') {
- &Apache::lonnet::logthis("--------------start-tr----------");
$Apache::londefdef::table[-1]{'row_number'}++;
my $alignchar=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
if ($alignchar ne '') {
@@ -2273,14 +2357,16 @@ sub start_tr {
push @ {$Apache::londefdef::table[-1]{'rows'} }, 'l';
}
push ( @{ $Apache::londefdef::table[-1]{'rowdata'} }, $Apache::londefdef::table[-1]{'hinc'});
+ #
+ # Need to save the number of table columns to preserve the max # columns.
+ #
+ $Apache::londefdef::table[-1]{'prior_columns'} = $Apache::londefdef::table[-1]{'counter_columns'};
$Apache::londefdef::table[-1]{'counter_columns'} = -1;
push @ {$Apache::londefdef::table[-1]{'TeXlen'}}, [];
push @ {$Apache::londefdef::table[-1]{'objectlen'}}, [];
push @ {$Apache::londefdef::table[-1]{'minlen'}}, [];
push @ {$Apache::londefdef::table[-1]{'maxlen'}}, [];
push @ {$Apache::londefdef::table[-1]{'content'}}, [];
- &debug_dump_table;
- &Apache::lonnet::logthis("------------start-tr-----------");
}
return $currentstring;
}
@@ -2291,12 +2377,16 @@ sub end_tr {
if ($target eq 'web') {
$currentstring .= $token->[2];
} elsif ($target eq 'tex') {
- &Apache::lonnet::logthis("-------end-tr-----");
if ($Apache::londefdef::TD_redirection) {
&end_td_tex($parstack,$parser,$safeeval);
}
- &debug_dump_table;
- &Apache::lonnet::logthis("------end-tr------");
+ # Counter columns must be the maximum number of columns seen
+ # in the table so far so:
+ if ($Apache::londefdef::table[-1]{'prior_columns'} > $Apache::londefdef::table[-1]{'counter_columns'}) {
+ $Apache::londefdef::table[-1]{'counter_columns'} = $Apache::londefdef::table[-1]{'prior_columns'};
+ }
+
+
}
return $currentstring;
@@ -2309,11 +2399,8 @@ sub start_td {
if ($target eq 'web') {
$currentstring = $token->[4];
} elsif ($target eq 'tex') {
- &Apache::lonnet::logthis("------start-td----");
$Apache::londefdef::TD_redirection = 1;
&tag_check('tr','td',$tagstack,$parstack,$parser,$safeeval);
- &debug_dump_table;
- &Apache::lonnet::logthis("-----start-td-----");
}
return $currentstring;
}
@@ -2355,8 +2442,51 @@ sub start_td_tex {
sub end_td_tex {
my ($parstack,$parser,$safeeval) = @_;
- my $current_row = $Apache::londefdef::table[-1]{'row_number'};
- my $data=&Apache::lonxml::endredirection();
+ my $current_row = $Apache::londefdef::table[-1]{'row_number'};
+ my $current_column = $Apache::londefdef::table[-1]{'counter_columns'};
+ my $data = &Apache::lonxml::endredirection();
+
+ # The rowspan array of the table indicates which cells are part of a span.
+ # n indicates the start of a span set of n rows.
+ # ^ indicates a cell that continues a span set.
+ # _ indicates the cell is at the bottom of a span set.
+ # If this and subsequent cells are part of a rowspan, we must
+ # push along the row until we find one that is not.
+
+ while ((defined $Apache::londefdef::table[-1]{'rowspan'}[$current_row] [$current_column])
+ && ($Apache::londefdef::table[-1]{'rowspan'}[$current_row][$current_column] =~ /[\^\_]/)) {
+ # Part of a span.
+ push @ {$Apache::londefdef::table[-1]{'content'}[-1]}, '';
+ $current_column++;
+ }
+ $Apache::londefdef::table[-1]{'counter_columns'} = $current_column;
+
+
+ # Get the column and row spans.
+ # Colspan can be done via \multicolumn if I can figure out the data structs.
+
+ my $colspan = &Apache::lonxml::get_param('colspan', $parstack, $safeeval, undef, 0);
+ if (!$colspan) {
+ $colspan = 1;
+ }
+
+ my $rowspan = &Apache::lonxml::get_param('rowspan', $parstack, $safeeval, undef, 0);
+ if (!$rowspan) {
+ $rowspan = 1;
+ }
+
+
+
+ for (my $c = 0; $c < $colspan; $c++) {
+ $Apache::londefdef::table[-1]{'rowspan'}[$current_row][$current_column+$c] = $rowspan;
+ for (my $i = 1; $i < $rowspan; $i++) {
+ $Apache::londefdef::table[-1]{'rowspan'}[$current_row+$i][$current_column+$c] = '^';
+ if ($i == ($rowspan-1)) {
+ $Apache::londefdef::table[-1]{'rowspan'}[$current_row+$i][$current_column+$c] = '_';
+ }
+ }
+ }
+
my $TeXwidth=&Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0);
if (defined $TeXwidth) {
push @ {$Apache::londefdef::table[-1]{'objectlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
@@ -2433,11 +2563,43 @@ sub end_td_tex {
push @ {$Apache::londefdef::table[-1]{'minlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$min_length;
}
}
- for (my $in=0; $in<=$#{$Apache::londefdef::table[-1]{'include'}};$in++) {
- $data=~s/\\keephidden\{NEW TABLE ENTRY\}/$Apache::londefdef::table[-1]{'include'}[$in] \&/;
- }
+ # Substitute all of the tables nested in this cell in their appropriate places.
+
+
+ my $nested_count = $#{$Apache::londefdef::table[-1]{'include'}}; # This one is constant...
+ for (my $in=0; $in<=$nested_count; $in++) {
+ my $nested = shift @{$Apache::londefdef::table[-1]{'include'}};
+ $nested =~ s/\\end\{tabular\}\\strut\\\\/\\end\{tabular\}/;
+ # $data=~s/\\keephidden\{NEW TABLE ENTRY\}/$Apache::londefdef::table[-1]{'include'}[$in]/;
+ $data =~ s/\\keephidden\{NEW TABLE ENTRY\}/$nested/;
+
+ }
+ # Should be be killing off the 'include' elements as they're used up?
+
push @ {$Apache::londefdef::table[-1]{'content'}[-1] },$data;
- return'';
+
+
+
+
+ # the colspan array will indicate how many columns will be spanned by this
+ # cell..this requires that counter_columns also be adjusted accordingly
+ # so that the next bunch of text goes in the right cell. Note that since
+ # counter_columns is incremented in the start_td_tex, we adjust by colspan-1.
+ #
+
+ $Apache::londefdef::table[-1]{'counter_columns'} += $colspan -1;
+ for (my $i = 0; $i < ($colspan -1); $i++) {
+ push @ {$Apache::londefdef::table[-1]{'content'}[-1] },'';
+ }
+ for (my $r = 0; $r < $rowspan; $r++) {
+ $Apache::londefdef::table[-1]{'colspan'}[$current_row+$r][$current_column] = $colspan;
+ # Put empty text in spanned cols.
+
+ }
+
+
+
+ return '';
}
sub end_td {
@@ -2446,11 +2608,8 @@ sub end_td {
if ($target eq 'web') {
$currentstring = $token->[2];
} elsif ($target eq 'tex') {
- &Apache::lonnet::logthis("--------end_td-----");
$Apache::londefdef::TD_redirection =0;
&end_td_tex($parstack,$parser,$safeeval);
- &debug_dump_table;
- &Apache::lonnet::logthis("--------end-td----");
}
return $currentstring;
}
@@ -2596,11 +2755,11 @@ sub end_th {
# (Note there seems to also be support for this as a % of page size)
#
sub start_img {
- my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
+ my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
my $src = &Apache::lonxml::get_param('src',$parstack,$safeeval,
undef,1);
if (not $src and ($target eq 'web' or $target eq 'tex')) {
- my $inside = &Apache::lonxml::get_all_text("/img",$parser);
+ my $inside = &Apache::lonxml::get_all_text("/img",$parser,$style);
return '';
}
&Apache::lonxml::extlink($src);
@@ -2611,13 +2770,17 @@ sub start_img {
if ($target eq 'web') {
if ($env{'browser.imagesuppress'} ne 'on') {
- $currentstring.=&Apache::lonenc::encrypt_ref($token,{'src'=>$src});
- } else {
- my $alttag= &Apache::lonxml::get_param
- ('alt',$parstack,$safeeval,undef,1);
- unless ($alttag) {
- $alttag=&Apache::lonmeta::alttag
- ($Apache::lonxml::pwd[-1],$src);
+ my $enc = ('yes' eq
+ lc(&Apache::lonxml::get_param('encrypturl',$parstack,
+ $safeeval)));
+ $currentstring.=&Apache::lonenc::encrypt_ref($token,{'src'=>$src},
+ $enc);
+ } else {
+ my $alttag = &Apache::lonxml::get_param('alt',$parstack,$safeeval,
+ undef,1);
+ if (!$alttag) {
+ $alttag = &Apache::lonmeta::alttag($Apache::lonxml::pwd[-1],
+ $src);
}
$currentstring.='[IMAGE: '.$alttag.']';
}
@@ -2636,11 +2799,7 @@ sub start_img {
$safeeval,
undef,1));
if(!$align) {
- if (&is_inside_of($tagstack, "table")) {
- $align = "right"; # Force wraptext use.
- } else {
$align = "bottom"; # This is html's default so it's ours too.
- }
}
#
&Apache::lonxml::debug("Alignemnt = $align");
@@ -2655,11 +2814,17 @@ sub start_img {
$parstack,
$safeeval,
undef,0);
- &Apache::lonxml::debug("LaTeX rendering = $latex_rendering");
+ # &Apache::lonxml::debug("LaTeX rendering = $latex_rendering");
if(!$latex_rendering) {
- $latex_rendering = "texwrap";
+ $latex_rendering = "texwrap";
+ }
+ # using texwrap inside a table does not work. So, if after all of this,
+ # texwrap is on, we turn it off if we detect we're in a table:
+ #
+ if (($latex_rendering eq 'texwrap') && &is_inside_of($tagstack, "table")) {
+ $latex_rendering = 'parpic';
}
- &Apache::lonxml::debug("LaTeX rendering = $latex_rendering image file: $src");
+ # &Apache::lonxml::debug("LaTeX rendering = $latex_rendering image file: $src");
#if original gif/jpg/png file exist do following:
my $origsrc=$src;
@@ -2741,6 +2906,8 @@ sub start_img {
['','bottom','middle','top','left','right'],$token,5);
$currentstring .=&Apache::edit::select_arg('TeXwrap:', 'TeXwrap',
['', 'parbox', 'parpic'], $token, 2);
+ $currentstring .=&Apache::edit::select_arg('Encyrpt URL:','encrypturl',
+ ['no','yes'], $token, 2);
$currentstring .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
my $src= &Apache::lonxml::get_param('src',$parstack,$safeeval);
my $alt= &Apache::lonxml::get_param('alt',$parstack,$safeeval);
@@ -2758,7 +2925,7 @@ sub start_img {
my $ctag=&Apache::edit::get_new_args($token,$parstack,
$safeeval,'src','alt','align',
'TeXwidth','TeXheight', 'TeXwrap',
- 'width','height');
+ 'width','height','encrypturl');
my ($nsrc,$nwidth,$nheight)=
($token->[2]{'src'},$token->[2]{'width'},$token->[2]{'height'});
my $loc=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$nsrc);
@@ -3033,6 +3200,7 @@ sub start_pre {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
$currentstring .= '\begin{verbatim}';
+ &Apache::lonxml::disable_LaTeX_substitutions();
}
return $currentstring;
}
@@ -3044,6 +3212,7 @@ sub end_pre {
$currentstring .= $token->[2];
} elsif ($target eq 'tex') {
$currentstring .= '\end{verbatim}';
+ &Apache::lonxml::enable_LaTeX_substitutions();
}
return $currentstring;
}