--- loncom/xml/londefdef.pm 2002/05/09 18:55:47 1.58 +++ loncom/xml/londefdef.pm 2002/07/31 14:55:56 1.80 @@ -1,8 +1,7 @@ - # The LearningOnline Network with CAPA # Tags Default Definition Module # -# $Id: londefdef.pm,v 1.58 2002/05/09 18:55:47 sakharuk Exp $ +# $Id: londefdef.pm,v 1.80 2002/07/31 14:55:56 sakharuk Exp $ # # # Copyright Michigan State University Board of Trustees @@ -49,10 +48,11 @@ use Apache::lonnet; use strict; use Apache::lonxml; use Apache::File(); +use Image::Magick; BEGIN { - &Apache::lonxml::register('Apache::londefdef',('m','html','head','map','select','option','input','textarea','form','meta','title','body','center','b','strong','dt','h1','h2','h3','h4','h5','h6','cite','i','address','dd','dl','dir','ol','ul','menu','dfn','kbd','tt','code','em','q','p','br','big','small','basefont','font','s','sub','strike','sup','hr','a','li','u','output','param','applet','img','embed','allow','frameset','pre','insert','externallink','table','tr','td')); + &Apache::lonxml::register('Apache::londefdef',('m','html','head','map','select','option','input','textarea','form','meta','title','body','center','b','strong','dt','h1','h2','h3','h4','h5','h6','cite','i','address','dd','dl','dir','ol','ul','menu','dfn','kbd','tt','code','em','q','p','br','big','small','basefont','font','s','sub','strike','sup','hr','a','li','u','output','param','applet','img','embed','allow','frameset','pre','insert','externallink','table','tr','th','td','blankspace','bubble','bubbles','bubbleline')); } @@ -73,7 +73,8 @@ sub start_m { my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { - my $inside = &Apache::lonxml::get_all_text("/m",$$parser[-1]); + $Apache::lonxml::prevent_entity_encode++; + my $inside = &Apache::lonxml::get_all_text_unbalanced("/m",$parser); $inside ='\\documentstyle{article}'.$inside; &Apache::lonxml::debug("M is starting with:$inside:"); my $eval=&Apache::lonxml::get_param('eval',$parstack,$safeeval); @@ -89,7 +90,10 @@ sub start_m { } #&Apache::lonxml::debug("M is ends with:$currentstring:"); } elsif ($target eq 'tex') { - $currentstring = ""; + $currentstring = &Apache::lonxml::get_all_text_unbalanced("/m",$parser); + if ($currentstring=~/\s*\\\\\s*/) {$currentstring = ' \vskip 0 mm ';} + } else { + my $inside = &Apache::lonxml::get_all_text_unbalanced("/m",$parser); } return $currentstring; } @@ -97,6 +101,7 @@ sub end_m { my ($target,$token) = @_; my $currentstring = ''; if ($target eq 'web') { + $Apache::lonxml::prevent_entity_encode--; } elsif ($target eq 'tex') { $currentstring = ""; } elsif ($target eq 'meta') { @@ -118,9 +123,10 @@ sub end_m { } elsif ($target eq 'tex') { @Apache::londefdef::table = (); $currentstring .= '\documentclass[letterpaper]{article} - \newcommand{\keephidden}[1]{} + \newcommand{\keephidden}[1]{} + \renewcommand{\deg}{$^{\circ}$} \usepackage[dvips]{graphicx} - \usepackage{epsfig}'; + \usepackage{epsfig}\usepackage{calc}'; } return $currentstring; } @@ -833,12 +839,14 @@ EDITBUTTON } #--
tag sub start_br { - my ($target,$token) = @_; + my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; my $currentstring = ''; if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { - $currentstring .= '\\\\'; + if ($$tagstack[-2] ne 'sub' && $$tagstack[-2] ne 'sup') { + $currentstring .= '\vskip 0 mm'; + } } elsif ($target eq 'latexsource') { $currentstring .= '\\'; } @@ -921,17 +929,21 @@ EDITBUTTON } #-- tag sub start_font { - my ($target,$token) = @_; + my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; my $currentstring = ''; if ($target eq 'web') { + my $face=&Apache::lonxml::get_param('face',$parstack,$safeeval); + if ($face=~/symbol/i) {$Apache::lonxml::prevent_entity_encode++;} $currentstring = $token->[4]; } return $currentstring; } sub end_font { - my ($target,$token) = @_; + my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; my $currentstring = ''; if ($target eq 'web') { + my $face=&Apache::lonxml::get_param('face',$parstack,$safeeval); + if ($face=~/symbol/i) {$Apache::lonxml::prevent_entity_encode--;} $currentstring = $token->[2]; } return $currentstring; @@ -943,7 +955,7 @@ EDITBUTTON if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { - $currentstring .= "{\\underline "; + $currentstring .= '\underline{'; } return $currentstring; } @@ -953,7 +965,7 @@ EDITBUTTON if ($target eq 'web') { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { - $currentstring .= " }"; + $currentstring .= '}'; } return $currentstring; } @@ -964,7 +976,7 @@ EDITBUTTON if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { - $currentstring .= "{\\underline "; + $currentstring .= '\underline{'; } return $currentstring; } @@ -974,7 +986,7 @@ EDITBUTTON if ($target eq 'web') { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { - $currentstring .= " }"; + $currentstring .= '}'; } return $currentstring; } @@ -1027,7 +1039,7 @@ EDITBUTTON if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { - $currentstring .= "\\hline "; + $currentstring .= '\vskip 0 mm \noindent\makebox[\textwidth - 8 mm][b]{\hrulefill}'; } return $currentstring; } @@ -1104,7 +1116,7 @@ EDITBUTTON if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { - $currentstring .= "{\\underline "; + $currentstring .= '\underline{'; } return $currentstring; } @@ -1114,7 +1126,7 @@ EDITBUTTON if ($target eq 'web') { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { - $currentstring .= " }"; + $currentstring .= '}'; } return $currentstring; } @@ -1271,7 +1283,7 @@ EDITBUTTON my $aa = {}; push @Apache::londefdef::table, $aa; $Apache::londefdef::table[-1]{'row_number'} = -1; - $Apache::londefdef::table[-1]{'output'} = '\begin{tabular} '; + $Apache::londefdef::table[-1]{'output'} = ' \noindent \begin{tabular} '; my $border = &Apache::lonxml::get_param('border',$parstack,$safeeval); unless (defined $border) { $border = 0; } if ($border) { @@ -1280,32 +1292,111 @@ EDITBUTTON $Apache::londefdef::table[-1]{'vvinc'} = '|'; } else { $Apache::londefdef::table[-1]{'hinc'} = ''; - $Apache::londefdef::table[-1]{'vinc'} = ''; + $Apache::londefdef::table[-1]{'vinc'} = '&'; $Apache::londefdef::table[-1]{'vvinc'} = ''; } } return $currentstring; } sub end_table { - my ($target,$token) = @_; + my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; my $currentstring = ''; if ($target eq 'web') { $currentstring = $token->[2]; } elsif ($target eq 'tex') { my $inmemory = ''; my $output = ''; + #construct header of the table my $header_of_table = '{'.$Apache::londefdef::table[-1]{'vvinc'}; my $in; for ($in=0;$in<=$Apache::londefdef::table[-1]{'counter_columns'};$in++) { $header_of_table .= $Apache::londefdef::table[-1]{'columns'}[$in].$Apache::londefdef::table[-1]{'vvinc'}; } $header_of_table .= '}'; + #fill the table for ($in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) { $output .= $Apache::londefdef::table[-1]{'rowdata'}[$in]; chop $output; $output .= ' \\\\ '; } - $Apache::londefdef::table[-1]{'output'} .= $header_of_table.$output.$Apache::londefdef::table[-1]{'hinc'}.'\end{tabular}'; + #define the length of the table cells + my @lengthforoutput = split(/,/,$Apache::londefdef::table[-1]{'lengthrow'}[0]); + my $how_many_columns = $#lengthforoutput + 1; + my $filled_columns = 0; + foreach my $tempo_length (@{ $Apache::londefdef::table[-1]{'lengthrow'} }) { + my @length = split(/,/,$tempo_length); + for (my $ico=0;$ico<$how_many_columns;$ico++) { + if (not $lengthforoutput[$ico]=~m/\s*0\s*/) {$filled_columns++;} + } + } + my $temp_file; + my $filename = "/home/httpd/prtspool/$ENV{'user.name'}_$ENV{'user.domain'}_printout.tbl"; + if (-e $filename) { + $temp_file = Apache::File->new($filename); + my @tbl_file_content = <$temp_file>; + my ($one,$two) = split(/,/,$tbl_file_content[0]); + $how_many_columns+=$one-1; + $filled_columns+=$two; + } else { + $temp_file = Apache::File->new('>>'.$filename); + } + print $temp_file "$how_many_columns,$filled_columns\n"; + foreach my $tempo_length (@{ $Apache::londefdef::table[-1]{'lengthrow'} }) { + my @length = split(/,/,$tempo_length); + for (my $ico=0;$ico<=$#lengthforoutput;$ico++) { + $lengthforoutput[$ico] =~ m/(\d*\.?\d*)\s*(\w+)/; + my $old_value = $1; + my $old_unit = $2; + if ($old_unit eq 'cm') { + $old_value = $old_value * 10; + } elsif ($old_unit eq 'in') { + $old_value = $old_value * 25.4; + } elsif ($old_unit eq 'pt') { + $old_value = $old_value * 25.4/72.27; + } elsif ($old_unit eq 'pc') { + $old_value = $old_value * 25.4/6.022; + } + $old_unit = 'mm'; + $length[$ico] =~ m/(\d*\.?\d*)\s*(\w+)/; + my $new_value = $1; + my $new_unit = $2; + if ($new_unit eq 'cm') { + $new_value = $new_value * 10; + } elsif ($old_unit eq 'in') { + $new_value = $new_value * 25.4; + } elsif ($old_unit eq 'pt') { + $new_value = $new_value * 25.4/72.27; + } elsif ($old_unit eq 'pc') { + $new_value = $new_value * 25.4/6.022; + } + $new_unit = 'mm'; + if ($old_value < $new_value) { + $lengthforoutput[$ico] = $new_value.' mm'; + } else { + $lengthforoutput[$ico] = $old_value.' mm'; + } + } + } + my $parboxlength = '(\textwidth'; + for (my $io=0; $io<=$#lengthforoutput;$io++) { + $parboxlength .= ' - '.$lengthforoutput[$io].' '; + } + $parboxlength .= ')/($GLOBALnumberOFcolumns+1) - 1 mm'; + $output =~ s/\\parbox{}{}/\\parbox{1 mm}{}/g; + $output =~ s/\\parbox{}{(\\textbf{\w?\.?})}/\\parbox{5 mm}{$1}/g; #for stupid tables with empty columns + $output =~ s/\\parbox{}/\\parbox{$parboxlength}/g; + my ($howmanyatall,$howmanyfilled) = (0,0); + + my @tagar = @$tagstack; + my $signature = 1; + for (my $ico=0;$ico<$#tagar;$ico++) { + if ($tagar[$ico] eq 'table') { $signature = 0; } + } + if ($signature) { + my $totalnumber = $how_many_columns-$filled_columns-1; + $output =~ s/\$GLOBALnumberOFcolumns/$totalnumber/g; + } + $Apache::londefdef::table[-1]{'output'} .= $header_of_table.$output.$Apache::londefdef::table[-1]{'hinc'}.'\end{tabular}\vskip 0 mm '; if ($#Apache::londefdef::table > 0) { $inmemory = $Apache::londefdef::table[-1]{'output'}; pop @Apache::londefdef::table; @@ -1330,11 +1421,11 @@ EDITBUTTON if ($alignchar ne '') { push @ {$Apache::londefdef::table[-1]{'rows'} }, $alignchar; } else { - push @ {$Apache::londefdef::table[-1]{'rows'} }, 'c'; + push @ {$Apache::londefdef::table[-1]{'rows'} }, 'l'; } push ( @{ $Apache::londefdef::table[-1]{'rowdata'} }, $Apache::londefdef::table[-1]{'hinc'}); $Apache::londefdef::table[-1]{'counter_columns'} = -1; - + $Apache::londefdef::table[-1]{'length'} = ''; } return $currentstring; } @@ -1344,7 +1435,9 @@ EDITBUTTON if ($target eq 'web') { $currentstring = $token->[2]; } elsif ($target eq 'tex') { -# $currentstring .= ' START ROW '. $Apache::londefdef::table[-1]{'rowdata'}[$Apache::londefdef::table[-1]{'row_number'}].' END ROW '; +# $currentstring .= ' START ROW '. $Apache::londefdef::table[-1]{'rowdata'}[$Apache::londefdef::table[-1]{'row_number'}].' END ROW '; + push @{ $Apache::londefdef::table[-1]{'lengthrow'} },$Apache::londefdef::table[-1]{'length'}; + } return $currentstring; } @@ -1374,7 +1467,47 @@ EDITBUTTON } elsif ($target eq 'tex') { my $current_row = $Apache::londefdef::table[-1]{'row_number'}; my $data=&Apache::lonxml::endredirection(); - @{ $Apache::londefdef::table[-1]{'rowdata'} }[$current_row] .= $data.' '.$Apache::londefdef::table[-1]{'vinc'}; + if ($data=~m/width\s*=\s*(\d+\.*\d*\s*(mm|cm))/) { + $Apache::londefdef::table[-1]{'length'} .= $1.','; + } else { + $Apache::londefdef::table[-1]{'length'} .= '0 mm,'; + } + @{ $Apache::londefdef::table[-1]{'rowdata'} }[$current_row] .= '\parbox{'.$1.'}{'.$data.'} '.$Apache::londefdef::table[-1]{'vinc'}; + } + return $currentstring; + } +#-- tag + sub start_th { + my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; + my $currentstring = ''; + if ($target eq 'web') { + $currentstring = $token->[4]; + } elsif ($target eq 'tex') { + my $what_to_push = substr(&Apache::lonxml::get_param('align',$parstack,$safeeval),0,1); + if ($what_to_push eq '') { + $what_to_push = substr($Apache::londefdef::table[-1]{'rows'}[0],0,1);; + } + push @{ $Apache::londefdef::table[-1]{'columns'} }, $what_to_push; + $Apache::londefdef::table[-1]{'counter_columns'}++; + &Apache::lonxml::startredirection(); +; + } + return $currentstring; + } + sub end_th { + my ($target,$token) = @_; + my $currentstring = ''; + if ($target eq 'web') { + $currentstring = $token->[2]; + } elsif ($target eq 'tex') { + my $current_row = $Apache::londefdef::table[-1]{'row_number'}; + my $data=&Apache::lonxml::endredirection(); + if ($data=~m/width\s*=\s*(\d+\.*\d*\s*(mm|cm))/) { + $Apache::londefdef::table[-1]{'length'} .= $1.','; + } else { + $Apache::londefdef::table[-1]{'length'} .= '0 mm,'; + } + @{ $Apache::londefdef::table[-1]{'rowdata'} }[$current_row] .= '\parbox{'.$1.'}{\textbf{'.$data.'}} '.$Apache::londefdef::table[-1]{'vinc'}; } return $currentstring; } @@ -1385,48 +1518,88 @@ EDITBUTTON $token->[2]->{'src'}; my $currentstring = ''; my $width_param = ''; + my $height_param = ''; + my $scaling = .3; if ($target eq 'web') { $currentstring = $token->[4]; } elsif ($target eq 'tex') { - my $TeXwidth = &Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval); - my $TeXheight = &Apache::lonxml::get_param('TeXheight',$parstack,$safeeval); - my $width = &Apache::lonxml::get_param('width',$parstack,$safeeval); - if ($TeXwidth ne '') { - $width_param = $TeXwidth; - } elsif ($TeXheight ne '') { - $width_param = $TeXheight; - } else { - if ($width ne '') { - $width_param = $width*.3; - if ($width_param <= 900) { - $width_param = '[width='.$width_param.'mm]'; + my $src = &Apache::lonxml::get_param('src',$parstack,$safeeval); + $src=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src); + if (-e $src) { #new one + my $image = Image::Magick->new; + my $current_figure = $image->Read($src); + $width_param = $image->Get('width') * $scaling;; + $height_param = $image->Get('height') * $scaling;; + undef $image; + my $epssrc = $src; + $epssrc =~ s/(\.gif|\.jpg)$/\.eps/i; + if (not -e $epssrc) { + my $localfile = $epssrc; + $localfile =~ s/.*(\/res)/$1/; + my $file; + my $path; + if ($localfile =~ m!(.*)/([^/]*)$!) { + $file = $2; + $path = $1.'/'; + } + my $signal_eps = 0; + my @content_directory = &Apache::lonnet::dirlist($path); + for (my $iy=0;$iy<=$#content_directory;$iy++) { + my @tempo_array = split(/&/,$content_directory[$iy]); + $content_directory[$iy] = $tempo_array[0]; + if ($file eq $tempo_array[0]) { + $signal_eps = 1; + last; + } + } + if ($signal_eps) { + my $eps_file = &Apache::lonnet::getfile($localfile); } else { - $width_param = '[width= 9.0 cm]'; + $localfile = $src; + $localfile =~ s/.*(\/res)/$1/; + my $as = &Apache::lonnet::getfile($src); } } - } - my $src = &Apache::lonxml::get_param('src',$parstack,$safeeval); - $src=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src); - my $file; - my $path; - if ($src =~ m!(.*)/([^/]*)$!) { - $file = $2; - $path = $1.'/'; - } - my $newsrc = $src; - $newsrc =~ s/(\.gif|\.jpg)$/\.eps/; - $file=~s/(\.gif|\.jpg)$/\.eps/; - if (-e $newsrc) { - if ($path) { - $currentstring .= '\graphicspath{{'.$path.'}}\fbox{\includegraphics'.$width_param.'{'.$file.'}}'; + my $file; + my $path; + if ($src =~ m!(.*)/([^/]*)$!) { + $file = $2; + $path = $1.' /'; + } + my $newsrc = $src; + $newsrc =~ s/(\.gif|\.jpg)$/\.eps/i; + $file=~s/(\.gif|\.jpg)$/\.eps/i; + #do we have any specified size of the picture? + my $TeXwidth = &Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval); + my $TeXheight = &Apache::lonxml::get_param('TeXheight',$parstack,$safeeval); + my $width = &Apache::lonxml::get_param('width',$parstack,$safeeval); + if ($TeXwidth ne '') { + $width_param = $TeXwidth; + } elsif ($TeXheight ne '') { + $width_param = $TeXheight/$height_param*$width_param; + } elsif ($width ne '') { + $width_param = $width*$scaling; + } + #where can we find the picture? + if (-e $newsrc) { + if ($path) { + $currentstring .= '\noindent\graphicspath{{'.$path.'}}\fbox{\includegraphics[width='.$width_param.' mm]{'.$file.'}} '; + } + } else { + my $temp_file; + my $filename = "/home/httpd/prtspool/$ENV{'user.name'}_$ENV{'user.domain'}_printout.dat"; + $temp_file = Apache::File->new('>>'.$filename); + print $temp_file "$src\n"; + $currentstring .= '\graphicspath{{/home/httpd/prtspool/}}\fbox{\includegraphics[width='.$width_param.' mm]{'.$file.'}} '; } } else { - my $temp_file; - my $filename = "/home/httpd/prtspool/$ENV{'user.name'}$ENV{'user.domain'}temp$ENV{'user.login.time'}.dat"; - $temp_file = Apache::File->new('>>'.$filename); - print $temp_file "$src\n"; - $currentstring .= '\graphicspath{{/home/httpd/prtspool/}}\fbox{\includegraphics'.$width_param.'{'.$file.'}}'; + my $alt = &Apache::lonxml::get_param('alt',$parstack,$safeeval); + if ($alt) { + $currentstring .= ' '.$alt.' '; + } else { + $currentstring .= ' THE ORIGINAL PROBLEM CONTAINS EMPTY IMG TAG WITHOUT IMAGE '; + } } } return $currentstring; @@ -1613,5 +1786,24 @@ sub start_embed { } return $currentstring; } +#-- + sub start_blankspace { + my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_; + my $currentstring = ''; + if ($target eq 'tex') { + my $howmuch = &Apache::lonxml::get_param('heigth',$parstack,$safeeval); + $currentstring .= '\vskip '.$howmuch.' '; + } + return $currentstring; + } + sub end_blankspace { + my ($target,$token) = @_; + my $currentstring = ''; + if ($target eq 'tex') { + $currentstring .= ''; + } + return $currentstring; + } + 1; __END__ 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.